COBOL

SyntaxEdit

COBOL heeft een Engels-achtige syntaxis, die wordt gebruikt om bijna alles in een programma te beschrijven. Een voorwaarde kan bijvoorbeeld worden uitgedrukt als x IS GROTER DAN y of beknopter als x GROTER y of x > y . Complexere voorwaarden kunnen worden “afgekort” door herhaalde voorwaarden en variabelen te verwijderen. Bijvoorbeeld a > b AND a > c OR a = d kan worden ingekort tot a > b AND c OR = d . Om deze Engels-achtige syntaxis te ondersteunen, heeft COBOL meer dan 300 trefwoorden. Enkele van de sleutelwoorden zijn eenvoudige alternatieve of meervoudige spellingen van hetzelfde woord, wat zorgt voor meer Engelstalige uitspraken en clausules; de trefwoorden IN en OF kunnen bijvoorbeeld door elkaar worden gebruikt, evenals IS en ZIJN , en WAARDE en WAARDEN .

Elk COBOL-programma bestaat uit vier elementaire lexicale items: woorden, letterlijke tekens, tekenreeksen van afbeeldingen (zie § PICTURE clausule) en scheidingstekens. Woorden omvatten gereserveerde woorden en door de gebruiker gedefinieerde identificatiegegevens. Ze zijn maximaal 31 tekens lang en kunnen letters, cijfers, koppeltekens en underscores bevatten. Letterlijke tekens zijn onder meer cijfers (bijv. 12 ) en strings (bijv. "Hallo!" ). Scheidingstekens bevatten de spatie en komma’s en puntkomma’s gevolgd door een spatie.

Een COBOL-programma is opgesplitst in vier divisies: de identificatiedivisie, de omgevingsdivisie, de datadivisie en de proceduredivisie. De identificatieafdeling specificeert de naam en het type van het bronelement en is waar klassen en interfaces worden gespecificeerd. De omgevingsafdeling specificeert alle programmafuncties die afhankelijk zijn van het systeem dat het uitvoert, zoals bestanden en tekensets. De gegevensverdeling wordt gebruikt om variabelen en parameters te declareren. De procedure-divisie bevat de instructies van het programma. Elke divisie is onderverdeeld in secties, die bestaan uit alinea’s.

MetalanguageEdit

De syntaxis van COBOL wordt gewoonlijk beschreven met een unieke metataal met beugels, haakjes, staven en onderstreping. De metataal is ontwikkeld voor de originele COBOL-specificaties. Hoewel de Backus-Naur-vorm destijds bestond, had de commissie er nog nooit van gehoord.

Elementen van de metataal van COBOL
Element Uiterlijk Functie
Hoofdletters VOORBEELD Gereserveerd woord
Onderstrepen VOORBEELD Het gereserveerde woord is verplicht
Accolades {} Er mag slechts één optie worden geselecteerd
Haakjes Nul of één optie kan worden geselecteerd
Ellipsis Het voorgaande element mag worden herhaald
Bars {| |} Er kunnen een of meer opties worden geselecteerd. Elke optie mag slechts één keer worden geselecteerd.
Er kunnen nul of meer opties worden geselecteerd. Elke optie mag alleen zijn eenmaal geselecteerd.

Als voorbeeld der de volgende beschrijving van een ADD instructie:

Deze beschrijving laat de volgende varianten toe:

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"

Codeformaat Bewerken

COBOL kan in twee formaten worden geschreven: vast (standaard) of gratis. In een vast formaat moet de code worden uitgelijnd om in bepaalde gebieden te passen (een overblijfsel van het gebruik van ponskaarten).Tot COBOL 2002 waren dit:

Name Column (s) Gebruik
Volgnummergebied 1–6 Oorspronkelijk gebruikt voor kaart / regelnummers (waardoor het mechanisch sorteren van ponskaarten wordt vergemakkelijkt om de beoogde programmacode-volgorde te verzekeren na handmatige bewerking / verwerking), wordt dit gebied genegeerd door de compiler
Indicatorgebied 7 De volgende tekens zijn hier toegestaan:

  • * – Commentaarregel
  • / – Commentaarregel die op een nieuwe pagina van een bronvermelding wordt afgedrukt
  • - – Vervolgregel, waar woorden of letterlijke letters uit de vorige regel wordt vervolgd
  • D – Regel ingeschakeld in foutopsporingsmodus, die anders wordt genegeerd
Gebied A 8-11 Dit bevat: DIVISION, SECTION en procedure headers; 01 en 77 niveaunummers en bestands- / rapportbeschrijvingen
Gebied B 12-72 Elke andere code die niet is toegestaan in Gebied Een
Programmanaamgedeelte 73– Historisch gezien tot kolom 80 voor ponskaarten, wordt het gebruikt om het programma te identificeren of volgorde waartoe de kaart behoort

In COBOL 2002 waren de gebieden A en B samengevoegd om het programma-tekstgebied te vormen, dat nu eindigt in een door de implementator gedefinieerde kolom.

COBOL 2002 introduceerde ook vrije opmaakcode. Code in vrije indeling kan in elke kolom van het bestand worden geplaatst, net als in nieuwere programmeertalen. Opmerkingen worden gespecificeerd met behulp van *>, die overal kan worden geplaatst en ook kan worden gebruikt in broncode met een vast formaat. Vervolgregels zijn niet aanwezig en de >>PAGE -richtlijn vervangt de / -indicator.

Identification divisionEdit

De identificatiedivisie identificeert de volgende code-entiteit en bevat de definitie van een klasse of interface.

Objectgeoriënteerd programmeren Bewerken

Klassen en interfaces maken deel uit van COBOL sinds 2002. Klassen hebben fabrieksobjecten, die klassemethoden en variabelen bevatten, en instantieobjecten, die instantiemethoden en variabelen bevatten. Overerving en interfaces zorgen voor polymorfisme. Ondersteuning voor generiek programmeren wordt geboden via geparametriseerde klassen, die kunnen worden geïnstantieerd om elke klasse of interface te gebruiken. Objecten worden opgeslagen als referenties die mogelijk beperkt zijn tot een bepaald type. Er zijn twee manieren om een methode aan te roepen: de INVOKE -instructie, die op dezelfde manier werkt als CALL , of via inline methode-aanroep, die analoog is aan het gebruik van functies.

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

COBOL biedt geen manier om methoden te verbergen. Klassegegevens kunnen echter worden verborgen door ze te declareren zonder een PROPERTY -clausule, waardoor de gebruiker er geen toegang toe heeft. Methode-overbelasting is toegevoegd in COBOL 2014.

Environment divisionEdit

De omgevingsdivisie bevat de configuratiesectie en de input-output sectie. De configuratiesectie wordt gebruikt om variabele kenmerken te specificeren, zoals valutatekens, landinstellingen en tekensets. De input-output sectie bevat bestandsgerelateerde informatie.

FilesEdit

COBOL ondersteunt drie bestandsformaten, of organisaties: sequentieel, geïndexeerd en relatief. In opeenvolgende bestanden zijn records aaneengesloten en moeten ze opeenvolgend worden doorlopen, vergelijkbaar met een gekoppelde lijst. Geïndexeerde bestanden hebben een of meer indexen waardoor records willekeurig kunnen worden geopend en die daarop kunnen worden gesorteerd. Elk record moet een unieke sleutel hebben, maar andere, alternatieve recordsleutels hoeven niet uniek te zijn. Implementaties van geïndexeerde bestanden variëren van leverancier tot leverancier, hoewel gangbare implementaties, zoals C-ISAM en VSAM, zijn gebaseerd op IBM’s ISAM. Relatieve bestanden hebben, net als geïndexeerde bestanden, een unieke recordsleutel, maar geen alternatieve sleutels. A de sleutel van het relatieve record is de rangschikking; het 10e record heeft bijvoorbeeld een sleutel van 10. Dit betekent dat voor het maken van een record met een sleutel van 5 mogelijk (lege) voorgaande records moeten worden aangemaakt. Relatieve bestanden maken ook zowel sequentiële als willekeurige toegang mogelijk.

Een veel voorkomende niet-standaard extensie is de regelsequentiële organisatie, die wordt gebruikt om tekstbestanden te verwerken. Records in een bestand worden beëindigd door een nieuwe regel en kunnen een verschillende lengte hebben.

Gegevensverdeling Bewerken

De gegevensverdeling is opgesplitst in zes secties die verschillende items declareren: de bestandssectie, voor records opslaan; het werkgeheugengedeelte, voor statische variabelen; de sectie lokale opslag, voor automatische variabelen; het koppelingsgedeelte, voor parameters en de retourwaarde; het rapportgedeelte en het schermgedeelte, voor op tekst gebaseerde gebruikersinterfaces.

Geaggregeerde dataEdit

Data-items in COBOL worden hiërarchisch gedeclareerd door het gebruik van niveaunummers die aangeven of een data-item deel uitmaakt van een ander. Een item met een hoger levelnummer is ondergeschikt aan een item met een lager level. Gegevensitems op het hoogste niveau, met niveaunummer 1, worden records genoemd. Items met ondergeschikte geaggregeerde gegevens worden groepsitems genoemd; degenen die dat niet doen, worden elementaire items genoemd. Niveaunummers die worden gebruikt om standaardgegevensitems te beschrijven, liggen tussen 1 en 49.

In het bovenstaande voorbeeld elementair item num en groepsitem the-date zijn ondergeschikt aan het record some-record , terwijl elementaire items het jaar , de maand , en het -day maken deel uit van het groepsitem the-date .

Ondergeschikte items kunnen worden gedisambigueerd met de IN (of OF ) trefwoord. Bekijk bijvoorbeeld de voorbeeldcode hierboven samen met het volgende voorbeeld:

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

De namen het jaar , de maand , en de dag zijn op zichzelf dubbelzinnig, aangezien meer dan één gegevensitem met die namen is gedefinieerd. Om een bepaald data-item te specificeren, bijvoorbeeld een van de items in de sale-date groep, zou de programmeur het jaar IN verkoopdatum (of het equivalent het jaar VAN verkoopdatum ). (Deze syntaxis is vergelijkbaar met de “puntnotatie” die door de meeste hedendaagse talen wordt ondersteund.)

Andere gegevensniveaus Bewerken

Een niveaumetal van 66 wordt gebruikt om een hergroepering van eerder gedefinieerde items, ongeacht hoe die items zijn gestructureerd. Dit gegevensniveau, waarnaar ook wordt verwezen door de bijbehorende RENAMES -clausule, wordt zelden gebruikt en werd rond 1988 meestal aangetroffen in oude programma’s. Het vermogen om de hiërarchische en logische structuurgegevens te negeren, betekende dat het gebruik ervan niet werd aanbevolen en dat veel installaties het gebruik ervan verboden.

Een 77 niveaunummer geeft aan dat het item stand-alone is en in dergelijke situaties gelijk is aan het niveaunummer 01. De volgende code declareert bijvoorbeeld twee gegevensitems met 77 niveaus: eigenschapsnaam en verkoopregio , dit zijn niet-groepsgegevensitems die onafhankelijk zijn van (niet ondergeschikt aan) andere gegevensitems:

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

Een 88 level-nummer declareert een conditienaam (een zogenaamd 88-level) die waar is als het bovenliggende data-item een van de waarden bevat die gespecificeerd zijn in zijn VALUE -clausule. De volgende code definieert bijvoorbeeld twee voorwaarde-naamitems met 88 niveaus die waar of onwaar zijn, afhankelijk van de huidige tekengegevenswaarde van het loontype gegevensitem . Wanneer het gegevensitem de waarde "H" bevat, wordt de conditienaam loon-is-uur is waar, terwijl wanneer het de waarde "S" of "Y" , is de voorwaarde-naam loon-is-jaarlijks waar. Als het gegevensitem een andere waarde bevat, zijn beide voorwaarde-namen onwaar.

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

Gegevenstypen Bewerken

Standaard COBOL biedt de volgende gegevenstypen:

Gegevenstype Voorbeeldverklaring Opmerkingen
Alfabetisch PIC A (30) Mag alleen letters of spaties bevatten
Alfanumeriek PIC X (30) Mag willekeurige tekens bevatten
Booleaans PIC 1 USAGE BIT Gegevens opgeslagen in de vorm van nullen en enen, als een binair getal
Index GEBRUIK INDEX Gebruikt om te verwijzen naar tabelelementen
Nationaal PIC N (30) Lijkt op alfanumeriek, maar met een uitgebreid teken set, b.v. UTF-8
Numeriek PIC 9 (5) V9 (5) Mag alleen cijfers bevatten
Object GEBRUIKSOBJECTREFERENTIE Mag verwijzen naar een object of NULL
Pointer GEBRUIKSPUNT

Type veiligheid is variabel in COBOL.Numerieke gegevens worden stilzwijgend geconverteerd tussen verschillende weergaven en groottes en alfanumerieke gegevens kunnen in elk gegevensitem worden geplaatst dat als een string kan worden opgeslagen, inclusief numerieke en groepsgegevens. Objectreferenties en pointers mogen daarentegen alleen worden toegewezen vanuit items van hetzelfde type en hun waarden kunnen worden beperkt tot een bepaald type.

PICTURE clausuleEdit

A PICTURE (of PIC ) clausule is een reeks tekens, die elk een deel van het gegevensitem vertegenwoordigen en wat het kan bevatten. Sommige afbeeldingstekens specificeren het type item en hoeveel tekens of cijfers het in het geheugen in beslag neemt. Een 9 geeft bijvoorbeeld een decimaal cijfer aan, en een S geeft aan dat het item is ondertekend. Andere afbeeldingstekens (invoegen en bewerken van tekens genoemd) specificeren hoe een item moet worden opgemaakt. Een reeks van + -tekens definieert bijvoorbeeld zowel de tekenposities als hoe een voorloopteken in de uiteindelijke tekengegevens moet worden gepositioneerd; het meest rechtse niet-numerieke teken bevat het teken van het item, terwijl andere tekenposities die overeenkomen met een + links van deze positie een spatie zullen bevatten. Herhaald tekens kunnen beknopter worden gespecificeerd door een getal tussen haakjes op te geven na een afbeeldingsteken. 9 (7) is bijvoorbeeld gelijk aan 9999999 . Afbeeldingsspecificaties met alleen cijfer ( 9 ) en teken ( S ) -tekens definiëren puur numerieke gegevensitems, terwijl afbeeldingspecificaties alfabetisch ( A ) of alfanumeriek ( X ) tekens definiëren alfanumerieke gegevensitems. De aanwezigheid van andere opmaaktekens definieert bewerkte numerieke of bewerkte alfanumerieke gegevensitems.

USAGE-clausuleEdit

De USAGE geeft het formaat aan gegevens worden opgeslagen in. Afhankelijk van het gegevenstype, kan het een aanvulling zijn op of worden gebruikt in plaats van een PICTURE -clausule. Hoewel het kan worden gebruikt om pointers en objectreferenties te declareren, is het meestal gericht op het specificeren van numerieke typen. Deze numerieke formaten zijn:

  • Binair, waarbij een minimumgrootte wordt gespecificeerd door de PICTURE -clausule of door een USAGE clausule zoals BINARY-LONG.
  • GEBRUIK COMPUTATIONEEL , waar gegevens opgeslagen in het formaat dat de implementatie biedt; vaak gelijk aan GEBRUIKSBINAIRE
  • GEBRUIKSDISPLAY , het standaardformaat , waar gegevens worden opgeslagen als een string
  • Floating-point, in een implementatie-afhankelijke indeling of volgens IEEE 754.
  • GEBRUIK NATIONAAL , waar gegevens worden opgeslagen als een string met behulp van een uitgebreide tekenset
  • GEBRUIK PACKED-DECIMAL , waarbij gegevens wordt opgeslagen in het kleinst mogelijke decimale formaat (typisch verpakt binair gecodeerd decimaal)

Rapportschrijver Bewerken

De rapportschrijver is een declaratieve voorziening voor het maken van rapporten. De programmeur hoeft alleen de rapportlay-out en de gegevens die nodig zijn om het te produceren, te specificeren, waardoor ze geen code hoeven te schrijven om zaken als pagina-einden, gegevensopmaak en koppen en voetjes af te handelen.

Rapporten zijn gekoppeld aan rapport bestanden, dit zijn bestanden waarnaar alleen geschreven mag worden via rapportschrijver verklaringen.

 FD report-out REPORT sales-report.

Elk rapport wordt gedefinieerd in de rapportsectie van de datadivisie. Een rapport wordt opgesplitst in rapportgroepen die de koppen, funderingen en details van het rapport definiëren. Rapporten werken rond hiërarchische controle-onderbrekingen. Controle-onderbrekingen treden op wanneer een sleutelvariabele de waarde wijzigt; bijvoorbeeld bij het maken van een rapport met de bestellingen van klanten, controlebreuk kan optreden wanneer het programma de bestellingen van een andere klant bereikt. Hier is een voorbeeldrapportbeschrijving voor een rapport dat de verkopen van een verkoper geeft en dat waarschuwt voor ongeldige records:

De bovenstaande rapportbeschrijving beschrijft de volgende lay-out:

Vier statements controleren de rapportschrijver: INITIATE , die de rapportschrijver voorbereidt op afdrukken; GENERATE , die een rapportgroep afdrukt; ONDERDRUKKING , die het afdrukken van een rapportgroep onderdrukt; en TERMINATE , waarmee de rapportverwerking wordt beëindigd.Voor het bovenstaande verkooprapportvoorbeeld zou de procedure-indeling er als volgt uit kunnen zien:

 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 .

Het gebruik van de Report Writer-faciliteit varieerde meestal aanzienlijk; sommige organisaties maakten er op grote schaal gebruik van en andere helemaal niet. Bovendien varieerden implementaties van Report Writer in kwaliteit, waarbij de implementaties aan de onderkant soms buitensporige hoeveelheden geheugen gebruikten tijdens runtime.

Procedure divisionEdit

ProceduresEdit

De secties en paragrafen in de procedure-indeling (gezamenlijk procedures genoemd) kunnen worden gebruikt als labels en als eenvoudige subroutines. In tegenstelling tot andere divisies hoeven alinea’s niet in secties te staan. De uitvoering verloopt via de procedures van een programma totdat het wordt beëindigd. Om procedures als subroutines te gebruiken, moet de UITVOEREN verb wordt gebruikt.

Een PERFORM -instructie lijkt enigszins op een procedureaanroep in een moderne taal in de zin dat de uitvoering terugkeert naar de code na de PERFORM -instructie aan het einde van de aangeroepen code; het biedt echter geen mechanisme voor het doorgeven van parameters of voor het retourneren van een resultaatwaarde. Als een subroutine wordt aangeroepen met een eenvoudige instructie zoals PERFORM subroutine , keert de besturing terug aan het einde van de aangeroepen procedure. PERFORM is echter ongebruikelijk omdat het kan worden gebruikt om een reeks aan te roepen die een reeks van verschillende aangrenzende procedures beslaat. Dit wordt gedaan met de PERFORM sub-1 THRU sub-n constructie:

PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".

De output van dit programma zal zijn: “AABC”.

PERFORM verschilt ook van conventionele procedure-aanroepen in dat er, althans traditioneel, geen idee is van een call-stack. Als gevolg hiervan zijn geneste aanroepen mogelijk (een codereeks die PERFORM “ed is, kan een PERFORM statement zelf), maar vereisen extra zorg als delen van dezelfde code door beide aanroepen worden uitgevoerd. Het probleem doet zich voor wanneer de code in de binnenste aanroep het uitgangspunt van de buitenste aanroep bereikt. Meer formeel, als de controle door de uitgangspunt van een PERFORM aanroep die eerder werd aangeroepen maar nog niet is voltooid, bepaalt de COBOL 2002-standaard officieel dat het gedrag ongedefinieerd is.

De reden is dat COBOL, in plaats van een “retouradres”, werkt met wat een vervolgadres kan worden genoemd. Wanneer de controlestroom het einde van een procedure bereikt, wordt het vervolgadres opgezocht en wordt de controle overgedragen naar dat adres. het programma loopt, het vervolgadres voor elke procedure wordt geïnitialiseerd naar het startadres van de pro cedure die daarna in de programmatekst komt, zodat, als er geen PERFORM -instructies plaatsvinden, de controle van boven naar beneden door het programma stroomt. Maar wanneer een PERFORM -instructie wordt uitgevoerd, wordt het vervolgadres van de aangeroepen procedure gewijzigd (of de laatste procedure van het aangeroepen bereik, als PERFORM THRU werd gebruikt), zodat de besturing aan het einde terugkeert naar de oproepsite. De oorspronkelijke waarde wordt bewaard en wordt daarna hersteld, maar er is slechts één opslagpositie. Als twee geneste aanroepen werken met overlappende code, kunnen ze op verschillende manieren interfereren met elkaars beheer van het vervolgadres.

Het volgende voorbeeld (overgenomen van Veerman & Verhoeven 2006) illustreert het probleem:

Men zou kunnen verwachten dat de output van dit programma “1 2 3 4 3” zou zijn: Na het tonen van “2”, de tweede PERFORM zorgt ervoor dat “3” en “4” worden weergegeven, en vervolgens gaat de eerste aanroep verder met “3”. In traditionele COBOL-implementaties is dit niet het geval. In plaats daarvan is de eerste PERFORM -instructie stelt het vervolgadres in aan het einde van LABEL3 zodat het terugspringt naar de call site inside LABEL1 . De tweede PERFORM -instructie zet het resultaat aan het einde van LABEL4 maar wijzigt het vervolgadres van LABEL3 , in de verwachting dat dit de standaard voortzetting is. Dus wanneer de innerlijke aanroep aan het einde van LABEL3 arriveert, springt deze terug naar de buitenste PERFORM statement, en het programma stopt met het afdrukken van slechts “1 2 3”. Aan de andere kant interfereren in sommige COBOL-implementaties, zoals de open-source TinyCOBOL-compiler, de twee PERFORM -instructies elkaar niet en de output is inderdaad “1 2 3 4 3 “.Daarom is het gedrag in dergelijke gevallen niet alleen (misschien) verrassend, het is ook niet overdraagbaar.

Een speciaal gevolg van deze beperking is dat PERFORM kan niet worden gebruikt om recursieve code te schrijven. Nog een eenvoudig voorbeeld om dit te illustreren (enigszins vereenvoudigd van 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".

Je zou kunnen verwachten dat de uitvoer “1 2 3 END END END” is, en in feite is dat wat sommige COBOL-compilers zullen produceren. Maar sommige compilers, zoals IBM COBOL, zullen code produceren die “1 2 3 END END END END …” afdrukt en zo verder, en “END” steeds opnieuw in een eindeloze lus afdrukt. Aangezien er beperkte ruimte is om back-up-vervolgadressen op te slaan, worden de back-ups overschreven tijdens recursieve aanroepen, en alles wat kan worden hersteld is de sprong terug naar DISPLAY "END" .

StatementsEdit

COBOL 2014 heeft 47 statements (ook wel werkwoorden genoemd), die kunnen worden gegroepeerd in de volgende brede categorieën: controlestroom, I / O, datamanipulatie en de schrijver van het rapport. De rapportschrijver-verklaringen worden behandeld in de rapportschrijver-sectie.

Control flowEdit

COBOL “s voorwaardelijke verklaringen zijn IF en EVALUATE . EVALUATE is een switch-achtige instructie met de toegevoegde mogelijkheid om meerdere waarden en voorwaarden. Dit kan worden gebruikt om beslissingstabellen te implementeren. Het volgende kan bijvoorbeeld worden gebruikt om een CNC-draaibank te besturen:

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

De PERFORM -instructie wordt gebruikt om loops te definiëren die worden uitgevoerd totdat een voorwaarde waar is (niet terwijl waar, wat vaker voorkomt in andere talen). wordt ook gebruikt om procedures of reeksen procedures aan te roepen (zie de sectie procedures voor meer details). CALL en INVOKE roept respectievelijk subprogramma’s en methoden op. De naam van het subprogramma / de methode staat in een str ing die een letterlijk item of een data-item kan zijn. Parameters kunnen worden doorgegeven door middel van verwijzing, op inhoud (waarbij een kopie wordt doorgegeven door verwijzing) of op waarde (maar alleen als er een prototype beschikbaar is). CANCEL verwijdert subprogramma’s uit het geheugen. GA NAAR zorgt ervoor dat het programma naar een gespecificeerde procedure springt.

De GOBACK statement is een return statement en het STOP statement stopt het programma. Het EXIT statement heeft zes verschillende formaten: het kan worden gebruikt als een return statement, een break statement, een continue statement, een end marker of om een procedure te verlaten.

Uitzonderingen worden veroorzaakt door een RAISE -instructie en opgevangen met een handler, of declaratief, gedefinieerd in de DECLARATIVES deel van de procedureafdeling. Declaratieven zijn secties die beginnen met een USE -instructie die de af te handelen fouten specificeren. Uitzonderingen kunnen namen of objecten zijn. RESUME wordt gebruikt in een declaratief om naar de instructie te springen na de instructie die de uitzondering veroorzaakte of naar een procedure buiten de DECLARATIVES . In tegenstelling tot andere talen, kunnen niet-afgevangen uitzonderingen het programma niet beëindigen en kan het programma onaangetast doorgaan.

I / OEdit

Bestands-I / O wordt afgehandeld door het zichzelf beschrijvende OPEN , SLUITEN , LEZEN , en WRITE instructies samen met nog drie: REWRITE , waarmee een record wordt bijgewerkt; START , dat volgende records selecteert om toegang te krijgen door een record met een bepaalde sleutel te zoeken; en UNLOCK , waardoor de laatst geopende record wordt vergrendeld.

Gebruikersinteractie wordt gedaan met ACCEPT en WEERGAVE .

Gegevensmanipulatie Bewerken

De volgende werkwoorden manipuleren gegevens:

  • INITIALIZE , waarmee gegevensitems op hun standaardwaarden worden ingesteld.
  • MOVE , waarmee waarden aan data-items worden toegewezen; MOVE CORRESPONDING wijst overeenkomstige velden met dezelfde naam toe.
  • SET , die 15 formaten heeft: het kan indices wijzigen, objectreferenties toewijzen en de tabel wijzigen capaciteiten, naast andere functies.
  • TOEVOEGEN , SUBTRACT , MULTIPLY , DIVIDE , en COMPUTE , die rekenkunde (waarbij COMPUTE het resultaat van een formule toewijst aan een variabele).
  • ALLOCATE en FREE , die dynamisch geheugen verwerken.
  • VALIDATE , dat gegevens valideert en distribueert zoals gespecificeerd in de beschrijving van een item in de gegevensafdeling.
  • STRING en UNSTRING , waarmee strings respectievelijk worden samengevoegd en gesplitst.
  • INSPECTEREN , wat overeenkomt of vervangt instanties van gespecificeerde subtekenreeksen binnen een string.
  • ZOEKEN , die een tabel doorzoekt voor het eerste item voldoen aan een voorwaarde.

Bestanden en tabellen worden gesorteerd met SORT en de MERGE verb voegt bestanden samen en sorteert ze. Het werkwoord RELEASE levert records om te sorteren en RETURN haalt gesorteerde records op volgorde op.

Scope terminationEdit

Sommige statements, zoals IF en READ , kunnen zelf uitspraken bevatten. Dergelijke verklaringen kunnen op twee manieren worden beëindigd: door een punt (impliciete beëindiging), die alle niet-afgesloten verklaringen beëindigt, of door een bereikterminator, die de dichtstbijzijnde overeenkomende open verklaring beëindigt.

Geneste verklaringen beëindigd met een period zijn een veelvoorkomende bron van bugs. Bekijk bijvoorbeeld de volgende code:

IF x DISPLAY y. DISPLAY z.

Hier is het de bedoeling om y en z als voorwaarde x waar is. z wordt echter weergegeven ongeacht de waarde van x, omdat de instructie IF wordt beëindigd door een foutieve punt na DISPLAY y .

Een andere bug is het resultaat van het probleem met anders bungelen, wanneer twee IF instructies kunnen worden geassocieerd met een ELSE.

IF x IF y DISPLAY aELSE DISPLAY b.

In het bovenstaande fragment wordt de ELSE geassocieerd met de IF y -instructie in plaats van de IF x statement, wat een bug veroorzaakt. Voorafgaand aan de introductie van expliciete scope-terminators, zou het voorkomen dat ELSE NEXT SENTENCE na de binnenste IF .

Zelf-modificerende codeEdit

De originele (1959) COBOL-specificatie ondersteunde de beruchte WIJZIG X OM NAAR Y TE GAAN statement, waarvoor veel compilers zelfmodificerende code hebben gegenereerd. X en Y zijn procedurelabels, en de enkele GA NAAR instructie in procedure X uitgevoerd na zo’n ALTER -instructie betekent GA NAAR Y . Veel compilers ondersteunen het nog steeds, maar het werd in de COBOL 1985-standaard als verouderd beschouwd en in 2002 verwijderd.

De ALTER -verklaring werd slecht beoordeeld omdat het de ‘lokaliteit van de context’ ondermijnde en de algehele logica van een programma moeilijk te begrijpen maakte. Zoals leerboekauteur Daniel D. McCracken schreef in 1976, toen ‘iemand die het programma nog nooit eerder heeft gezien, er zo snel mogelijk mee vertrouwd moet raken. , soms onder kritieke tijdsdruk omdat het programma heeft gefaald … de aanblik van een GO TO-statement in een alinea op zich, signalerend als het bestaan van een onbekend aantal ALTER-statements op onbekende locaties in het programma, wekt angst in het hart van de dapperste programmeur. “

Hallo, worldEdit

Een” Hallo, wereld “programma in COBOL:

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

Toen het – nu beroemde – “Hello, World!” – programmavoorbeeld in The C Programming Language voor het eerst werd gepubliceerd in 1978, nframe COBOL-programmamonster zou zijn ingediend via JCL, zeer waarschijnlijk met behulp van een ponskaartlezer en 80 kolomponskaarten. De onderstaande lijst, met een lege DATA DIVISION, is getest met GNU / Linux en de System / 370 Hercules-emulator met MVS 3.8J. De JCL, geschreven in juli 2015, is afgeleid van de Hercules-tutorials en samples die worden gehost door Jay Moseley. In overeenstemming met de COBOL-programmering van die tijd, wordt HELLO, WORLD in hoofdletters weergegeven.

Na het indienen van de JCL, toonde de MVS-console:

 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

Regel 10 van de bovenstaande consolelijst is gemarkeerd voor effect, de accentuering maakt geen deel uit van de daadwerkelijke console-uitvoer.

De bijbehorende compilerlijst gegenereerd over vier pagina’s met technische details en job run-informatie, voor de enkele regel met uitvoer van de 14 regels van COBOL.

Leave a Reply

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *