SyntaxEdit
COBOLilla on englanninkielinen syntaksi, jota käytetään kuvaamaan lähes kaikkea ohjelmassa. Esimerkiksi ehto voidaan ilmaista muodossa x ON SUUREMPI KUIN y
tai ytimekkäästi muodossa x SUUREMPI y
tai x > y
. Monimutkaisemmat olosuhteet voidaan ”lyhentää” poistamalla toistuvat olosuhteet ja muuttujat. Esimerkiksi a > b JA a > c TAI a = d
voidaan lyhentää muotoon a > b JA c OR = d
. Tämän englanninkielisen syntaksin tukemiseksi COBOLilla on yli 300 avainsanaa. Jotkut avainsanat ovat yksinkertaisia vaihtoehtoisia tai monitahoisia kirjoitusasuja samasta sanasta, mikä tarjoaa enemmän englanninkielisiä lauseita ja lausekkeita; esim. avainsanoja IN
ja OF
voidaan käyttää vaihdettavasti, samoin kuin IS
ja OVAT
ja ARVO
ja ARVOT
.
Jokainen COBOL-ohjelma koostuu neljästä leksikaalisesta perusyksiköstä: sanat, literaalit, kuva-merkkijonot (ks. lauseke) ja erottimet. Sanat sisältävät varatut sanat ja käyttäjän määrittelemät tunnisteet. Niissä on enintään 31 merkkiä, ja ne voivat sisältää kirjaimia, numeroita, väliviivoja ja alaviivoja. Literaalit sisältävät numeroita (esim. 12
) ja merkkijonoja (esim. "Hei!"
). Erottimet sisältävät välilyönnin sekä pilkut ja puolipisteet, joita seuraa välilyönti.
COBOL-ohjelma on jaettu neljään osastoon: tunnistusjako, ympäristöjako, datajako ja menettelyjako. Tunnistusjako määrittää lähde-elementin nimen ja tyypin ja missä luokat ja rajapinnat määritetään. Ympäristöjako määrittää kaikki ohjelman toiminnot, jotka riippuvat sitä käyttävästä järjestelmästä, kuten tiedostot ja merkistö. Datajakoa käytetään muuttujien ja parametrien ilmoittamiseen. Proseduurijako sisältää ohjelman lausekkeet. Jokainen jako on jaettu osiin, jotka koostuvat kappaleista.
MetalanguageEdit
COBOL: n syntaksia kuvataan yleensä ainutlaatuinen metakieli, jossa käytetään tukia, kiinnikkeitä, tankoja ja alleviivaa. Metakieli on kehitetty alkuperäisiä COBOL-määrityksiä varten. Vaikka Backus – Naur-muoto oli olemassa tuolloin, komitea ei ollut kuullut siitä.
Elementti | Ulkonäkö | Funktio |
---|---|---|
Kaikki isot kirjaimet | ESIMERKKI | Varattu sana |
Alleviivattu | ESIMERKKI | Varattu sana on pakollinen |
aaltosulkeet | {} | Vain yksi vaihtoehto voidaan valita |
Sulkeet | Nolla tai yksi vaihtoehto voidaan valita | |
Ellipsis | … | Edellinen elementti voidaan toistaa |
Pylväät | {| |} | Yksi tai useampi vaihtoehto voidaan valita. Mikä tahansa vaihtoehto voidaan valita vain kerran. |
Nollaa tai useampia vaihtoehtoja voidaan valita. Mikä tahansa vaihtoehto voidaan valita vain valittu kerran. |
Esimerkkinä consi johda seuraava kuvaus ADD
-lausekkeesta:
Tämä kuvaus sallii seuraavat muunnelmat:
ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"
Koodin muotoMuokkaa
COBOL voidaan kirjoittaa kahdessa muodossa: kiinteä (oletus) tai ilmainen. Kiinteässä muodossa koodi on kohdistettava tietyille alueille (lävistettyjen korttien käytön viivästyminen).COBOL 2002: een asti nämä olivat:
Nimi | sarake (s) | Käyttö |
---|---|---|
Järjestysnumeroalue | 1–6 | Alun perin käytetty kortille / rivinumero (helpottaa rei’itettyjen korttien lajittelua aiotun ohjelmakoodijakson varmistamiseksi manuaalisen muokkauksen / käsittelyn jälkeen), kääntäjä jättää tämän alueen huomiotta. |
Ilmaisinalue | 7 | Seuraavat merkit ovat sallittuja tässä:
|
Alue A | 8–11 | Tämä sisältää: DIVISION , SECTION ja menettelyn otsikot; 01- ja 77-tasonumerot sekä tiedosto- / raporttikuvaajat |
Alue B | 12–72 | Muut koodit, joita ei sallita alueella |
Ohjelman nimi-alue | 73– | Ristikorttien historiallisesti sarakkeeseen 80 asti sitä käytetään ohjelman tunnistamiseen tai järjestys, johon kortti kuuluu |
COBOL 2002: ssa alueet A ja B yhdistettiin muodostamaan ohjelma-teksti-alue, joka päättyy nyt toteuttajan määrittelemään sarakkeeseen.
COBOL 2002 esitteli myös vapaamuotoisen koodin. Vapaamuotoinen koodi voidaan sijoittaa mihin tahansa tiedoston sarakkeeseen, kuten uudemmilla ohjelmointikielillä. Kommentit määritetään käyttämällä *>
, joka voidaan sijoittaa mihin tahansa ja jota voidaan käyttää myös kiinteämuotoisessa lähdekoodissa. Jatkolinjoja ei ole, ja >>PAGE
-direktiivi korvaa ilmaisimen /
.
Identification DivisionEdit
Tunnistusjako identifioi seuraavan koodikokonaisuuden ja sisältää luokan tai käyttöliittymän määritelmän.
Objektikeskeinen programoinnin muokkaus
Luokat ja rajapinnat ovat olleet COBOLissa vuodesta 2002. Luokat on tehdasobjekteja, jotka sisältävät luokkamenetelmiä ja muuttujia, ja ilmentymäobjekteja, jotka sisältävät ilmentymämenetelmiä ja muuttujia. Perintö ja rajapinnat tarjoavat polymorfismin. Tuki yleiselle ohjelmoinnille tarjotaan parametrisoitujen luokkien kautta, jotka voidaan instantisoida käyttämään mitä tahansa luokkaa tai rajapintaa. Objektit tallennetaan viitteinä, jotka voidaan rajoittaa tiettyyn tyyppiin. Menetelmää voidaan kutsua kahdella tavalla: INVOKE
-lauseke, joka toimii samalla tavalla kuin CALL
tai inline-menetelmäkutsu, joka on analoginen toimintojen käyttämisen kanssa.
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOL ei tarjoa tapaa piilottaa menetelmiä. Luokkatiedot voidaan piilottaa ilmoittamalla ne ilman lauseketta PROPERTY
, joka jättää käyttäjälle mahdollisuuden käyttää sitä. Menetelmän ylikuormitus lisättiin COBOL 2014: een.
Environment DivisionEdit
Ympäristöjako sisältää kokoonpano-osan ja input-output-osan. Kokoonpano-osiota käytetään määrittämään muuttujan ominaisuudet, kuten valuuttamerkit, lokalit ja merkistö. Tulo-lähtö-osio sisältää tiedostoja koskevia tietoja.
FilesEdit
COBOL tukee kolmea tiedostomuotoa tai organisaatiota: peräkkäinen, indeksoitu ja suhteellinen. Peräkkäisissä tiedostoissa tietueet ovat vierekkäisiä, ja ne on kuljettava peräkkäin, samalla tavalla kuin linkitetty luettelo. Indeksoiduilla tiedostoilla on yksi tai useampi hakemisto, jonka avulla tietueita voidaan käyttää satunnaisesti ja jotka voidaan lajitella niihin. Jokaisella tietueella on oltava yksilöllinen avain, mutta muiden vaihtoehtoisten tietueiden ei tarvitse olla yksilöllisiä. Indeksoitujen tiedostojen toteutukset vaihtelevat toimittajien välillä, vaikka yleiset toteutukset, kuten C-ISAM ja VSAM, perustuvat IBM: n ISAM: iin. Suhteellisilla tiedostoilla, kuten indeksoiduilla tiedostoilla, on yksilöllinen tietue avain, mutta niillä ei ole vaihtoehtoisia avaimia. suhteellisen tietueen avain on sen järjestysasento; esimerkiksi kymmenennen tietueen avain on 10. Tämä tarkoittaa, että tietueen luominen avaimella 5 voi edellyttää (tyhjien) edeltävien tietueiden luomista. Suhteelliset tiedostot sallivat myös sekä peräkkäisen että satunnaisen pääsyn.
Yleinen epätyypillinen laajennus on rivijärjestys, jota käytetään tekstitiedostojen käsittelyyn. Tiedoston tietueet päättyvät uudella rivillä, ja ne voivat olla eripituisia.
Data DivisionEdit
Tietojen jakaminen on jaettu kuuteen osioon, jotka ilmoittavat eri kohdista: tiedosto-osio arkistotiedostot; työskentely-varastointi -osio staattisille muuttujille; paikallinen varasto-osa automaattisia muuttujia varten; kytkentäosa parametreille ja palautusarvolle; raporttiosio ja näyttöosa tekstipohjaisiin käyttöliittymiin.
Aggregated dataEdit
COBOL-tietokohteet ilmoitetaan hierarkkisesti käyttämällä tasonumeroita, jotka osoittavat, onko tietokohde osa toista. Kohde, jolla on korkeampi tasonumero, on alempi alemman kohteen kanssa. Ylätason tietoerät, joiden tasoluku on 1, kutsutaan tietueiksi. Kohteita, joilla on toissijaisia aggregaattitietoja, kutsutaan ryhmäkohteiksi; niitä, joita ei ole, kutsutaan perustavaroiksi. Vakiotietojen kuvaamiseen käytetyt tasoluvut ovat välillä 1–49.
Yllä olevassa esimerkissä alkeiskohde num
ja ryhmäkohta päivämäärä
ovat alistettuja tietueelle some-record
, kun taas alkeiskohteet vuosi
, kuukausi
ja -päivä
kuuluvat ryhmäkohteeseen päivämäärä
.
Alemman tason kohteet voidaan erottaa IN
(tai OF
) avainsana. Harkitse esimerkiksi yllä olevaa esimerkkikoodia yhdessä seuraavan esimerkin kanssa:
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
Nimet vuosi
, kuukausi
ja päivä
ovat itsessään epäselviä, koska näillä nimillä on määritetty useampi kuin yksi tieto. Määritettäessä tietty tieto, esimerkiksi yksi sale-date
-ryhmän sisältämistä kohteista, ohjelmoija käyttää vuoden IN-myyntipäivä
(tai vastaava myynnin vuosi -päivä
). (Tämä syntakse on samanlainen kuin useimpien nykypäivän kielten tukema ”pistemerkintä”.)
Muut tietotasotEdit
Tasonumeroa 66 käytetään julistamaan uudelleenryhmittely aiemmin määriteltyjä kohteita riippumatta siitä, miten nämä kohteet on rakennettu. Tätä tietotasoa, johon viittaa myös liittyvä RENAMES
-lauseke, käytetään harvoin ja noin vuonna 1988, se löydettiin yleensä vanhoista ohjelmista. Sen kyky jättää huomiotta hierarkkiset ja loogiset rakennetiedot tarkoittivat, että sen käyttöä ei suositella, ja monet asennukset kieltivät sen käytön.
77-tasoluku osoittaa, että kohde on erillinen, ja sellaisissa tilanteissa vastaa tason numero 01. Esimerkiksi seuraava koodi ilmoittaa kaksi 77-tason tietoelementtiä, ominaisuuden nimi
ja myynti-alue
, jotka ovat ryhmän ulkopuolisia tietoja, jotka ovat riippumattomia muista tiedoista (eivät ole niiden alaisia):
77 property-name PIC X(80). 77 sales-region PIC 9(5).
88-tasonumero ilmoittaa ehdon nimen (ns. 88-tason), joka on totta, kun sen ylätietokohde sisältää yhden sen ARVO
-lauseke. Esimerkiksi seuraava koodi määrittelee kaksi 88-tason ehtonimen kohtaa, jotka ovat totta tai väärää riippuen palkatyyppi
-tietokohteen nykyisestä merkkitietojen arvosta . Kun tietoerä sisältää arvon "H"
, ehto-nimi palkka on tunneittain
on tosi, kun taas kun se sisältää arvon "S"
tai "Y"
, ehto-nimi palkka-on-vuosi
on tosi. Jos tietokohde sisältää jotain muuta arvoa, molemmat ehtojen nimet ovat vääriä.
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
TietotyypitMuokkaa
Vakio COBOL tarjoaa seuraavat tietotyypit:
Tietotyyppi | Ilmoitusnäyte | Huomautuksia |
---|---|---|
Aakkosellinen | PIC A (30) |
Voi sisältää vain kirjaimia tai välilyöntejä |
Aakkosnumeerinen | PIC X (30) |
Voi sisältää merkkejä |
Boolen | KUVA 1 KÄYTTÖBITI |
0: n ja 1: n muodossa tallennettu data binaarilukuna |
Hakemisto | KÄYTTÖHAKEMISTO |
Viitataan taulukon elementteihin |
Kansallinen | PIC N (30) |
Samanlainen kuin aakkosnumeerinen, mutta käyttää laajennettua merkkiä asettaa, esim. UTF-8 |
Numeerinen | PIC 9 (5) V9 (5) |
voi sisältää vain numeroita |
objekti | KÄYTTÖTAVOITE |
Voi viitata joko objektiin tai NULL |
Osoitin | KÄYTTÖOHJE |
Tyyppiturvallisuus vaihtelee COBOLissa.Numeerinen data muunnetaan eri esitysten ja kokojen välillä äänettömästi, ja aakkosnumeeriset tiedot voidaan sijoittaa mihin tahansa tietueeseen, joka voidaan tallentaa merkkijonona, mukaan lukien numeeriset ja ryhmätiedot. Objektiviittauksia ja osoittimia voidaan sen sijaan määrittää vain samantyyppisistä kohteista, ja niiden arvot voidaan rajoittaa tiettyyn tyyppiin.
PICTURE clauseEdit
A KUVA
(tai PIC
) -lauseke on merkkijono, joista kukin edustaa osaa tietoelementistä ja mitä se voi sisältää. Jotkut kuvamerkit määrittävät kohteen tyypin ja kuinka monen merkin tai numeron se käyttää muistissa. Esimerkiksi 9
tarkoittaa desimaalilukua ja S
osoittaa, että kohde on allekirjoitettu. Muut kuvamerkit (kutsutaan lisäys- ja muokkausmerkeiksi) määrittelevät kohteen alustamisen. Esimerkiksi sarja +
-merkkejä määrittelee merkkien sijainnit sekä sen, kuinka johtava merkki-merkki sijoitetaan lopullisiin merkkitietoihin; oikeanpuoleisin ei-numeerinen merkki sisältää kohteen s-merkin, kun taas muut merkkipaikat, jotka vastaavat +
-kohtaa tämän sijainnin vasemmalla puolella, sisältävät välilyönnin. merkit voidaan määrittää tarkemmin määrittämällä numero sulkeisiin kuvan merkin jälkeen; esimerkiksi 9 (7)
vastaa 9999999
. Kuvan tekniset tiedot sisältävät vain numeron ( 9
) ja allekirjoituksen ( S
) -merkit määrittelevät puhtaasti numeeriset tietoelementit, kun taas kuvamääritykset sisältävät aakkosellisen ( A
) tai aakkosnumeerisen ( X
) -merkit määrittelevät aakkosnumeeriset tietoerät. Muiden muotoilumerkkien läsnäolo määrittää muokatut numeeriset tai muokatut aakkosnumeeriset tiedot.
USAGE clauseEdit
KÄYTTÖ
-lauseke ilmoittaa muodon data tallennetaan. Tietotyypistä riippuen se voidaan joko täydentää tai käyttää PICTURE
-lausekkeen sijaan. Vaikka sitä voidaan käyttää osoittimien ja objektiviittausten ilmoittamiseen, se on suunnattu lähinnä numeeristen tyyppien määrittämiseen. Nämä numeeriset muodot ovat:
- Binaarinen, jossa vähimmäiskoko määritetään joko lausekkeella
PICTURE
taiUSAGE
-lauseke, kutenBINARY-LONG
. -
KÄYTTÖTURVALLISUUSKoodi
, jossa tietoja voi olla tallennetaan missä tahansa muodossa, jonka toteutus tarjoaa; vastaa useinKÄYTTÖSANAKIRJA
-
KÄYTTÖNÄYTTÖ
, oletusmuoto , jossa tiedot tallennetaan merkkijonona - Liukuluku joko toteutuksesta riippuvassa muodossa tai IEEE 754: n mukaisesti.
-
USAGE NATIONAL
, jossa tiedot tallennetaan merkkijonona käyttämällä laajennettua merkistöä. -
USAGE PACKED-DECIMAL
, jossa tiedot tallennetaan pienimmässä mahdollisessa desimaalimuodossa (tyypillisesti pakattu binaarikoodatulla desimaalilla)
Report writerEdit
Raportin kirjoittaja on selittävä väline raporttien luomiseen. Ohjelmoijan on määritettävä vain raportin asettelu ja sen tuottamiseen tarvittavat tiedot, mikä vapauttaa heidät kirjoittamasta koodia käsittelemään esimerkiksi sivunvaihtoa, tietojen muotoilua sekä otsikoita ja alatunnisteita.
Raportit liitetään raporttiin. tiedostot, jotka ovat tiedostoja, joille voidaan kirjoittaa vain raportin kirjoittajalausekkeilla.
FD report-out REPORT sales-report.
Jokainen raportti on määritelty raporttiosassa tiedonjaon. Raportti on jaettu raporttiryhmiin, jotka määrittelevät raportin otsikot, alatiedot ja yksityiskohdat. Raportit kiertävät hierarkkisia ohjauskatkoja. Ohjaustaukot tapahtuvat, kun avainmuuttuja muuttaa sen arvoa; esimerkiksi kun luodaan asiakkaiden tilauksia yksityiskohtaisesti raportti, Ohjaustauko voi tapahtua, kun ohjelma saavuttaa toisen asiakkaan tilaukset. Tässä on esimerkki raportin kuvauksesta raportille, joka antaa myyjän myynnin ja joka varoittaa virheellisistä tiedoista:
Yllä oleva raportin kuvaus kuvaa seuraavan asettelun:
Neljä lausetta ohjaa raportin kirjoitinta: INITIATE
, joka valmistelee raportin kirjoittajan tulostettavaksi; GENERATE
, joka tulostaa raporttiryhmän; SUPPRESS
, joka estää raporttiryhmän tulostuksen; ja TERMINATE
, joka lopettaa raportin käsittelyn.Edellä olevassa myyntiraportin esimerkissä menettelyjako voi näyttää tältä:
OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .
Report Writer -toiminnon käyttö vaihteli huomattavasti; jotkut organisaatiot käyttivät sitä laajasti ja toiset eivät lainkaan. Lisäksi Report Writer -työkalujen laatu vaihteli, ja alemman tason sovellukset käyttivät joskus liikaa muistia ajon aikana.
Procesions DivisionEdit
ProceduresEdit
Proseduurijaon osioita ja kappaleita (yhdessä kutsutaan menettelyiksi) voidaan käyttää tarroina ja yksinkertaisina aliohjelmina. Toisin kuin muissa osastoissa, kappaleiden ei tarvitse olla osissa. Suoritus menee alas ohjelman menettelyjen läpi, kunnes se lopetetaan. Jos haluat käyttää menettelyjä aliohjelmina, SUORITA käytetään koodia> verbi.
PERFORM
-lauseke muistuttaa jonkin verran modernin kielen proseduurikutsua siinä mielessä, että suoritus palaa koodiin seuraamalla kutsutun koodin lopussa olevaa PERFORM
-käskyä; se ei kuitenkaan tarjoa mitään mekanismia parametrien välittämiseen tai tulosarvon palauttamiseen. Jos aliohjelma käynnistetään yksinkertaisella käskyllä, kuten PERFORM aliohjelma
, ohjaus palaa kutsutun toimenpiteen lopussa. PERFORM
on kuitenkin epätavallinen siinä mielessä, että sitä voidaan käyttää kutsumaan alue, joka kattaa useiden vierekkäisten toimenpiteiden sarjan. Tämä tehdään PERFORM sub-1 THRU sub-n
-rakenteella:
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
Tämän ohjelman tulos on ”AABC”.
PERFORM
eroaa myös tavanomaisista menettelypuheluista että puhelupinosta ei ole ainakaan perinteisesti käsitystä. Tämän seurauksena sisäkkäiset kutsut ovat mahdollisia (koodisarja, joka on PERFORM
”ed, voi suorittaa PERFORM
-lauseke itse), mutta vaatii erityistä varovaisuutta, jos molemmat kutsut suorittavat saman koodin osat. Ongelma syntyy, kun sisemmän kutsun koodi saavuttaa ulomman kutsun poistumispisteen. Muodollisemmin, jos ohjaus kulkee PERFORM
-kutsu, jota kutsuttiin aiemmin, mutta jota ei ole vielä suoritettu, poistumispiste, COBOL 2002 -standardi määrää virallisesti, että käyttäytymistä ei ole määritelty. > Syynä on se, että COBOL toimii pikemminkin ”paluuosoitteen” sijasta niin kutsutulla jatko-osoitteella. Kun ohjausvirta saavuttaa minkä tahansa toimenpiteen loppu, jatko-osoite etsitään ja ohjaus siirretään siihen osoitteeseen. Ohjelma suoritetaan, jokaisen toimenpiteen jatko-osoite alustetaan pro-aloitusosoitteeseen cedure, joka tulee seuraavaksi ohjelmatekstissä niin, että jos PERFORM
-lausekkeita ei tapahdu, ohjaus kulkee ylhäältä alas ohjelman läpi. Mutta kun PERFORM
-lauseke suoritetaan, se muuttaa kutsutun menettelyn (tai kutsutun alueen viimeisen menettelyn, jos PERFORM THRU käytettiin), niin että ohjaus palaa puhelupaikalle lopussa. Alkuperäinen arvo tallennetaan ja palautetaan myöhemmin, mutta säilytyspaikkoja on vain yksi. Jos kaksi sisäkkäistä kutsua toimii päällekkäisellä koodilla, ne voivat häiritä toistensa jatko-osoitteen hallintaa monin tavoin.
Seuraava esimerkki (otettu Veermanilta & Verhoeven 2006) havainnollistaa ongelmaa:
Voidaan odottaa, että tämän ohjelman tulos on ”1 2 3 4 3”: ”2”: n näyttämisen jälkeen toinen PERFORM
aiheuttaa ”3” ja ”4”, ja sitten ensimmäinen kutsu jatkuu ”3”: lla. Perinteisissä COBOL-toteutuksissa näin ei ole. Pikemminkin ensimmäinen PERFORM
-käsky asettaa jatko-osoitteen LABEL3
-kohdan loppuun niin, että se hyppää takaisin soittosivusto LABEL1
sisällä. Toinen lauseke PERFORM
asettaa palautuksen LABEL4
mutta ei muuta LABEL3
-kohdan loppuun, se hyppää takaisin ulkoiseen PERFORM
lause, ja ohjelma lopettaa vain ”1 2 3” tulostamisen. Toisaalta joissakin COBOL-toteutuksissa, kuten avoimen lähdekoodin TinyCOBOL-kääntäjässä, kaksi lausetta PERFORM
eivät häiritse toisiaan ja lähtö on todellakin ”1 2 3 4 3 ”.Siksi käyttäytyminen tällaisissa tapauksissa ei ole vain (ehkä) yllättävää, se ei ole myöskään kannettava.
Tämän rajoituksen erityinen seuraus on, että PERFORM
ei voida käyttää rekursiivisen koodin kirjoittamiseen. Toinen yksinkertainen esimerkki tämän havainnollistamiseksi (hieman yksinkertaistettu Veermanilta & Verhoeven 2006):
MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".
Voidaan odottaa, että lähtö on ”1 2 3 END END END”, ja itse asiassa jotkut COBOL-kääntäjät tuottavat sen. Jotkut kääntäjät, kuten IBM COBOL, tuottavat koodin, joka tulostaa ”1 2 3 END END END END …” ja niin edelleen ja tulostaa ”END” yhä uudelleen loputtomassa silmukassa. Koska varmuuskopioiden jatko-osoitteiden tallentamiseen on rajallista tilaa, varmuuskopiot korvataan rekursiivisten kutsujen aikana, ja kaikki, mikä voidaan palauttaa, on palata takaisin kohtaan DISPLAY "END"
.
StatementsEdit
COBOL 2014 sisältää 47 lausetta (kutsutaan myös verbeiksi), jotka voidaan ryhmitellä seuraaviin laajoihin luokkiin: ohjausvirta, I / O, tietojen käsittely ja raportin kirjoittaja. Raportin kirjoittajan lausunnot käsitellään raportin kirjoittaja-osiossa.
Ohjaus flowEdit
COBOLin ehdolliset lauseet ovat IF
ja ARVIOI
. EVALUATE
on kytkimen kaltainen lause, jolla on lisäominaisuus arvioida useita arvot ja ehdot. Tätä voidaan käyttää päätöksentaulukkojen toteuttamiseen. Esimerkiksi seuraavia voidaan käyttää CNC-sorvin ohjaamiseen:
EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE
Lausetta PERFORM
käytetään määrittelemään silmukoita, jotka suoritetaan, kunnes ehto on tosi (ei totta, mikä on yleisempää muilla kielillä). käytetään myös toimintojen tai toimenpide-alueiden kutsumiseen (katso lisätietoja menettely-osiosta). CALL
ja INVOKE
kutsu aliohjelmia ja vastaavasti menetelmiä. Aliohjelman / menetelmän nimi sisältyy str joka voi olla kirjaimellinen tai tieto. Parametrit voidaan välittää viitteellä, sisällöllä (jos kopio välitetään viitteellä) tai arvolla (mutta vain jos prototyyppi on käytettävissä). PERUUTA
purkaa aliohjelmat muistista. GO TO
saa ohjelman siirtymään määritettyyn menettelyyn.
GOBACK
-lauseke on palautuslauseke ja STOP
-käsky pysäyttää ohjelman. Lausekkeella EXIT
on kuusi erilaista muotoa: sitä voidaan käyttää return-lauseena, break-lauseena, jatko-lauseena, loppumerkkinä tai menettelystä poistumiseen.
Poikkeuksia tuo esiin RAISE
-lauseke ja ne haetaan käsittelijällä, joka on määritelty DECLARATIVES
osa menettelyjaosta. Vakuutuslausekkeet ovat osioita, jotka alkavat USE
-lausekkeella ja määrittelevät käsiteltävät virheet. Poikkeuksia voivat olla nimet tai objektit. JATKA
käytetään deklaratiivisena siirtymään lausekkeeseen sen jälkeen, joka aiheutti poikkeuksen, tai menettelyyn, joka on ILMOITUKSET
. Toisin kuin muilla kielillä, kiinni jäämättömät poikkeukset eivät välttämättä lopeta ohjelmaa ja ohjelma voi jatkua muuttumattomana.
I / OEdit
Tiedoston I / O: ta käsittelee itse kuvaava AVAA
, SULJE
, LUE
, ja WRITE
-lausekkeet ja kolme muuta: REWRITE
, joka päivittää tietueen; START
, joka valitsee seuraavat tietueet, joihin pääsee, etsimällä tietueen tietyllä avaimella; ja UNLOCK
, joka vapauttaa lukituksen viimeksi käytettyyn tietueeseen.
Käyttäjien vuorovaikutus tapahtuu HYVÄKSY
ja DISPLAY
.
Data manipulationEdit
Seuraavat verbit käsittelevät tietoja:
-
INITIALIZE
, joka asettaa tietueiden oletusarvot. -
MOVE
, joka määrittää arvot tietueille; MOVE CORRESPONDING määrittää vastaavat samannimiset kentät. -
SET
, jolla on 15 muotoa: se voi muokata indeksejä, määrittää objektiviittauksia ja muuttaa taulukkoa. kapasiteetit, muiden toimintojen ohella. -
ADD
,ALIHAKU
,MULTIPLY
,DIVIDE
jaCOMPUTE
, jotka käsittelevät aritmeettinen (COMPUTE
-toiminnolla määritetään kaavan tulos muuttujalle). -
ALLOCATE
jaFREE
, jotka käsittelevät dynaamista muistia. -
VALIDATE
, joka validoi ja jakaa tietoja määritetyllä tavalla kohteen kuvauksessa datajaossa. -
STRING
jaUNSTRING
, jotka ketjutavat ja jakavat merkkijonot. -
INSPECT
, joka vastaa tai korvaa määritettyjen alimerkkijonojen esiintymät merkkijonossa. -
SEARCH
, joka etsii taulukosta ensimmäisen merkinnän. täyttävät ehdon.
Tiedostot ja taulukot lajitellaan käyttämällä SORT
ja MERGE
verbi yhdistää ja lajittelee tiedostot. Verbi RELEASE
antaa lajiteltavat tietueet ja RETURN
noutaa lajitellut tietueet järjestyksessä.
Laajuuden päättäminenMuokkaa
Jotkut lauseet, kuten IF
ja LUE
, voivat itse sisältää lauseita. Tällaiset lauseet voidaan lopettaa kahdella tavalla: jaksolla (implisiittinen päättäminen), joka lopettaa kaikki sisältämättömät lausekkeet, tai soveltamisalueen päättäjällä, joka lopettaa lähimmän vastaavan avoimen lauseen.
Sisäkkäiset lauseet päättyvät ajanjakso ovat yleisiä virheiden lähteitä. Tutki esimerkiksi seuraavaa koodia:
IF x DISPLAY y. DISPLAY z.
Tässä tarkoituksena on näyttää y
ja z
, jos ehto x
on tosi. z
näytetään kuitenkin x
-arvosta riippumatta, koska lauseke IF
lopetetaan virheellisen ajanjakson jälkeen DISPLAY y
.
Toinen virhe on seurausta riippuvasta muusta ongelmasta, kun kaksi IF
-lausekkeet voivat liittyä ELSE
-ohjelmaan.
IF x IF y DISPLAY aELSE DISPLAY b.
Yllä olevassa fragmentissa ELSE
liittyy IF y
-käskyyn IF x -lauseke, aiheuttaen virheen. Ennen nimenomaisen laajuuden terminaattoreiden käyttöönottoa sen estäminen edellyttää, että MUUT SEURAAVAT Lauseet
sijoitetaan sisäisen IF
jälkeen. .
Itsemuokkaava codeEdit
Alkuperäinen (1959) COBOL-eritelmä tuki surullisen ALTER X: n etenemistä Y: ksi
-lauseke, jolle monet kääntäjät loivat itsensä muokkaavan koodin. X
ja Y
ovat toimintotunnisteita, ja yksi SIIRRY
lauseke menettelyssä X
, joka suoritetaan tällaisen ALTER
-lausekkeen jälkeen tarkoittaa Mene sen sijaan Y
: een. Monet kääntäjät tukevat sitä edelleen, mutta se katsottiin vanhentuneeksi COBOL 1985 -standardissa ja poistettiin vuonna 2002.
Lausetta ALTER
pidettiin huonosti koska se heikensi ”kontekstin paikallisuutta” ja teki ohjelman kokonaislogiikasta vaikeasti ymmärrettävää. Kuten oppikirjan kirjoittaja Daniel D. McCracken kirjoitti vuonna 1976, kun ”jonkun, joka ei ole koskaan ennen nähnyt ohjelmaa, on tutustuttava siihen mahdollisimman nopeasti , joskus kriittisen aikapaineen takia, koska ohjelma on epäonnistunut … GO TO -lausekkeen näkyminen itsessään kappaleessa, joka merkitsee samalla tavoin tuntemattoman määrän ALTER-lauseita tuntemattomissa paikoissa koko ohjelmassa, aiheuttaa pelkoa rohkeimman ohjelmoijan sydän. ”
Hei, worldEdit
” Hei, maailma ”-ohjelma COBOLissa:
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
Kun C-ohjelmointikielen – nyt kuuluisa – ”Hei, maailma!” – ohjelmaesimerkki julkaistiin ensimmäisen kerran vuonna 1978, vastaava mai nframe COBOL -ohjelmanäyte olisi lähetetty JCL: n kautta, todennäköisesti käyttämällä lävistyskortinlukijaa ja 80 sarakkeen lävistyskorttia. Alla oleva luettelo tyhjällä DATA DIVISION -laitteella testattiin GNU / Linuxilla ja System / 370 Hercules -emulaattorilla, jossa oli MVS 3.8J. Heinäkuussa 2015 kirjoitettu JCL on peräisin Jay Moseleyn isännöimistä Hercules-oppaista ja näytteistä. Tuon aikakauden COBOL-ohjelmoinnin mukaisesti HELLO, WORLD näytetään isoilla kirjaimilla.
Kun olet lähettänyt JCL: n, MVS-konsoli näytetään:
19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED
Yllä olevan konsoliluettelon rivi 10 on korostettu tehosteen vuoksi, korostus ei ole osa todellista konsolilähtöä.
Tähän liittyvä kääntäjän luettelo loi yli neljä sivua teknisiä yksityiskohtia ja työn suoritustietoja yhdelle ulostuloriville 14 riviltä. COBOL.