COBOL (Svenska)

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 av COBOLs metaspråk
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:

  • * – Kommentarrad
  • / – Kommentarrad som kommer att skrivas ut på en ny sida i en källlista
  • - – Fortsättningsrad, där ord eller bokstäver från föregående rad fortsätter
  • D – Linje aktiverad i felsökningsläge, vilket annars ignoreras
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 en USAGE klausul som BINARY-LONG.
  • ANVÄNDNINGSDATOR , där data kan finnas lagras i vilket format som implementeringen ger; ofta motsvarande ANVÄ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 , och förväntar oss att det ska vara standard fortsättning. När den inre anropet anländer till slutet av 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 och COMPUTE , som hanterar aritmetik (med COMPUTE som tilldelar resultatet av en formel till en variabel).
  • TILLDELA och GRATIS , som hanterar dynamiskt minne.
  • VALIDATE , som validerar och distribuerar data enligt specifikationen i artikelns beskrivning i datadelningen.
  • STRING och UNSTRING , 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.

Leave a Reply

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *