SyntaxEdit
COBOL har en engelsk-liknande syntax, som används för att beskriva nästan allt i ett program. Till exempel kan ett villkor uttryckas som x ÄR STÖRRE än y
eller mer kortfattat som x GREATER y
eller x > y
. Mer komplexa förhållanden kan ”förkortas” genom att ta bort upprepade villkor och variabler. Till exempel a > b OCH en > c ELLER a = d kan förkortas till
a > b OCH c ELLER = d
. För att stödja denna engelska-liknande syntax har COBOL över 300 nyckelord. Några av nyckelorden är enkla alternativa eller pluraliserade stavningar av samma ord, vilket ger mer engelska-liknande uttalanden och satser. t.ex. kan sökorden IN
och OF
användas omväxlande, liksom ÄR
och ÄR
och VÄRDE
och VÄRDEN
.
Varje COBOL-program består av fyra grundläggande lexikala objekt: ord, bokstäver, bildteckensträngar (se § BILD klausul) och separatorer. Ord innehåller reserverade ord och användardefinierade identifierare. De kan innehålla upp till 31 tecken och kan innehålla bokstäver, siffror, bindestreck och understrykningar. Bokstäver inkluderar siffror (t.ex. 12
) och strängar (t.ex. "Hej!"
). Separatorer inkluderar mellanslagstecken och kommatecken och halvkolon följt av ett mellanslag.
Ett COBOL-program är uppdelat i fyra divisioner: identifieringsavdelningen, miljöavdelningen, datadelningen och procedurindelningen. Identifieringsavdelningen anger källelementets namn och typ och där klasser och gränssnitt anges. Miljödivisionen specificerar alla programfunktioner som beror på systemet som kör det, till exempel filer och teckenuppsättningar. Datadelningen används för att deklarera variabler och parametrar. Förfarandeavdelningen innehåller programmets uttalanden. Varje uppdelning är uppdelad i sektioner, som består av stycken.
MetalanguageEdit
COBOLs syntax beskrivs vanligtvis med en unikt metallspråk med hängslen, konsoler, stänger och understrykning. Metalspråket utvecklades för de ursprungliga COBOL-specifikationerna. Även om Backus – Naur-formen existerade vid den tiden hade kommittén inte hört talas om det.
Element | Utseende | Funktion |
---|---|---|
Alla versaler | EXEMPEL | Reserverat ord |
Understrykning | EXEMPEL | Det reserverade ordet är obligatorisk |
hängslen | {} | Endast ett alternativ kan väljas |
Fästen | Noll eller ett alternativ kan väljas | |
Ellipsis | … | Det föregående elementet kan upprepas |
Barer | {| |} | Ett eller flera alternativ kan väljas. Alla alternativ kan bara väljas en gång. |
Noll eller fler alternativ kan väljas. Alla alternativ kan bara vara vald en gång. |
Som ett exempel, consi följande beskrivning av ett ADD
uttalande:
Denna beskrivning tillåter följande varianter:
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"
KodformatRedigera
COBOL kan skrivas i två format: fast (standard) eller gratis. I fastformat måste koden justeras så att den passar i vissa områden (en fördröjning från att använda stansade kort).Fram till COBOL 2002 var dessa:
Namn | Kolumn (s) | Användning |
---|---|---|
Sekvensnummerområde | 1–6 | Används ursprungligen för kort / radnummer (underlättar mekanisk stansad kortsortering för att säkerställa avsedd programkodsekvens efter manuell redigering / hantering) ignoreras detta område av kompilatorn |
Indikatorområde | 7 | Följande tecken är tillåtna här:
|
Område A | 8–11 | Detta innehåller: DIVISION , SECTION och procedurrubriker; 01- och 77-nivånummer och fil- / rapportbeskrivare |
Område B | 12–72 | Alla andra koder som inte är tillåtna i Område Ett |
Programnamnområde | 73– | Historiskt upp till kolumn 80 för stansade kort används det för att identifiera programmet eller sekvens som kortet tillhör |
I COBOL 2002 var områden A och B slogs samman för att bilda programtextområdet, som nu slutar vid en implementeringsdefinierad kolumn.
COBOL 2002 introducerade också kod i fritt format. Koden med fritt format kan placeras i valfri kolumn i filen, som på nyare programmeringsspråk. Kommentarer anges med *>
, som kan placeras var som helst och även kan användas i källkod med fast format. Fortsättningslinjer finns inte och >>PAGE
-direktivet ersätter /
-indikatorn.
IdentifieringsdelningEdit
Identifieringsavdelningen identifierar följande kodenhet och innehåller definitionen av en klass eller ett gränssnitt.
Objektorienterad programmeringEdit
Klasser och gränssnitt har funnits i COBOL sedan 2002. Klasser har fabriksobjekt som innehåller klassmetoder och variabler och instansobjekt som innehåller förekomstmetoder och variabler. Arv och gränssnitt ger polymorfism. Stöd för generisk programmering tillhandahålls via parametrerade klasser, som kan instansieras för att använda valfri klass eller gränssnitt. Objekt lagras som referenser som kan vara begränsade till en viss typ. Det finns två sätt att anropa en metod: uttalandet INVOKE
, som fungerar på samma sätt som CALL
, eller genom inline-metodanrop, vilket är analogt med att använda funktioner.
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOL ger inte ett sätt att dölja metoder. Klassdata kan dock döljas genom att deklarera det utan en PROPERTY
-sats, vilket gör att användaren inte kan komma åt den. Metodöverbelastning lades till i COBOL 2014.
Environment divisionEdit
Miljödivisionen innehåller konfigurationsavsnittet och input-output-avsnittet. Konfigurationsavsnittet används för att specificera variabla funktioner såsom valutatecken, språk och teckenuppsättningar. Input-output-sektionen innehåller filrelaterad information.
FilesEdit
COBOL stöder tre filformat eller organisationer: sekventiell, indexerad och relativ. I sekventiella filer är poster sammanhängande och måste passeras sekventiellt, på samma sätt som en länkad lista. Indexerade filer har ett eller flera index som möjliggör slumpmässig åtkomst till poster och som kan sorteras på dem. Varje post måste ha en unik nyckel, men andra alternativa nycklar behöver inte vara unika. Implementeringen av indexerade filer varierar mellan leverantörerna, även om vanliga implementeringar, som C ‑ ISAM och VSAM, baseras på IBMs ISAM. Relativa filer, som indexerade filer, har en unik postnyckel, men de har inga alternativa nycklar. A den relativa postens nyckel är dess ordningsläge; till exempel har den 10: e posten en nyckel på 10. Detta innebär att skapa en post med en nyckel på 5 kan kräva skapande av (tomma) föregående poster. Relativa filer tillåter också både sekventiell och slumpmässig åtkomst.
Ett vanligt icke-standardtillägg är linjens sekventiella organisation, som används för att bearbeta textfiler. Poster i en fil avslutas med en ny rad och kan ha olika längd.
Data divisionEdit
Datadelen är uppdelad i sex sektioner som deklarerar olika objekt: filavsnittet, för arkivregister; avsnittet arbetslagring för statiska variabler; avsnittet om lokal lagring för automatiska variabler; länkavsnittet för parametrar och returvärdet; rapportavsnittet och skärmavsnittet för textbaserade användargränssnitt.
Aggregerad dataredigering
Dataobjekt i COBOL deklareras hierarkiskt genom användning av nivånummer som anger om ett dataobjekt är en del av en annan. Ett objekt med högre nivå är underordnat ett objekt med ett lägre. Data på toppnivå, med ett nivånummer 1, kallas poster. Objekt som har underordnade samlade data kallas gruppartiklar; de som inte kallas elementära objekt. Nivånummer som används för att beskriva standarddata är mellan 1 och 49.
I exemplet ovan är elementärt num
och gruppobjekt -datumet
är underordnat posten någon-post
, medan elementära objekt året
, månaden
och -dag
är en del av gruppobjektet datumet
.
Underordnade objekt kan tydas med IN
(eller OF
) nyckelord. Tänk till exempel på exempelkoden ovan tillsammans med följande exempel:
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
Namnen året
, månaden
och dagen är tvetydiga i sig, eftersom mer än ett dataobjekt definieras med dessa namn. För att specificera ett visst dataobjekt, till exempel ett av objekten som ingår i gruppen
försäljningsdatum
, skulle programmeraren använda året IN försäljningsdatum
(eller motsvarande året för försäljningsdatum
). (Denna syntax liknar den "punktnotation" som stöds av de flesta samtida språk.)
Andra datanivåer Redigera
Ett nivånummer på 66 används för att förklara en omgruppering av tidigare definierade poster, oavsett hur dessa objekt är strukturerade. Denna datanivå, som även hänvisas till i den tillhörande RENAMES
-satsen, används sällan och hittades vanligtvis i gamla program. Dess förmåga att ignorera de hierarkiska och logiska strukturdata innebar att användningen inte rekommenderades och många installationer förbjöd användningen.
Ett 77-nivånummer indikerar att objektet är fristående och i sådana situationer motsvarar nivånumret 01. Till exempel deklarerar följande kod två 77-nivå dataelement, property-name
och försäljningsregion
, som är icke-gruppdataobjekt som är oberoende av (inte underordnade) andra dataposter:
77 property-name PIC X(80). 77 sales-region PIC 9(5).
Ett 88-nivå-nummer förklarar ett villkornamn (en så kallad 88-nivå) som är sant när dess överordnade data innehåller ett av de värden som anges i dess VALUE
klausul. Följande kod definierar till exempel två 88-nivå villkor-namnobjekt som är sanna eller falska beroende på det aktuella teckendatavärdet för löntyp
-dataposten . När dataobjektet innehåller värdet "H"
, är villkorets namn lön per timme
är sant, medan när det innehåller värdet "S"
eller "Y" är villkorets namn
lön-per år
sant. Om dataobjektet innehåller något annat värde är båda villkorsnamnen falska.
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
Datatyper Redigera
Standard COBOL tillhandahåller följande datatyper:
Datatyp | Provdeklaration | Anteckningar |
---|---|---|
Alfabetisk | PIC A (30) |
Får endast innehålla bokstäver eller mellanslag |
Alfanumeriskt | PIC X (30) |
Kan innehålla alla tecken |
Boolean | PIC 1 ANVÄNDNINGSBIT |
Data lagrade i form av 0s och 1s, som ett binärt tal |
Index | ANVÄNDNINGSINDEX |
Används för att referera till tabellelement |
Nationellt | PIC N (30) |
Liknar alfanumeriska men använder ett utökat tecken uppsättning, t.ex. UTF-8 |
Numerisk | PIC 9 (5) V9 (5) |
Får endast innehålla siffror |
Objekt | ANVÄNDNINGSMÅLREFERENS
|
Kan referera till antingen ett objekt eller NULL |
Pekare | ANVÄNDNINGSPENARE |
Typsäkerhet är variabel i COBOL.Numerisk data konverteras tyst mellan olika representationer och storlekar och alfanumeriska data kan placeras i valfritt dataobjekt som kan lagras som en sträng, inklusive numeriska data och gruppdata. Däremot får objektreferenser och pekare bara tilldelas från objekt av samma typ och deras värden kan begränsas till en viss typ.
BILD clauseEdit
A PICTURE
(eller PIC
) sats är en sträng av tecken, var och en representerar en del av dataposten och vad den kan innehålla. Vissa bildtecken anger typ av objekt och hur många tecken eller siffror det upptar i minnet. Till exempel indikerar en 9
en decimal och en S
indikerar att artikeln är signerad. Andra bildtecken (kallas infognings- och redigeringstecken) anger hur ett objekt ska formateras. Exempelvis definierar en serie +
tecken som teckenpositioner samt hur ett ledande tecken ska placeras inom den slutliga karaktärsdata; det högra icke-numeriska tecknet innehåller objektets tecken, medan andra teckenpositioner som motsvarar ett +
till vänster om denna position kommer att innehålla ett mellanslag. tecken kan specificeras mer kortfattat genom att ange ett nummer inom parentes efter ett bildtecken. Till exempel är 9 (7)
motsvarande 9999999
. Bildspecifikationer som endast innehåller siffror ( 9
) och tecken ( S
) tecken definierar rent numeriska dataobjekt, medan bildspecifikationer som innehåller alfabetiska ( A
) eller alfanumeriska ( X
) tecken definierar alfanumeriska dataobjekt. Förekomsten av andra formateringstecken definierar redigerade numeriska eller redigerade alfanumeriska dataobjekt.
ANVÄNDNING clauseEdit
ANVÄNDNING
klausul förklarar formatet data lagras i. Beroende på datatyp kan den antingen komplettera eller användas istället för en PICTURE
-sats. Även om den kan användas för att deklarera pekare och objektreferenser är den mestadels inriktad på att specificera numeriska typer. Dessa numeriska format är:
- Binär, där en minsta storlek antingen anges av
PICTURE
-satsen eller av enUSAGE
klausul somBINARY-LONG
. -
ANVÄNDNINGSDATOR
, där data kan finnas lagras i vilket format som implementeringen ger; ofta motsvarandeANVÄNDNINGSBINÄR
-
ANVÄNDNINGSVISNING
, standardformatet , där data lagras som en sträng - Flytpunkt, antingen i implementeringsberoende format eller enligt IEEE 754.
-
ANVÄNDNINGSNATIONAL
, där data lagras som en sträng med en utökad teckenuppsättning -
ANVÄNDNING PACKAD-DECIMAL
, där data lagras i minsta möjliga decimalformat (vanligtvis packad binärkodad decimal)
Report writerEdit
Rapportskrivaren är en deklarativ funktion för att skapa rapporter. Programmeraren behöver bara ange rapportlayouten och de data som krävs för att producera den, vilket frigör dem från att behöva skriva kod för att hantera saker som sidbrytningar, dataformatering och rubriker och sidor.
Rapporter är associerade med rapporten filer, som är filer som endast kan skrivas till genom uttalanden om rapportskrivare.
FD report-out REPORT sales-report.
Varje rapport definieras i rapportsektionen av datadivisionen. En rapport är uppdelad i rapportgrupper som definierar rapportens rubriker, sidfot och detaljer. Rapporterna kringgår hierarkiska kontrollavbrott. Kontrollavbrott inträffar när en nyckelvariabel ändrar värdet; till exempel när man skapar en rapport som beskriver kundernas ”order, kontrollavbrott kan inträffa när programmet når en annan kunds beställningar. Här är ett exempel på en rapportbeskrivning för en rapport som ger en säljares försäljning och som varnar för ogiltiga poster:
Rapportbeskrivningen ovan beskriver följande layout:
Fyra påståenden styr rapportskrivaren: INITIATE
, som förbereder rapportskrivaren för utskrift; GENERERA
, som skriver ut en rapportgrupp; SUPPRESS
, som undertrycker utskriften av en rapportgrupp; och AVSLUTA
, vilket avslutar rapportbehandlingen.För ovanstående försäljningsrapportsexempel kan procedurindelningen se ut så här:
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 .
Användningen av Report Writer-anläggningen tenderade att variera betydligt; Vissa organisationer använde det i stor utsträckning och andra inte alls. Dessutom varierade implementeringarna av Report Writer i kvalitet, där de i nedre delen ibland använde för mycket minne vid körning.
Procedur divisionEdit
ProceduresEdit
Avsnitten och styckena i proceduravdelningen (gemensamt kallade förfaranden) kan användas som etiketter och som enkla underrutiner. Till skillnad från andra divisioner behöver stycken inte vara i sektioner. Utförande går igenom procedurerna för ett program tills det avslutas. För att använda procedurer som underrutiner, PERFORM verb används.
En UTFÖRANDE
uttalande liknar något proceduranrop på ett modernt språk i den meningen att exekvering återgår till koden efter uttalandet PERFORM
i slutet av den anropade koden; emellertid tillhandahåller den ingen mekanism för parameteröverföring eller för att returnera ett resultatvärde. Om en subrutin anropas med ett enkelt uttalande som PERFORM subrutin
, återgår kontrollen i slutet av den anropade proceduren. Emellertid är UTFÖRANDE
ovanligt eftersom det kan användas för att anropa ett intervall som spänner över en sekvens av flera intilliggande procedurer. Detta görs med PERFORM sub-1 THRU sub-n
-konstruktion:
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
Utgången för detta program kommer att vara: ”AABC”.
PERFORM
skiljer sig också från konventionella proceduranrop att det åtminstone traditionellt inte finns någon uppfattning om en samtalsstack. Som en konsekvens är kapslade anrop möjliga (en sekvens av kod som är PERFORM
”ed kan utföra en PERFORM själva uttalandet), men kräver extra försiktighet om delar av samma kod utförs av båda anropen. Problemet uppstår när koden i den inre anropet når utgångspunkten för den yttre anropet. Mer formellt om kontrollen passerar genom utgångspunkt för en
UTFÖRANDE
anrop som anropades tidigare men inte har slutförts ännu, COBOL 2002-standarden föreskriver officiellt att beteendet är odefinierat.
Anledningen är att COBOL snarare än en ”returadress” arbetar med vad som kan kallas en fortsättningsadress. När kontrollflödet når slutet på valfri procedur letas fortsättningsadressen upp och kontrollen överförs till den adressen. programmet körs initieras fortsättningsadressen för varje procedur till proffens startadress cedure som kommer nästa i programtexten så att, om inga PERFORM
uttalanden händer, flyter kontrollen från topp till botten genom programmet. Men när ett PERFORM
-uttalande körs ändrar det fortsättningsadressen för den anropade proceduren (eller den sista proceduren i det anropade intervallet, om PERFORM THRU
användes), så att kontrollen återvänder till samtalsplatsen i slutet. Det ursprungliga värdet sparas och återställs efteråt, men det finns bara en lagringsposition. Om två kapslade anrop fungerar på överlappande kod kan de störa varandras hantering av fortsättningsadressen på flera sätt.
Följande exempel (hämtat från Veerman & Verhoeven 2006) illustrerar problemet:
Man kan förvänta sig att produktionen från detta program skulle vara ”1 2 3 4 3”: Efter att ”2” visas, den andra PERFORM
gör att ”3” och ”4” visas, och sedan fortsätter den första anropet med ”3”. I traditionella COBOL-implementeringar är detta inte fallet. Snarare den första PERFORM
uttalande ställer in fortsättningsadressen i slutet av LABEL3
så att den hoppar tillbaka till anropssida inuti LABEL1
. Det andra PERFORM
uttalande anger avkastningen i slutet av LABEL4
men ändrar inte fortsättningsadressen för LABEL3
, hoppar det alltså tillbaka till det yttre PERFORM uttalande och programmet slutar bara skriva ut "1 2 3". Å andra sidan stör inte de två
PERFORM
-uttalandena i några COBOL-implementeringar, som TinyCOBOL-kompilatorn, och utdata är verkligen "1 2 3 4 3 ".Därför är beteendet i sådana fall inte bara (kanske) överraskande, det är inte bärbart.
En speciell konsekvens av denna begränsning är att PERFORM
kan inte användas för att skriva rekursiv kod. Ett annat enkelt exempel för att illustrera detta (något förenklat från Veerman & 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".
Man kan förvänta sig att produktionen är ”1 2 3 END END END”, och faktiskt är det vad vissa COBOL-kompilatorer kommer att producera. Men vissa kompilatorer, som IBM COBOL, kommer att producera kod som skriver ut ”1 2 3 END END END END …” och så vidare, och skriver ut ”END” om och om igen i en oändlig slinga. Eftersom det finns ett begränsat utrymme för att lagra backup-fortsättningsadresser skrivs säkerhetskopiorna över under rekursiva anrop, och allt som kan återställas är att hoppa tillbaka till DISPLAY "END"
.
StatementsEdit
COBOL 2014 har 47 uttalanden (även kallade verb), som kan grupperas i följande breda kategorier: kontrollflöde, I / O, datahantering och rapportskrivaren. Rapporterna om rapportskrivare beskrivs i avsnittet om rapportskrivare.
Control flowEdit
COBOLs villkorliga uttalanden är IF
och EVALUERA
. EVALUERA
är ett switchliknande uttalande med den extra förmågan att utvärdera flera värden och villkor. Detta kan användas för att implementera beslutstabeller. Till exempel kan följande användas för att styra en CNC-svarv:
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
Uttrycket PERFORM
används för att definiera loopar som körs tills ett villkor är sant (inte medan det är sant, vilket är vanligare på andra språk). används också för att anropa procedurer eller intervall för procedurer (se proceduravsnittet för mer information). CALL
och INVOKE
anropar underprogram respektive metoder. Namnet på underprogrammet / metoden finns i en str ing som kan vara en bokstav eller ett dataobjekt. Parametrar kan skickas genom referens, efter innehåll (där en kopia skickas med referens) eller efter värde (men endast om en prototyp är tillgänglig). AVBRYT
laddar ner underprogram från minne. GO TO
får programmet att hoppa till en specificerad procedur.
GOBACK
statement är ett returuttalande och STOP
uttalandet stoppar programmet. Uttrycket EXIT
har sex olika format: det kan användas som ett returuttalande, ett pausmeddelande, ett fortsättningsuttalande, en slutmarkör eller för att lämna en procedur.
Undantag tas upp med ett RAISE
-uttalande och fångas med en hanterare, eller deklarativ, definierad i FÖRKLARINGAR
del av proceduruppdelningen. Deklarativ är avsnitt som börjar med en ANVÄNDNING
som anger vilka fel som ska hanteras. Undantag kan vara namn eller objekt. RESUME
används i en deklarativ för att hoppa till uttalandet efter det som tog upp undantaget eller till en procedur utanför FÖRKLARINGAR
. Till skillnad från andra språk kan det hända att obefångade undantag inte avslutar programmet och programmet kan fortsätta opåverkat.
I / OEdit
Fil I / O hanteras av den självbeskrivande ÖPPEN
, STÄNG
, LÄS
, och SKRIVA
uttalanden tillsammans med ytterligare tre: REWRITE
, som uppdaterar en post; START
, som väljer efterföljande poster för åtkomst genom att hitta en post med en viss nyckel; och UNLOCK
, vilket släpper ett lås på den senast postade enheten.
Användarinteraktion görs med ACCEPT
och DISPLAY
.
Data manipulationEdit
Följande verb manipulerar data:
-
INITIALIZE
, som ställer in dataobjekt till standardvärden. -
MOVE
, som tilldelar dataobjekt värden; MOVE CORRESPONDING tilldelar motsvarande fält med samma namn. -
SET
, som har 15 format: det kan ändra index, tilldela objektreferenser och ändra tabell kapacitet, bland andra funktioner. -
LÄGG TILL
,SUBTRAKT
,FLERA
,DIVIDE
ochCOMPUTE
, som hanterar aritmetik (medCOMPUTE
som tilldelar resultatet av en formel till en variabel). -
TILLDELA
ochGRATIS
, som hanterar dynamiskt minne. -
VALIDATE
, som validerar och distribuerar data enligt specifikationen i artikelns beskrivning i datadelningen. -
STRING
ochUNSTRING
, som sammanfogar respektive delar strängar. -
INSPEKT
, som stämmer eller ersätter instanser av angivna underlag i en sträng. -
SÖK
, som söker i en tabell efter den första posten uppfyller ett villkor.
Filer och tabeller sorteras med SORT
och MERGE
verb slår samman och sorterar filer. RELEASE
verbet ger poster att sortera och RETURN
hämtar sorterade poster i ordning.
Scope terminationEdit
Vissa påståenden, såsom IF
och LÄS
, kan själva innehålla uttalanden. Sådana uttalanden kan avslutas på två sätt: genom en period (implicit avslutning), som avslutar alla obestämda uttalanden som finns, eller av en scope-terminator, som avslutar närmaste matchande öppna uttalande.
Kapslade uttalanden avslutas med en period är en vanlig källa till buggar. Undersök till exempel följande kod:
IF x DISPLAY y. DISPLAY z.
Här är avsikten att visa y
och z
om villkoret x
är sant. z
visas dock oavsett värdet av x
eftersom IF
-uttalandet avslutas av en felaktig period efter DISPLAY y
.
Ett annat fel är ett resultat av det dinglande annat-problemet, när två IF
uttalanden kan associeras med en ELSE
.
IF x IF y DISPLAY aELSE DISPLAY b.
I ovanstående fragment associeras ELSE
till IF y
-uttalandet istället för IF x
uttalande, orsakar ett fel. Före införandet av explicita räckviddsterminatorer skulle det krävas att ÄNDRA NÄSTA SENTNING
placeras efter den inre IF
.
Självmodifierande kodRedigera
COBOL-specifikationen i original (1959) stödde den ökända ALTER X FÖR ATT GÅ TILL Y uttalande, för vilket många kompilatorer genererade självmodifierande kod.
X
och Y
är proceduretiketter och den enskilda GÅ TILL
uttalande i procedur X
utfört efter ett sådant ALTER
uttalande betyder GÅ TILL Y
istället. Många kompilatorer stöder det fortfarande, men det ansågs föråldrat i COBOL 1985-standarden och raderades 2002.
Uttrycket ALTER
betraktades dåligt eftersom det undergrävde ”sammanhangets lokalitet” och gjorde det svårt att förstå ett program ”övergripande logik. Som lärobokförfattaren Daniel D. McCracken skrev 1976, när” någon som aldrig har sett programmet förut måste bli bekant med det så snabbt som möjligt , ibland under kritiskt tidspress på grund av att programmet har misslyckats … synet av ett GO TO-uttalande i ett stycke av sig själv, som signalerar som det gör att det finns ett okänt antal ALTER-uttalanden på okända platser i hela programmet, hjärtat hos den modigaste programmeraren. ”
Hej, worldEdit
Ett” Hello, world ”-program i COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
När det – nu berömda – ”Hello, World!” -exemplet i The C Programming Language publicerades första gången 1978 en liknande maj nframe COBOL-programexempel skulle ha skickats via JCL, med stor sannolikhet med hjälp av en stansningskortläsare och 80 kolonnstanskort. Listan nedan, med en tom DATAINDELNING, testades med GNU / Linux och System / 370 Hercules-emulatorn som kör MVS 3.8J. JCL, skriven i juli 2015, härrör från Hercules-självstudier och prover som Jay Moseley har. I linje med COBOL-programmeringen av den tiden, HELLO, WORLD visas med alla versaler.
Efter att ha skickat JCL visas MVS-konsolen:
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
Rad 10 i konsollistan ovan är markerad för effekt, är markeringen inte en del av den faktiska konsolutgången.
Den tillhörande kompilatorlistan genererade över fyra sidor med teknisk information och jobbkörningsinformation, för den enskilda utmatningsraden från de 14 raderna COBOL.