COBOL (Deutsch)

SyntaxEdit

COBOL hat eine englischähnliche Syntax, mit der fast alles in einem Programm beschrieben wird. Beispielsweise kann eine Bedingung ausgedrückt werden als x IST GRÖSSER ALS y oder genauer als x GRÖSSER y oder x > y . Komplexere Bedingungen können durch Entfernen wiederholter Bedingungen und Variablen „abgekürzt“ werden. Beispiel: a > b UND a > c ODER a = d kann auf a > b UND c OR = d gekürzt werden. Um diese englische Syntax zu unterstützen, verfügt COBOL über 300 Schlüsselwörter. Einige der Schlüsselwörter sind einfache alternative oder pluralisierte Schreibweisen desselben Wortes, die mehr englischsprachige Aussagen und Klauseln vorsehen. Beispielsweise können die Schlüsselwörter IN und OF austauschbar verwendet werden, ebenso wie IS und ARE und VALUE und VALUES .

Jedes COBOL-Programm besteht aus vier grundlegenden lexikalischen Elementen: Wörter, Literale, Bildzeichenfolgen (siehe § BILD Klausel) und Trennzeichen. Wörter umfassen reservierte Wörter und benutzerdefinierte Bezeichner. Sie sind bis zu 31 Zeichen lang und können Buchstaben, Ziffern, Bindestriche und Unterstriche enthalten. Literale umfassen Ziffern (z. B. 12 ) und Zeichenfolgen (z. B. "Hallo!" ). Trennzeichen enthalten das Leerzeichen sowie Kommas und Semikolons, gefolgt von einem Leerzeichen.

Ein COBOL-Programm ist in vier Abteilungen unterteilt: die Identifikationsabteilung, die Umgebungsabteilung, die Datenabteilung und die Prozedurabteilung. Die Identifikationsabteilung gibt den Namen und den Typ des Quellelements an und gibt Klassen und Schnittstellen an. Die Umgebungsabteilung gibt alle Programmfunktionen an, die vom ausgeführten System abhängen, z. B. Dateien und Zeichensätze. Die Datenteilung wird verwendet, um Variablen und Parameter zu deklarieren. Die Prozedurabteilung enthält die Anweisungen des Programms. Jede Abteilung ist in Abschnitte unterteilt, die aus Absätzen bestehen.

MetalanguageEdit

Die Syntax von COBOL wird normalerweise mit a beschrieben einzigartige Metasprache mit Klammern, Klammern, Balken und Unterstreichung. Die Metasprache wurde für die ursprünglichen COBOL-Spezifikationen entwickelt. Obwohl es zu diesem Zeitpunkt eine Backus-Naur-Form gab, hatte das Komitee noch nichts davon gehört.

Elemente der COBOL-Metasprache
Element Aussehen Funktion
Alle Großbuchstaben BEISPIEL Reserviertes Wort
Unterstreichen BEISPIEL Das reservierte Wort ist obligatorisch
Klammern {} Es darf nur eine Option ausgewählt werden
Klammern Es können null oder eine Option ausgewählt werden.
Auslassungspunkte Das vorhergehende Element kann wiederholt werden.
Balken {| |} Eine oder mehrere Optionen können ausgewählt werden. Jede Option kann nur einmal ausgewählt werden.
Es können keine oder mehrere Optionen ausgewählt werden. Jede Option kann nur ausgewählt werden einmal ausgewählt.

Als Beispiel gilt consi der folgenden Beschreibung einer ADD -Anweisung:

Diese Beschreibung erlaubt die folgenden Varianten:

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"

Code formatEdit

COBOL kann in zwei Formaten geschrieben werden: fest (Standard) oder kostenlos. Im festen Format muss der Code so ausgerichtet sein, dass er in bestimmte Bereiche passt (ein Hindernis bei der Verwendung von Lochkarten).Bis COBOL 2002 waren dies:

7

Name Spalte (s) Verwendung
Sequenznummernbereich 1–6 Ursprünglich für Karte / verwendet Zeilennummern (Erleichterung der mechanischen Lochkartensortierung, um die beabsichtigte Programmcodesequenz nach manueller Bearbeitung / Handhabung sicherzustellen), wird dieser Bereich vom Compiler
Indikatorbereich Die folgenden Zeichen sind hier zulässig:

  • * – Kommentarzeile
  • / – Kommentarzeile, die auf einer neuen Seite einer Quellenliste gedruckt wird
  • - – Fortsetzungszeile, in der Wörter oder Literale aus dem vorherige Zeile wird fortgesetzt
  • D – Zeile im Debugging-Modus aktiviert, der sonst ignoriert wird
Bereich A 8–11 Dies enthält: DIVISION, SECTION und Prozedur-Header; 01- und 77-Level-Nummern und Datei- / Berichtsbeschreibungen
Bereich B 12–72 Alle anderen Codes, die in Bereich nicht zulässig sind Ein
Programmnamenbereich 73– Historisch bis zur Spalte 80 für Lochkarten wird er zur Identifizierung des Programms verwendet oder Reihenfolge, zu der die Karte gehört

In COBOL 2002 waren die Bereiche A und B zusammengeführt, um den Programmtextbereich zu bilden, der nun an einer vom Implementierer definierten Spalte endet.

COBOL 2002 führte auch Freiformatcode ein. Freiformatcode kann wie in neueren Programmiersprachen in jede Spalte der Datei eingefügt werden. Kommentare werden mit *> angegeben, das an einer beliebigen Stelle platziert und auch im Quellcode mit festem Format verwendet werden kann. Fortsetzungszeilen sind nicht vorhanden, und die Anweisung >>PAGE ersetzt den Indikator /.

Identification DivisionEdit

Die Identifikationsabteilung identifiziert die folgende Codeentität und enthält die Definition einer Klasse oder Schnittstelle.

Objektorientierte ProgrammierungEdit

Klassen und Schnittstellen befinden sich seit 2002 in COBOL. Klassen haben Factory-Objekte, die Klassenmethoden und -variablen enthalten, und Instanzobjekte, die Instanzmethoden und -variablen enthalten. Vererbung und Grenzflächen sorgen für Polymorphismus. Unterstützung für die generische Programmierung wird durch parametrisierte Klassen bereitgestellt, die für die Verwendung einer beliebigen Klasse oder Schnittstelle instanziiert werden können. Objekte werden als Referenzen gespeichert, die auf einen bestimmten Typ beschränkt sein können. Es gibt zwei Möglichkeiten, eine Methode aufzurufen: die Anweisung INVOKE , die sich ähnlich wie die Anweisung CALL verhält oder durch Inline-Methodenaufruf, der der Verwendung von Funktionen entspricht.

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

COBOL bietet keine Möglichkeit, Methoden auszublenden. Klassendaten können jedoch ausgeblendet werden, indem sie ohne eine PROPERTY -Klausel deklariert werden, sodass der Benutzer keinen Zugriff darauf hat. In COBOL 2014 wurde eine Methodenüberladung hinzugefügt.

UmgebungsabteilungEdit

Die Umgebungsabteilung enthält den Konfigurationsabschnitt und den Eingabe-Ausgabe-Abschnitt. Im Konfigurationsabschnitt werden variable Funktionen wie Währungszeichen, Gebietsschemas und Zeichensätze angegeben. Der Eingabe-Ausgabe-Abschnitt enthält dateibezogene Informationen.

FilesEdit

COBOL unterstützt drei Dateiformate oder Organisationen: sequentiell, indiziert und relativ. In sequentiellen Dateien sind Datensätze zusammenhängend und müssen ähnlich wie bei einer verknüpften Liste nacheinander durchlaufen werden. Indizierte Dateien haben einen oder mehrere Indizes, mit denen zufällig auf Datensätze zugegriffen werden kann und die nach ihnen sortiert werden können. Jeder Datensatz muss einen eindeutigen Schlüssel haben, andere alternative Datensatzschlüssel müssen jedoch nicht eindeutig sein. Die Implementierungen indizierter Dateien variieren zwischen den Anbietern, obwohl gängige Implementierungen wie C-ISAM und VSAM auf dem ISAM von IBM basieren. Relative Dateien wie indizierte Dateien verfügen über einen eindeutigen Datensatzschlüssel, jedoch nicht über alternative Schlüssel. A. Der Schlüssel des relativen Datensatzes ist seine Ordnungsposition; Beispielsweise hat der 10. Datensatz einen Schlüssel von 10. Dies bedeutet, dass zum Erstellen eines Datensatzes mit einem Schlüssel von 5 möglicherweise (leere) vorhergehende Datensätze erstellt werden müssen. Relative Dateien ermöglichen sowohl sequentiellen als auch wahlfreien Zugriff.

Eine häufig verwendete nicht standardmäßige Erweiterung ist die zeilenweise sequentielle Organisation, die zum Verarbeiten von Textdateien verwendet wird. Datensätze in einer Datei werden durch einen Zeilenumbruch abgeschlossen und können unterschiedlich lang sein.

DatenteilungEdit

Die Datenteilung ist in sechs Abschnitte unterteilt, in denen unterschiedliche Elemente deklariert werden: der Dateibereich, z Aktenaufzeichnungen; der Arbeitsspeicherabschnitt für statische Variablen; der lokale Speicherabschnitt für automatische Variablen; der Verknüpfungsabschnitt für Parameter und den Rückgabewert; den Berichtsabschnitt und den Bildschirmabschnitt für textbasierte Benutzeroberflächen.

Aggregated dataEdit

Datenelemente in COBOL werden mithilfe von Ebenennummern hierarchisch deklariert, die angeben, ob ein Datenelement Teil eines anderen ist. Ein Gegenstand mit einer höheren Ebenennummer ist einem Gegenstand mit einer niedrigeren untergeordnet. Datenelemente der obersten Ebene mit einer Ebenennummer von 1 werden als Datensätze bezeichnet. Elemente mit untergeordneten aggregierten Daten werden als Gruppenelemente bezeichnet. diejenigen, die dies nicht tun, werden als elementare Elemente bezeichnet. Die zur Beschreibung von Standarddatenelementen verwendeten Ebenennummern liegen zwischen 1 und 49.

Im obigen Beispiel sind das Element element num und das Gruppenelement das Datum sind dem Datensatz einem Datensatz untergeordnet, während elementare Elemente das Jahr , der Monat und das -day sind Teil des Gruppenelements the-date .

Untergeordnete Elemente können mit IN (oder OF ). Betrachten Sie beispielsweise den obigen Beispielcode zusammen mit dem folgenden Beispiel:

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

Die Namen das Jahr , der Monat und der Tag sind für sich genommen mehrdeutig, da mit diesen Namen mehr als ein Datenelement definiert ist. Um ein bestimmtes Datenelement anzugeben, beispielsweise eines der Elemente, die in der Gruppe Verkaufsdatum enthalten sind, würde der Programmierer das Jahr IN Verkaufsdatum (oder das Äquivalent das Jahr des Verkaufsdatums ). (Diese Syntax ähnelt der „Punktnotation“, die von den meisten modernen Sprachen unterstützt wird.)

Andere DatenebenenEdit

Eine Ebenennummer von 66 wird verwendet, um eine Neugruppierung von zu deklarieren zuvor definierte Elemente, unabhängig davon, wie diese Elemente strukturiert sind. Diese Datenebene, auf die auch in der zugehörigen RENAMES -Klausel Bezug genommen wird, wird selten verwendet und wurde um 1988 normalerweise in alten Programmen gefunden. Aufgrund seiner Fähigkeit, die hierarchischen und logischen Strukturdaten zu ignorieren, wurde die Verwendung nicht empfohlen, und viele Installationen untersagten die Verwendung.

Eine 77-Level-Nummer zeigt an, dass das Element eigenständig ist und in solchen Situationen gleichwertig ist Die Ebenennummer 01. Der folgende Code deklariert beispielsweise zwei Datenelemente mit 77 Ebenen: Eigenschaftsname und Verkaufsregion , bei der es sich um Nicht-Gruppen-Datenelemente handelt, die unabhängig von anderen Datenelementen sind (diesen nicht untergeordnet sind):

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

Eine 88-Level-Nummer deklariert einen Bedingungsnamen (einen sogenannten 88-Level), der wahr ist, wenn sein übergeordnetes Datenelement einen der in VALUE -Klausel. Der folgende Code definiert beispielsweise zwei Bedingungsnamenelemente mit 88 Ebenen, die abhängig vom aktuellen Zeichendatenwert des Datenelements Lohnart wahr oder falsch sind . Wenn das Datenelement den Wert "H" enthält, ist der Bedingungsname stündlich ist wahr, während wenn es einen Wert von "S" oder "Y" enthält. Code>, der Bedingungsname Lohn ist jährlich ist wahr. Wenn das Datenelement einen anderen Wert enthält, sind beide Bedingungsnamen falsch.

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

DatentypenEdit

Standard COBOL bietet die folgenden Datentypen:

Index

Datentyp Beispieldeklaration Hinweise
Alphabetisch PIC A. (30) Darf nur Buchstaben oder Leerzeichen enthalten
Alphanumerisch PIC X (30) Kann beliebige Zeichen enthalten
Boolescher Wert PIC 1 USAGE BIT Daten, die in Form von 0s und 1s als Binärzahl
VERWENDUNGSINDEX Wird zum Referenzieren von Tabellenelementen verwendet
National PIC N (30) Ähnlich wie alphanumerisch, jedoch mit einem erweiterten Zeichen z.B. UTF-8
Numerisch PIC 9 (5) V9 (5) Darf nur Zahlen enthalten
Objekt VERWENDUNGSOBJEKTREFERENZ Kann entweder auf ein Objekt oder NULL
Zeiger VERWENDUNGSPUNKT

Die Typensicherheit ist in COBOL variabel.Numerische Daten werden stillschweigend zwischen verschiedenen Darstellungen und Größen konvertiert, und alphanumerische Daten können in jedes Datenelement eingefügt werden, das als Zeichenfolge gespeichert werden kann, einschließlich numerischer Daten und Gruppendaten. Im Gegensatz dazu dürfen Objektreferenzen und Zeiger nur von Elementen desselben Typs zugewiesen werden, und ihre Werte können auf einen bestimmten Typ beschränkt sein.

PICTURE-KlauselEdit

A PICTURE (oder PIC ) ist eine Zeichenfolge, die jeweils einen Teil des Datenelements und darstellt was es enthalten kann. Einige Bildzeichen geben den Typ des Elements und die Anzahl der Zeichen oder Ziffern an, die es im Speicher belegt. Beispielsweise gibt eine 9 eine Dezimalstelle an, und eine S zeigt an, dass es sich um das Element handelt unterzeichnet. Andere Bildzeichen (Einfüge- und Bearbeitungszeichen genannt) geben an, wie ein Element formatiert werden soll. Beispielsweise definiert eine Reihe von + -Zeichen die Zeichenpositionen sowie die Position eines Leitzeichens in den endgültigen Zeichendaten. Das nicht numerische Zeichen ganz rechts enthält das Zeichen des Elements, während andere Zeichenpositionen, die einem + links von dieser Position entsprechen, ein Leerzeichen enthalten. Wiederholt Zeichen können präziser angegeben werden, indem eine Zahl in Klammern nach einem Bildzeichen angegeben wird. Beispiel: 9 (7) entspricht 9999999 . Bildspezifikationen, die nur Ziffern ( 9 ) und Zeichen ( enthalten S ) Zeichen definieren rein numerische Datenelemente, während Bildspezifikationen alphabetische ( A ) oder alphanumerische ( X ) Zeichen definieren alphanumerische Datenelemente. Das Vorhandensein anderer Formatierungszeichen definiert bearbeitete numerische oder bearbeitete alphanumerische Datenelemente.

USAGE-KlauselEdit

Die USAGE -Klausel deklariert das Format Daten werden in gespeichert. Abhängig vom Datentyp können sie entweder ergänzt oder anstelle einer PICTURE -Klausel verwendet werden. Während es zum Deklarieren von Zeigern und Objektreferenzen verwendet werden kann, ist es hauptsächlich auf die Angabe numerischer Typen ausgerichtet. Diese numerischen Formate sind:

  • Binär, wobei eine Mindestgröße entweder durch die Klausel PICTURE oder durch eine USAGE -Klausel wie BINARY-LONG.
  • USAGE COMPUTATIONAL , wobei Daten vorhanden sein können in dem von der Implementierung bereitgestellten Format gespeichert werden; Entspricht häufig USAGE BINARY
  • USAGE DISPLAY , dem Standardformat , wo Daten als Zeichenfolge
  • Gleitkomma gespeichert werden, entweder in einem implementierungsabhängigen Format oder gemäß IEEE 754.
  • USAGE NATIONAL , wobei Daten als Zeichenfolge mit einem erweiterten Zeichensatz gespeichert werden
  • USAGE PACKED-DECIMAL , wobei Daten wird im kleinstmöglichen Dezimalformat gespeichert (normalerweise gepackte binärcodierte Dezimalzahl).

Report WriterEdit

Der Report Writer ist eine deklarative Funktion zum Erstellen von Berichten. Der Programmierer muss nur das Berichtslayout und die für die Erstellung erforderlichen Daten angeben, sodass er keinen Code schreiben muss, um beispielsweise Seitenumbrüche, Datenformatierungen sowie Überschriften und Fundamente zu verarbeiten.

Berichte sind dem Bericht zugeordnet Dateien, bei denen es sich um Dateien handelt, in die nur über Anweisungen zum Verfassen von Berichten geschrieben werden kann.

 FD report-out REPORT sales-report.

Jeder Bericht wird im Berichtsabschnitt definiert der Datenabteilung. Ein Bericht ist in Berichtsgruppen unterteilt, die die Überschriften, Fundamente und Details des Berichts definieren. Berichte umgehen hierarchische Kontrollunterbrechungen. Kontrollunterbrechungen treten auf, wenn eine Schlüsselvariable ihren Wert ändert, z. B. wenn ein Bericht erstellt wird, in dem Kundenaufträge aufgeführt sind. A. Eine Kontrollunterbrechung kann auftreten, wenn das Programm die Bestellungen eines anderen Kunden erreicht. Hier ist ein Beispiel für eine Berichtsbeschreibung für einen Bericht, der die Verkäufe eines Verkäufers angibt und vor ungültigen Datensätzen warnt:

Die obige Berichtsbeschreibung beschreibt das folgende Layout:

Vier Anweisungen steuern den Berichtersteller: INITIATE , der den Berichtersteller für den Druck vorbereitet; GENERATE , das eine Berichtsgruppe druckt; SUPPRESS , wodurch das Drucken einer Berichtsgruppe unterdrückt wird; und TERMINATE , wodurch die Berichtsverarbeitung beendet wird.Für das obige Beispiel für einen Verkaufsbericht könnte die Prozedurabteilung folgendermaßen aussehen:

 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 .

Die Verwendung der Report Writer-Funktion war tendenziell unterschiedlich wesentlich; Einige Organisationen haben es ausgiebig genutzt, andere überhaupt nicht. Darüber hinaus waren die Implementierungen von Report Writer qualitativ unterschiedlich, wobei die Implementierungen am unteren Ende manchmal zur Laufzeit übermäßig viel Speicher beanspruchten.

Procedure DivisionEdit

ProceduresEdit

Die Abschnitte und Absätze in der Prozedurabteilung (zusammen als Prozeduren bezeichnet) können als Beschriftungen und als einfache Unterroutinen verwendet werden. Im Gegensatz zu anderen Abteilungen müssen Absätze nicht in Abschnitten enthalten sein. Die Ausführung durchläuft die Prozeduren eines Programms, bis es beendet wird. Um Prozeduren als Unterprogramme zu verwenden, muss die PERFORM verb wird verwendet.

Eine PERFORM -Anweisung ähnelt in dem Sinne, dass die Ausführung zum Code zurückkehrt, einem Prozeduraufruf in einer modernen Sprache Folgen Sie der Anweisung PERFORM am Ende des aufgerufenen Codes. Es bietet jedoch keinen Mechanismus zum Übergeben von Parametern oder zum Zurückgeben eines Ergebniswerts. Wenn eine Unterroutine mit einer einfachen Anweisung wie PERFORM-Unterroutine aufgerufen wird, kehrt die Steuerung am Ende der aufgerufenen Prozedur zurück. PERFORM ist jedoch insofern ungewöhnlich, als es zum Aufrufen eines Bereichs verwendet werden kann, der eine Folge mehrerer benachbarter Prozeduren umfasst. Dies erfolgt mit dem Konstrukt PERFORM sub-1 THRU sub-n :

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

Die Ausgabe dieses Programms lautet: „AABC“.

PERFORM unterscheidet sich auch von herkömmlichen Prozeduraufrufen dass es zumindest traditionell keine Vorstellung von einem Aufrufstapel gibt. Infolgedessen sind verschachtelte Aufrufe möglich (eine Codesequenz, die PERFORM „ed ist, kann eine PERFORM Anweisung selbst), erfordern jedoch besondere Sorgfalt, wenn Teile desselben Codes von beiden Aufrufen ausgeführt werden. Das Problem tritt auf, wenn der Code im inneren Aufruf den Austrittspunkt des äußeren Aufrufs erreicht. Formaler, wenn die Steuerung über den Ausstiegspunkt eines PERFORM -Aufrufs, der zuvor aufgerufen wurde, aber noch nicht abgeschlossen wurde. Der COBOL 2002-Standard schreibt offiziell vor, dass das Verhalten undefiniert ist.

Der Grund dafür ist, dass COBOL anstelle einer „Rücksprungadresse“ mit einer sogenannten Fortsetzungsadresse arbeitet. Wenn der Steuerungsfluss das Ende eines Vorgangs erreicht, wird die Fortsetzungsadresse nachgeschlagen und die Steuerung an diese Adresse übertragen Wenn das Programm ausgeführt wird, wird die Fortsetzungsadresse für jede Prozedur mit der Startadresse des Profis initialisiert Vorgehensweise, die im Programmtext als Nächstes angegeben wird. Wenn keine PERFORM -Anweisungen ausgeführt werden, fließt die Steuerung von oben nach unten durch das Programm. Wenn jedoch eine PERFORM -Anweisung ausgeführt wird, ändert sie die Fortsetzungsadresse der aufgerufenen Prozedur (oder der letzten Prozedur des aufgerufenen Bereichs, wenn PERFORM THRU wurde verwendet), damit die Steuerung am Ende zur Anrufstelle zurückkehrt. Der ursprüngliche Wert wird gespeichert und anschließend wiederhergestellt, es gibt jedoch nur eine Speicherposition. Wenn zwei verschachtelte Aufrufe mit überlappendem Code arbeiten, können sie die Verwaltung der Fortsetzungsadresse auf verschiedene Weise gegenseitig stören.

Das folgende Beispiel (entnommen aus Veerman & Verhoeven 2006) veranschaulicht das Problem:

Man könnte erwarten, dass die Ausgabe dieses Programms „1 2 3 4 3“ ist: Nach der Anzeige von „2“ wird die zweite PERFORM bewirkt, dass „3“ und „4“ angezeigt werden, und der erste Aufruf wird mit „3“ fortgesetzt. In herkömmlichen COBOL-Implementierungen ist dies nicht der Fall. Vielmehr ist der erste PERFORM legt die Fortsetzungsadresse am Ende von LABEL3 fest, sodass zum Befehl zurückgesprungen wird Rufen Sie die Site in der LABEL1 auf. Die zweite PERFORM -Anweisung setzt die Rückgabe am Ende von LABEL4 , ändert jedoch nicht die Fortsetzungsadresse von LABEL3 , wobei erwartet wird, dass dies die Standardfortsetzung ist. Wenn der innere Aufruf am Ende von LABEL3 eintrifft, springt er zurück zum äußeren PERFORM Anweisung, und das Programm hört auf, nur „1 2 3“ gedruckt zu haben. Andererseits stören sich in einigen COBOL-Implementierungen wie dem Open-Source-TinyCOBOL-Compiler die beiden Anweisungen PERFORM nicht und die Ausgabe ist tatsächlich „1“ 2 3 4 3 „.Daher ist das Verhalten in solchen Fällen nicht nur (vielleicht) überraschend, es ist auch nicht portierbar.

Eine besondere Folge dieser Einschränkung ist, dass PERFORM kann nicht zum Schreiben von rekursivem Code verwendet werden. Ein weiteres einfaches Beispiel zur Veranschaulichung (leicht vereinfacht von 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 könnte erwarten, dass die Ausgabe „1 2 3 END END END“ ist, und genau das werden einige COBOL-Compiler produzieren. Einige Compiler wie IBM COBOL erzeugen jedoch Code, der „1 2 3 END END END END …“ usw. ausgibt und „END“ immer wieder in einer Endlosschleife druckt. Da nur wenig Speicherplatz zum Speichern von Sicherungsfortsetzungsadressen vorhanden ist, werden die Sicherungen im Verlauf rekursiver Aufrufe überschrieben. Sie können lediglich den Sprung zurück zu DISPLAY "END" .

StatementsEdit

COBOL 2014 verfügt über 47 Anweisungen (auch als Verben bezeichnet), die in die folgenden allgemeinen Kategorien eingeteilt werden können: Kontrollfluss, E / A, Datenmanipulation und der Berichtersteller. Die Report Writer-Anweisungen werden im Abschnitt zum Report Writer behandelt.

Control flowEdit

Die bedingten Anweisungen von COBOL lauten IF und EVALUATE . EVALUATE ist eine switch-ähnliche Anweisung mit der zusätzlichen Möglichkeit, mehrere auszuwerten Werte und Bedingungen. Dies kann zum Implementieren von Entscheidungstabellen verwendet werden. Beispielsweise kann Folgendes zur Steuerung einer CNC-Drehmaschine verwendet werden:

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

Mit der Anweisung PERFORM werden Schleifen definiert, die ausgeführt werden, bis eine Bedingung erfüllt ist (nicht solange true, was in anderen Sprachen häufiger vorkommt) wird auch zum Aufrufen von Prozeduren oder Prozedurbereichen verwendet (weitere Informationen finden Sie im Abschnitt Prozeduren). CALL und INVOKE ruft Unterprogramme bzw. Methoden auf. Der Name des Unterprogramms / der Methode ist in einer str enthalten Dies kann ein Literal oder ein Datenelement sein. Parameter können als Referenz, nach Inhalt (wobei eine Kopie als Referenz übergeben wird) oder nach Wert (jedoch nur, wenn ein Prototyp verfügbar ist) übergeben werden. CANCEL entlädt Unterprogramme aus dem Gedächtnis. GO TO bewirkt, dass das Programm zu einer bestimmten Prozedur springt.

Die GOBACK ist eine return-Anweisung und die Anweisung STOP stoppt das Programm. Die Anweisung EXIT hat sechs verschiedene Formate: Sie kann als return-Anweisung, break-Anweisung, continue-Anweisung, Endmarkierung oder zum Verlassen einer Prozedur verwendet werden.

Ausnahmen werden durch eine RAISE -Anweisung ausgelöst und mit einem Handler oder Deklarativ abgefangen, der in der DECLARATIVES Teil der Prozedurabteilung. Deklarative sind Abschnitte, die mit einer Anweisung USE beginnen und die zu behandelnden Fehler angeben. Ausnahmen können Namen oder Objekte sein. RESUME wird in einem Deklarativ verwendet, um zu der Anweisung nach der Anweisung zu springen, die die Ausnahme ausgelöst hat, oder zu einer Prozedur außerhalb von DECLARATIVES . Im Gegensatz zu anderen Sprachen können nicht erfasste Ausnahmen das Programm möglicherweise nicht beenden und das Programm kann nicht beeinflusst werden.

E / AEdit

Datei-E / A wird von der selbstbeschreibenden OPEN , CLOSE , READ , und WRITE -Anweisungen zusammen mit drei weiteren: REWRITE , wodurch ein Datensatz aktualisiert wird; START , der nachfolgende Datensätze für den Zugriff auswählt, indem ein Datensatz mit einem bestimmten Schlüssel gefunden wird; und UNLOCK , wodurch eine Sperre für den zuletzt aufgerufenen Datensatz aufgehoben wird.

Die Benutzerinteraktion erfolgt mit ACCEPT und DISPLAY .

DatenmanipulationEdit

Die folgenden Verben manipulieren Daten:

  • INITIALIZE , wodurch Datenelemente auf ihre Standardwerte gesetzt werden.
  • MOVE , das Datenelementen Werte zuweist; MOVE CORRESPONDING weist entsprechende gleichnamige Felder zu.
  • SET mit 15 Formaten: Es kann Indizes ändern, Objektreferenzen zuweisen und Tabellen ändern Kapazitäten, unter anderem Funktionen.
  • HINZUFÜGEN , SUBTRACT , MULTIPLY , DIVIDE und COMPUTE Arithmetik (mit COMPUTE , der das Ergebnis einer Formel einer Variablen zuweist).
  • ALLOCATE und FREE , die den dynamischen Speicher verarbeiten.
  • VALIDATE , der Daten validiert und verteilt, wie in der Beschreibung eines Elements in der Datenabteilung angegeben.
  • STRING und UNSTRING , die Zeichenfolgen verketten bzw. teilen.
  • INSPECT , das entspricht oder ersetzt Instanzen angegebener Teilzeichenfolgen innerhalb einer Zeichenfolge.
  • SEARCH durchsucht eine Tabelle nach dem ersten Eintrag eine Bedingung erfüllen.

Dateien und Tabellen werden mit SORT und MERGE führt Dateien zusammen und sortiert sie. Das Verb RELEASE stellt Datensätze zum Sortieren bereit, und RETURN ruft sortierte Datensätze in der angegebenen Reihenfolge ab. P. >

Scope TerminationEdit

Einige Anweisungen, z. B. IF und READ kann selbst Anweisungen enthalten. Solche Anweisungen können auf zwei Arten beendet werden: durch einen Punkt (implizite Beendigung), der alle enthaltenen nicht abgeschlossenen Anweisungen beendet, oder durch einen Bereichsabschluss, der die nächste übereinstimmende offene Anweisung beendet.

Verschachtelte Anweisungen, die mit a beendet werden Punkt sind eine häufige Quelle für Fehler. Untersuchen Sie beispielsweise den folgenden Code:

IF x DISPLAY y. DISPLAY z.

Hier soll y und z, wenn die Bedingung x erfüllt ist. z wird jedoch unabhängig vom Wert von x angezeigt, da die Anweisung IF beendet wird durch einen fehlerhaften Zeitraum nach DISPLAY y .

Ein weiterer Fehler ist das Ergebnis des Dangling else-Problems, wenn zwei IF -Anweisungen können mit einer ELSE verknüpft werden.

IF x IF y DISPLAY aELSE DISPLAY b.

In dem obigen Fragment wird die ELSE der IF y -Anweisung anstelle der IF x -Anweisung, die einen Fehler verursacht. Vor der Einführung expliziter Bereichsabschlusszeichen müsste zum Verhindern ELSE NEXT SENTENCE nach dem inneren IF platziert werden .

Selbstmodifizierender CodeEdit

Die ursprüngliche COBOL-Spezifikation (1959) unterstützte die berüchtigte ALTER X, UM ZU Y Anweisung, für die viele Compiler selbstmodifizierenden Code generiert haben. X und Y sind Prozedurbezeichnungen, und die einzelne GO TO Anweisung in Prozedur X, die nach einer solchen ALTER -Anweisung ausgeführt wird, bedeutet Gehen Sie stattdessen zu Y . Viele Compiler unterstützen es immer noch, aber es wurde im COBOL 1985-Standard als veraltet eingestuft und 2002 gelöscht.

Die Anweisung ALTER wurde nur unzureichend berücksichtigt weil es die „Lokalität des Kontextes“ untergrub und die Gesamtlogik eines Programms schwer verständlich machte. Wie der Lehrbuchautor Daniel D. McCracken 1976 schrieb, als „jemand, der das Programm noch nie zuvor gesehen hat, sich so schnell wie möglich damit vertraut machen muss , manchmal unter kritischem Zeitdruck, weil das Programm fehlgeschlagen ist … Der Anblick einer GO TO-Anweisung in einem Absatz an sich, die signalisiert, dass eine unbekannte Anzahl von ALTER-Anweisungen an unbekannten Stellen im gesamten Programm vorhanden ist, lässt Angst aufkommen das Herz des tapfersten Programmierers. „

Hallo, worldEdit

Ein“ Hallo, Welt „-Programm in COBOL:

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

Als das – inzwischen berühmte – Programmbeispiel „Hello, World!“ in der Programmiersprache C erstmals 1978 veröffentlicht wurde, wurde ein ähnlicher Mai veröffentlicht Das nframe COBOL-Programmbeispiel wäre über JCL eingereicht worden, sehr wahrscheinlich mit einem Lochkartenleser und 80 Spalten-Lochkarten. Die folgende Auflistung mit einer leeren DATA DIVISION wurde mit GNU / Linux und dem System / 370 Hercules-Emulator unter MVS 3.8J getestet. Die im Juli 2015 verfasste JCL basiert auf den Hercules-Tutorials und Beispielen von Jay Moseley. In Übereinstimmung mit der COBOL-Programmierung dieser Zeit, HELLO, WORLD, wird in Großbuchstaben angezeigt.

Nach dem Senden der JCL wurde auf der MVS-Konsole Folgendes angezeigt:

 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

Zeile 10 der obigen Konsolenliste Wird die Hervorhebung hervorgehoben, ist die Hervorhebung nicht Teil der tatsächlichen Konsolenausgabe.

Die zugehörige Compiler-Liste, die auf vier Seiten mit technischen Details und Jobausführungsinformationen für die einzelne Ausgabezeile aus den 14 Zeilen von generiert wurde COBOL.

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.