COBOL (Dansk)

SyntaxEdit

COBOL har en engelsk-lignende syntaks, som bruges til at beskrive næsten alt i et program. For eksempel kan en betingelse udtrykkes som x ER STØRRE EN y eller mere kortfattet som x STØRRE y eller x > y . Mere komplekse forhold kan “forkortes” ved at fjerne gentagne betingelser og variabler. For eksempel a > b OG en > c ELLER a = d kan forkortes til a > b OG c ELLER = d . For at understøtte denne engelsk-lignende syntaks har COBOL over 300 nøgleord. Nogle af nøgleordene er enkle alternative eller pluraliserede stavemåder med det samme ord, som giver flere engelsklignende udsagn og sætninger; f.eks. IN og OF nøgleordene kan bruges om hverandre, ligesom ER og ER og VALUE og VÆRDIER .

Hvert COBOL-program består af fire grundlæggende leksikale emner: ord, bogstaver, billedkarakterstrenge (se § BILLEDE klausul) og separatorer. Ord inkluderer reserverede ord og brugerdefinerede identifikatorer. De kan indeholde op til 31 tegn og kan omfatte bogstaver, cifre, bindestreger og understregninger. Bogstaver inkluderer tal (f.eks. 12 ) og strenge (f.eks. "Hej!" ). Separatorer inkluderer mellemrumstegn og kommaer og semikolon efterfulgt af et mellemrum.

Et COBOL-program er opdelt i fire divisioner: identifikationsafdelingen, miljøafdelingen, datadelingen og procedureafdelingen. Identifikationsafdelingen specificerer kildeelementets navn og type og er, hvor klasser og grænseflader er specificeret. Miljøafdelingen specificerer alle programfunktioner, der afhænger af det system, der kører det, såsom filer og tegnsæt. Datadelingen bruges til at deklarere variabler og parametre. Procedurdivisionen indeholder programets udsagn. Hver division er opdelt i sektioner, der består af afsnit.

MetalanguageEdit

COBOLs syntaks er normalt beskrevet med en unik metalsprog ved hjælp af seler, beslag, stænger og understregning. Metalsproget blev udviklet til de originale COBOL-specifikationer. Selvom Backus – Naur-form eksisterede på det tidspunkt, havde udvalget ikke hørt om det.

Elementer af COBOLs metalsprog
Element Udseende Funktion
Alle hovedstæder EKSEMPEL Reserveret ord
Understreget EKSEMPEL Det reserverede ord er obligatorisk
seler {} Der kan kun vælges en mulighed
Beslag Nul eller en indstilling kan vælges
Ellipsis Det foregående element kan gentages
Barer {| |} En eller flere indstillinger kan vælges. Enhver indstilling kan kun vælges en gang.
Nul eller flere indstillinger kan vælges. Enhver indstilling kan kun være valgt en gang.

Som et eksempel er consi der følgende beskrivelse af en ADD udsagn:

Denne beskrivelse tillader følgende 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"

Kodeformat Rediger

COBOL kan skrives i to formater: fast (standard) eller gratis. I fast format skal koden justeres for at passe i bestemte områder (hold-over fra brug af stansede kort).Indtil COBOL 2002 var disse:

Navn Kolonne (s) Anvendelse
Sekvensnummerområde 1–6 Oprindeligt brugt til kort / linjenumre (letter mekanisk stanset kortsortering for at sikre den tilsigtede programkodesekvens efter manuel redigering / håndtering), dette område ignoreres af kompilatoren
Indikatorområde 7 Følgende tegn er tilladt her:

  • * – Kommentarlinje
  • / – Kommentarlinje, der udskrives på en ny side i en kildeliste
  • - – Fortsættelseslinje, hvor ord eller bogstaver fra forrige linje fortsættes
  • D – Linie aktiveret i fejlretningstilstand, som ellers ignoreres
Område A 8–11 Dette indeholder: DIVISION, SECTION og procedureoverskrifter; 01 og 77 niveau numre og fil / rapport deskriptorer
Område B 12–72 Enhver anden kode er ikke tilladt i område Et
Programnavneområde 73– Historisk op til kolonne 80 for stansede kort bruges det til at identificere programmet eller rækkefølge kortet tilhører

I COBOL 2002 var område A og B fusioneret for at danne programtekstområdet, som nu ender i en implementeringsdefineret kolonne.

COBOL 2002 introducerede også kode i frit format. Koden i frit format kan placeres i enhver kolonne i filen som på nyere programmeringssprog. Kommentarer specificeres ved hjælp af *>, som kan placeres hvor som helst og også kan bruges i fast kildekode. Fortsættelseslinjer er ikke til stede, og >>PAGE -direktivet erstatter / -indikatoren.

Identifikations divisionEdit

Identifikationsafdelingen identificerer følgende kodeenhed og indeholder definitionen af en klasse eller grænseflade.

Objektorienteret programmering Rediger

Klasser og grænseflader har været i COBOL siden 2002. Klasser har fabriksobjekter, der indeholder klassemetoder og variabler, og instansobjekter, der indeholder instansmetoder og variabler. Arv og grænseflader giver polymorfisme. Understøttelse af generisk programmering leveres gennem parametriserede klasser, som kan instantieres til at bruge enhver klasse eller grænseflade. Objekter gemmes som referencer, der kan være begrænset til en bestemt type. Der er to måder at kalde en metode på: INVOKE udsagn, der fungerer på samme måde som CALL , eller via inline-metodeopkald, som er analog med brug af funktioner.

*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation

COBOL giver ikke en måde at skjule metoder på. Klassedata kan dog skjules ved at erklære dem uden en PROPERTY -klausul, hvilket efterlader brugeren uden adgang til dem. Metodeoverbelastning blev tilføjet i COBOL 2014.

Environment divisionEdit

Miljøafdelingen indeholder konfigurationsafsnittet og input-output sektionen. Konfigurationsafsnittet bruges til at specificere variable funktioner såsom valutategn, lokaliteter og tegnsæt. Input-output sektionen indeholder filrelaterede oplysninger.

FilesEdit

COBOL understøtter tre filformater eller organisationer: sekventiel, indekseret og relativ. I sekventielle filer er poster sammenhængende og skal gennemgås sekventielt på samme måde som en linket liste. Indekserede filer har et eller flere indekser, der giver adgang til poster tilfældigt, og som kan sorteres på dem. Hver post skal have en unik nøgle, men andre alternative taster behøver ikke at være unikke. Implementeringer af indekserede filer varierer mellem leverandører, selvom almindelige implementeringer, såsom C ‑ ISAM og VSAM, er baseret på IBMs ISAM. Relative filer, som indekserede filer, har en unik record-nøgle, men de har ikke alternative nøgler. A relativ rekords nøgle er dens ordinære position; for eksempel har den 10. post en nøgle på 10. Dette betyder, at oprettelse af en post med en nøgle på 5 kan kræve oprettelse af (tomme) forudgående poster. Relative filer giver også mulighed for både sekventiel og tilfældig adgang.

En fælles ikke-standardudvidelse er den sekventielle linieorganisation, der bruges til at behandle tekstfiler. Optegnelser i en fil afsluttes med en ny linje og kan have varierende længde.

Data divisionEdit

Datainddelingen er opdelt i seks sektioner, der erklærer forskellige poster: filafsnittet, for arkivoptegnelser; sektionen arbejdslager til statiske variabler; afsnittet om lokal opbevaring til automatiske variabler; koblingsafsnittet for parametre og returværdien rapportsektionen og skærmafsnittet til tekstbaserede brugergrænseflader.

Samlede dataEdit

Dataelementer i COBOL erklæres hierarkisk ved hjælp af niveau-tal, der angiver, om et dataelement er en del af et andet. En vare med et højere niveau-nummer er underordnet en vare med et lavere nummer. Dataelementer på øverste niveau med et niveau-nummer 1 kaldes poster. Elementer, der har underordnede samlede data kaldes gruppeposter; dem der ikke kaldes elementære genstande. Niveau-tal, der bruges til at beskrive standarddataelementer, er mellem 1 og 49.

I ovenstående eksempel er elementært element num og gruppeelement datoen er underordnet posten noget-record , mens elementære elementer året , måneden og -dag er en del af gruppeelementet datoen .

Underordnede genstande kan være entydige med IN (eller OF ) nøgleord. Overvej for eksempel eksempelkoden ovenfor sammen med følgende eksempel:

 01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.

Navnene året , måneden og dagen er i sig selv tvetydige, da mere end et dataelement er defineret med disse navne. For at specificere et bestemt dataelement, for eksempel et af elementerne indeholdt i salgsdato -gruppen, bruger programmøren året IN salgsdato (eller det tilsvarende året FOR salgsdato ). (Denne syntaks svarer til "priknotationen", der understøttes af de fleste moderne sprog.)

Andre dataniveauer Rediger

Et niveau-antal på 66 bruges til at erklære en omgruppering af tidligere definerede emner, uanset hvordan disse emner er struktureret. Dette dataniveau, der også henvises til i den tilknyttede RENAMES -klausul, bruges sjældent og blev omkring 1988 normalt fundet i gamle programmer. Dens evne til at ignorere de hierarkiske og logiske strukturdata betød, at brugen ikke blev anbefalet, og mange installationer forbød brugen.

Et 77-niveau-nummer angiver, at varen er enkeltstående, og i sådanne situationer svarer til niveau-nummeret 01. For eksempel erklærer den følgende kode to dataelementer på 77 niveauer, property-name og salgsregion , som er ikke-gruppedataelementer, der er uafhængige af (ikke underordnet) andre dataposter:

 77 property-name PIC X(80). 77 sales-region PIC 9(5).

Et 88-niveau-nummer erklærer et betingelsesnavn (et såkaldt 88-niveau), som er sandt, når dets overordnede dataelement indeholder en af de værdier, der er angivet i dets VALUE klausul. For eksempel definerer den følgende kode to 88-niveau-betingelsesnavnelementer, der er sande eller falske, afhængigt af den aktuelle tegndataværdi for datadelen løntype . Når dataelementet indeholder en værdi på "H" , er betingelsesnavnet løn-pr. Time er sandt, mens når det indeholder en værdi på "S" eller "Y" , er betingelsesnavnet løn-årligt sandt. Hvis dataelementet indeholder en anden værdi, er begge betingelsesnavne falske.

 01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".

Datatyper Rediger

Standard COBOL giver følgende datatyper:

Datatype Prøveerklæring Noter
Alfabetisk PIC A (30) Må kun indeholde bogstaver eller mellemrum
Alfanumerisk PIC X (30) Kan indeholde alle tegn
Boolsk PIC 1 BRUGSBIT Data gemt i form af 0s og 1s som et binært tal
Indeks BRUGSINDEKS Bruges til at henvise til tabelelementer
National PIC N (30) Svarende til alfanumerisk, men bruger et udvidet tegn sæt, f.eks. UTF-8
Numerisk PIC 9 (5) V9 (5) Kan kun indeholde tal
Objekt BRUG OBJECT REFERENCE Kan henvise til enten et objekt eller NULL
Markør BRUGSPINTER

Type sikkerhed er variabel i COBOL.Numeriske data konverteres mellem forskellige repræsentationer og størrelser lydløst, og alfanumeriske data kan placeres i ethvert dataelement, der kan lagres som en streng, inklusive numeriske data og gruppedata. I modsætning hertil kan objektreferencer og markører kun tildeles fra emner af samme type, og deres værdier kan være begrænset til en bestemt type.

PICTURE clauseEdit

A PICTURE (eller PIC ) klausul er en række tegn, der hver repræsenterer en del af dataelementet og hvad den kan indeholde. Nogle billedkarakterer angiver typen af elementet, og hvor mange tegn eller cifre det optager i hukommelsen. For eksempel angiver et 9 et decimaltal, og et S angiver, at varen er underskrevet. Andre billedkarakterer (kaldet indsættelse og redigering af tegn) angiver, hvordan et element skal formateres. For eksempel definerer en række + tegn karakterpositioner samt hvordan et ledende tegntegn skal placeres inden i de endelige karakterdata; det ikke-numeriske tegn til højre indeholder elementets tegn, mens andre tegnpositioner, der svarer til et + til venstre for denne position, indeholder et mellemrum. tegn kan specificeres mere præcist ved at angive et tal i parentes efter et billedkarakter. F.eks. svarer 9 (7) til 9999999 . Billedspecifikationer, der kun indeholder ciffer ( 9 ) og tegn ( S ) tegn definerer rent numeriske dataelementer, mens billedspecifikationer indeholder alfabetisk ( A ) eller alfanumerisk ( X ) tegn definerer alfanumeriske dataelementer. Tilstedeværelsen af andre formateringstegn definerer redigerede numeriske eller redigerede alfanumeriske dataelementer.

BRUG clauseEdit

ANVENDELSE klausul erklærer formatet data gemmes i. Afhængigt af datatypen kan de enten supplere eller bruges i stedet for en BILLEDE -klausul. Selvom det kan bruges til at erklære markører og objektreferencer, er det hovedsagelig rettet mod at specificere numeriske typer. Disse numeriske formater er:

  • Binær, hvor en minimumsstørrelse enten er specificeret af PICTURE -sætningen eller af en USAGE klausul såsom BINARY-LONG.
  • BRUG COMPUTATIONAL , hvor data kan være gemt i det format, implementeringen giver; svarer ofte til BRUG BINÆR
  • BRUG DISPLAY , standardformatet , hvor data lagres som en streng
  • Flydepunkt, enten i et implementeringsafhængigt format eller i henhold til IEEE 754.
  • BRUG NATIONAL , hvor data lagres som en streng ved hjælp af et udvidet tegnsæt
  • BRUG PACKED-DECIMAL , hvor data gemmes i det mindste mulige decimalformat (typisk pakket binært kodet decimal)

Report writerEdit

Rapportskribenten er en deklarativ facilitet til oprettelse af rapporter. Programmøren behøver kun at specificere rapportlayoutet og de data, der kræves for at producere det, hvilket frigør dem fra at skulle skrive kode for at håndtere ting som sideskift, dataformatering og overskrifter og fodfæste.

Rapporter er knyttet til rapporten filer, som er filer, der kun kan skrives til gennem rapportforfatterudtalelser.

 FD report-out REPORT sales-report.

Hver rapport er defineret i rapportsektionen af datadivisionen. En rapport er opdelt i rapportgrupper, der definerer rapportens overskrifter, fodfæste og detaljer. Rapporter arbejder omkring hierarkiske kontrolbrud. Kontrolbrud opstår, når en nøglevariabel ændrer dens værdi; for eksempel når der oprettes en rapport, der beskriver kundernes “ordrer, en kontrolafbrydelse kan forekomme, når programmet når en anden kundes ordrer. Her er et eksempel på en rapportbeskrivelse for en rapport, der giver en sælgers salg, og som advarer om ugyldige poster:

Ovenstående rapportbeskrivelse beskriver følgende layout:

Fire udsagn styrer rapportforfatteren: INITIATE , der forbereder rapportskriveren til udskrivning; GENERER , der udskriver en rapportgruppe; SUPPRESS , der undertrykker udskrivning af en rapportgruppe; og TERMINATE , som afslutter rapportbehandlingen.For ovennævnte salgsrapporteksempel kan procedurdivisionen se sådan ud:

 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 .

Brug af Report Writer-faciliteten varierede ofte betydeligt; nogle organisationer brugte det i vid udstrækning og andre slet ikke. Derudover varierede implementeringerne af Report Writer i kvalitet, idet de i den nederste ende undertiden brugte for store mængder hukommelse under kørsel.

Procedure divisionEdit

ProcedurerEdit

Afsnittene og afsnit i procedureafdelingen (samlet kaldet procedurer) kan bruges som etiketter og som enkle underrutiner. I modsætning til i andre divisioner behøver afsnit ikke være i sektioner. Udførelse går gennem procedurerne i et program, indtil det afsluttes. For at bruge procedurer som underrutiner skal PERFORM verb bruges.

En UDFØRELSE udsagn ligner noget en procedureopkald på et moderne sprog i den forstand, at udførelse vender tilbage til koden efter PERFORM udsagn i slutningen af den kaldte kode; det tilvejebringer dog ingen mekanisme til parameteroverføring eller til returnering af en resultatværdi. Hvis en underrutine påberåbes ved hjælp af en simpel sætning som UDFØR subrutine , vender kontrol tilbage i slutningen af den kaldte procedure. PERFORM er dog usædvanligt, fordi det kan bruges til at kalde et område, der spænder over en sekvens af flere tilstødende procedurer. Dette gøres 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".

Output af dette program vil være: “AABC”.

PERFORM adskiller sig også fra konventionelle procedurekald i at der i det mindste traditionelt ikke er nogen forestilling om en opkaldsstak. Som en konsekvens er indlejrede invokationer mulige (en sekvens af kode, der er PERFORM “ed kan udføre en PERFORM selve udsagnet), men kræver ekstra forsigtighed, hvis dele af den samme kode udføres af begge påkald. Problemet opstår, når koden i den indre påkaldelse når udgangspunktet for den ydre påkaldelse. Mere formelt, hvis kontrol passerer gennem udgangspunkt for en PERFORM -opkald, der blev kaldt tidligere, men endnu ikke er afsluttet, COBOL 2002-standarden foreskriver officielt, at adfærden er udefineret.

Årsagen er, at COBOL snarere end en “returadresse” fungerer med det, der kan kaldes en fortsættelsesadresse. Når kontrolstrømmen når slutningen af en hvilken som helst procedure, bliver fortsættelsesadressen slået op, og styringen overføres til den adresse. programmet kører, initialiseres fortsættelsesadressen for hver procedure til proffens startadresse cedure, der kommer næste i programteksten, så hvis der ikke sker PERFORM udsagn, flyder kontrol fra top til bund gennem programmet. Men når en PERFORM -sætning udføres, ændrer den fortsættelsesadressen for den kaldte procedure (eller den sidste procedure i det kaldte område, hvis PERFORM THRU blev brugt), så kontrollen vender tilbage til opkaldsstedet i slutningen. Den oprindelige værdi gemmes og gendannes bagefter, men der er kun én lagringsposition. Hvis to indlejrede påkaldelser fungerer på overlappende kode, kan de forstyrre hinandens styring af fortsættelsesadressen på flere måder.

Følgende eksempel (taget fra Veerman & Verhoeven 2006) illustrerer problemet:

Man kunne forvente, at output fra dette program ville være “1 2 3 4 3”: Efter at have vist “2”, den anden PERFORM får “3” og “4” til at blive vist, og derefter fortsætter den første påkaldelse med “3”. I traditionelle COBOL-implementeringer er dette ikke tilfældet. Snarere den første PERFORM sætning sætter fortsættelsesadressen i slutningen af LABEL3 , så den springer tilbage til kald websted inde i LABEL1 . Den anden PERFORM sætning returnerer i slutningen af LABEL4 men ændrer ikke fortsættelsesadressen til LABEL3 og forventer, at det er standard fortsættelsen. Når den indre påkaldelse ankommer til slutningen af LABEL3 , springer den således tilbage til den ydre PERFORM erklæring, og programmet stopper med at have udskrevet bare "1 2 3". På den anden side interfererer de to PERFORM udsagn ikke i hinanden i nogle COBOL-implementeringer som open source TinyCOBOL-kompilatoren, og output er faktisk "1 2 3 4 3 ".Derfor er adfærden i sådanne tilfælde ikke kun (måske) overraskende, den er heller ikke bærbar.

En særlig konsekvens af denne begrænsning er, at PERFORM kan ikke bruges til at skrive rekursiv kode. Et andet simpelt eksempel for at illustrere dette (let forenklet fra 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 forvente, at output er “1 2 3 END END END”, og faktisk er det, hvad nogle COBOL-kompilatorer vil producere. Men nogle compilere, som IBM COBOL, vil producere kode, der udskriver “1 2 3 END END END END …” og så videre og udskriver “END” igen og igen i en endeløs løkke. Da der er begrænset plads til lagring af fortsættelsesadresser til sikkerhedskopier, overskrives sikkerhedskopierne i løbet af rekursive invokationer, og alt hvad der kan gendannes, er springet tilbage til DISPLAY "END" .

StatementsEdit

COBOL 2014 har 47 udsagn (også kaldet verb), som kan grupperes i følgende brede kategorier: kontrolflow, I / O, datamanipulation og rapportforfatteren. Rapporterne om rapportskrivere er dækket af sektionen for rapportforfatter.

Control flowEdit

COBOL “s betingede udsagn er IF og EVALUERING . EVALUERING er en switch-lignende sætning med den ekstra evne til at evaluere flere værdier og betingelser. Dette kan bruges til at implementere beslutningstabeller. F.eks. kan følgende bruges til at styre en CNC-drejebænk:

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

Udtalelsen PERFORM bruges til at definere sløjfer, der udføres, indtil en betingelse er sand (ikke mens den er sand, hvilket er mere almindeligt på andre sprog). bruges også til at kalde procedurer eller intervaller for procedurer (se afsnittet procedurer for flere detaljer). CALL og INVOKE kaldes henholdsvis underprogrammer og metoder Navnet på underprogrammet / metoden er indeholdt i en str ing, der kan være en bogstavelig eller et dataelement. Parametre kan overføres ved reference, efter indhold (hvor en kopi sendes med reference) eller efter værdi (men kun hvis en prototype er tilgængelig). ANNULLER aflaster underprogrammer fra hukommelsen. GO TO får programmet til at springe til en bestemt procedure.

GOBACK statement er en return statement, og STOP sætningen stopper programmet. EXIT -erklæringen har seks forskellige formater: den kan bruges som en returerklæring, en pauseerklæring, en fortsættelseserklæring, en slutmarkør eller til at forlade en procedure.

Undtagelser hæves ved en RAISE -erklæring og fanges med en handler eller erklærende defineret i ERKLÆRINGER del af procedureafdelingen. Deklarativer er sektioner, der begynder med en USE -erklæring, der angiver de fejl, der skal håndteres. Undtagelser kan være navne eller objekter. RESUME bruges i en deklarativ til at springe til udsagnet efter den, der hævde undtagelsen eller til en procedure uden for ERKLÆRINGER . I modsætning til andre sprog kan ikke fangede undtagelser muligvis ikke afslutte programmet, og programmet kan fortsætte upåvirket.

I / OEdit

Fil I / O håndteres af den selvbeskrivende ÅBEN , LUK , LÆS , og OPSKRIFT udsagn sammen med yderligere tre: OMSKRIV , som opdaterer en post; START , som vælger efterfølgende poster til adgang ved at finde en post med en bestemt nøgle; og UNLOCK , som frigiver en lås på den sidst tilsluttede post.

Brugerinteraktion udføres ved hjælp af ACCEPT og DISPLAY .

DatamanipulationEdit

Følgende verbs manipulerer data:

  • INITIALIZE , som sætter dataelementer til deres standardværdier.
  • MOVE , som tildeler dataelementer værdier; MOVE CORRESPONDING tildeler tilsvarende ligesom navngivne felter.
  • SET , som har 15 formater: det kan ændre indekser, tildele objektreferencer og ændre tabel kapaciteter, blandt andre funktioner.
  • TILFØJ , SUBTRAKT , FLERE , DIVIDE og COMPUTE , som håndterer aritmetik (med COMPUTE , der tildeler resultatet af en formel til en variabel).
  • TILDEL og GRATIS , som håndterer dynamisk hukommelse.
  • VALIDATE , som validerer og distribuerer data som specificeret i en artikels beskrivelse i datadivisionen.
  • STRING og UNSTRING , som hhv. Sammenkæder og opdeler strenge.
  • INSPEKT , som taler eller erstatter forekomster af specificerede understrenge i en streng.
  • SØG , som søger i en tabel efter den første post opfylder en betingelse.

Filer og tabeller sorteres ved hjælp af SORT og MERGE verb fletter og sorterer filer. RELEASE verbet giver poster, der skal sorteres, og RETURN henter sorterede poster i rækkefølge.

Omfangsafslutning Rediger

Nogle udsagn, såsom IF og LÆS , kan selv indeholde udsagn. Sådanne udsagn kan afsluttes på to måder: af en periode (implicit opsigelse), der afslutter alle indeholdte ikke-afsluttede udsagn, eller af en scope-terminator, der afslutter den nærmeste matchende åbne sætning.

Indlejrede udsagn afsluttet med en periode er en almindelig kilde til fejl. Undersøg for eksempel følgende kode:

IF x DISPLAY y. DISPLAY z.

Her er hensigten at vise y og z hvis betingelse x er sand. z vises dog uanset værdien af x fordi IF udsagnet afsluttes af en fejlagtig periode efter VISNING y .

En anden fejl er et resultat af dinglende andet problem, når to IF udsagn kan knyttes til en ELSE.

IF x IF y DISPLAY aELSE DISPLAY b.

I ovenstående fragment associeres ELSE til IF y -sætningen i stedet for IF x -erklæring, der forårsager en fejl. Forud for introduktionen af eksplicitte omfangsterminatorer ville forhindring af det kræve, at NÆSTE NÆSTE SENTNING placeres efter den indre IF .

Selvmodificerende kodeRediger

Den originale (1959) COBOL-specifikation understøttede den berygtede ALTER X FOR AT FORTSAT TIL Y erklæring, for hvilken mange kompilatorer genererede selvmodificerende kode. X og Y er etiketter til proceduren, og den eneste GÅ TIL erklæring i procedure X udført efter en sådan ALTER udsagn betyder GÅ TIL Y i stedet. Mange kompilatorer understøtter stadig det, men det blev anset forældet i COBOL 1985-standarden og slettet i 2002.

ALTER udsagnet blev dårligt anset fordi det underminerede “lokalitet af kontekst” og gjorde et programs “overordnede logik vanskelig at forstå. Som lærebogforfatter Daniel D. McCracken skrev i 1976, når” en, der aldrig har set programmet før, skal blive fortrolig med det så hurtigt som muligt , undertiden under kritisk tidspres, fordi programmet er mislykket … synet af en GO TO-sætning i et afsnit i sig selv, der signaliserer, som det gør eksistensen af et ukendt antal ALTER-udsagn på ukendte steder i hele programmet, rammer frygt for hjertet til den modigste programmør. “

Hej, worldEdit

Et” Hello, world “-program i COBOL:

 IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .

Da det – nu berømte – “Hello, World!” – programeksempel i C Programming Language første gang blev offentliggjort i 1978, blev en lignende mai nframe COBOL-programeksempel ville være blevet sendt gennem JCL, sandsynligvis ved hjælp af en stansekortlæser og 80 søjleslagskort. Nedenstående liste med en tom DATADIVISION blev testet ved hjælp af GNU / Linux og System / 370 Hercules-emulatoren, der kører MVS 3.8J. JCL, skrevet i juli 2015, er afledt af Hercules-selvstudier og prøver, der hostes af Jay Moseley. I overensstemmelse med COBOL-programmeringen fra den æra vises HELLO, WORLD med alle store bogstaver.

Efter indsendelse af JCL vises MVS-konsollen:

 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

Linje 10 i konsollisten ovenfor er fremhævet for effekt, fremhævningen er ikke en del af den faktiske konsoloutput.

Den tilknyttede compilerfortegnelse genereret over fire sider med tekniske detaljer og jobkørselsoplysninger til den eneste outputlinje fra de 14 linjer i COBOL.

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *