Möglichkeiten der Strukturierten Programmierung sind geboten:

Neue Norm soll Cobol noch übersichtlicher machen

17.10.1986

Im Dezember 1985 hat die International Organization for Standardization (ISO) die neue Cobol-Norm unter der Nummer ISO 1989-1985 veröffentlicht. Damit Ist die alte Norm ISO 1989-1978 ungültig. Im Bereich des Deutschen Instituts für Normung (DIN) ersetzt die neue Norm DIN 66028, Ausgabe August 1986, den alten Standard.

Die DIN-Norm ist inhaltlich identisch mit der ISO-Norm, die ihrerseits wiederum gleichzusetzen ist mit der US-amerikanischen Norm ANSI X3.23-1985, Programming Language Cobol (ANSI = American National Standards Institute).

Die Sprache Cobol ist in sieben Pflicht- und vier Wachmodule unterteilt (Abbildung 1). Jedes Modul ist nochmals in die Stufen (Level) 1 und 2 unterteilt, wobei die Stufe 1 eine echte Untermenge von Stufe 2 ist.

Nur die Module SORT-MERGE und REPORT WRITER bestehen aus der Stufe 1 allein. Die Stufen der sieben Pflichtmodule werden zu drei Subsets zusammengefaßt. Der Subset MINIMUM ist eine Teilmenge von INTERMEDIATE und dieser wiederum von HIGH.

In der Norm für Cobol 85 werden erstmals drei Subsets (Teilmengen) definiert. Cobol 74 kannte da die Kleinigkeit von mehr als 104000 normkonformen Subsets.

Eine normgerechte Implementation von Cobol muß einen Mechanismus besitzen, der es zur Umwandlungszeit gestattet, alle im Quellprogramm verwendeten Sprachelemente zu markieren, die nicht zum eingestellten Subset gehören. Wenn also die Teilmenge MINIMUM eingestellt wird, dann müssen alle Sprachelemente angezeigt werden, die in den beiden höheren Subsets definiert sind und alle Sprachelemente, die herstellerspezifisch sind. Ist der höchste Subset eingestellt, dann müssen alle herstellerspezifischen Erweiterungen angezeigt werden.

Ein weiterer Mechanismus muß vorhanden sein, der auf Wunsch alle veralteten (obsolete) Elemente der neuen Norm in einem Programm während der Übersetzung anzeigt.

Cobol85 kennt insgesamt 167 Neuerungen oder Änderungen gegenüber Cobol74. Die Norm unterscheidet zwischen Neuerungen, die sich auf bisherige Programme nicht auswirken, Neuerungen, die sich auf existierende Programme auswirken können, und "veralteten" Sprachelementen.

Aufwärtskompatibilität ist ein unbedingtes Muß

Die wichtigsten Änderungen wirken sich nicht auf bisher bestehende Programme aus. Dazu gehören vor allem jene neuen Sprachelemente, die die strukturierte Programmierung ermöglichen.

Die internationale Arbeitsgruppe "Cobol" innerhalb der ISO hat zusammen mit dem für Cobol zuständigen Normenausschuß von ANSI größten Wert auf Aufwärtskompatibilität gelegt. Das bedeutet einerseits, daß nur in ganz wenigen Fällen bestehende Programme in wesentlichen Teilen sofort geändert werden müssen, wenn sie auf den neuen, normentsprechenden Compilern die bisherigen Ergebnisse liefern sollen.

Andererseits befinden sich noch "alte Zöpfe" in der Norm, die man gerne sofort abgeschnitten hätte. Als Kompromiß einigte man sich folgendermaßen: Es wird kein Sprachelement mehr aus der Norm gestrichen, es sei denn, es war in der vorhergehenden Norm als "veraltet" (obsolet) gekennzeichnet gewesen. Dies bedeutet, daß der Benutzer eine Normperiode lang Zeit hat, seine Programme von diesen veralteten Sprachelementen zu säubern.

END-Klausel begrenzt alle bedingten Anweisungen

Die Numerierung in den beiden folgenden Teilen ist nicht immer lückenlos. Dies liegt daran, daß in der Norm jede Änderung mit einer eigenen Nummer aufgeführt ist. Im vorliegenden Bericht wurden dagegen ähnliche Änderungen nur einmal genannt. Beispiel: NOT ON SIZE ERROR für alle arithmetischen Anweisungen. Außerdem werden die wenigen Änderungen für die fast nicht oder nur selten benutzten Module COMMUNICATION und REPORT WRITER hier nicht erwähnt. Wenn in den nachfolgenden Teilen "bisher" gesagt wird, dann bezieht sich dies immer auf die alte, bisher gültige Norm DIN 66028, Ausgabe September 1979.

Die neue Norm bietet die Möglichkeiten, die von der Strukturierten Programmierung verlangt werden. Im einzelnen sind dies im Subset MINIMUM:

- Abschluß von bedingten Anweisungen durch die END-Klauseln.

- die Blockstruktur mit dem Inline-PERFORM,

im Subset HIGH:

- die Strukturen PERFORM WITH TEST BEFORE oder PERFORM WITH TEST AFTER,

-die Fallunterscheidung durch die Anweisung EVALUATE,

-lokale Daten in externen Programmen durch CALL ... BY CONTENT.

Alle bedingten Anweisungen können nunmehr durch die END-Klausel begrenzt werden. Sie werden dadurch zu unbedingten Anweisungen.

Die einfachste Form des Inline-PERFORM lautet:

PERFORM

unbedingte Anweisungen

END-PERFORM

Die manchmal mühselige Suche nach der sonst notwendigen Prozedur entfällt also. Natürlich ist dieser Inline-PERFORM für alle Formate der Anweisung PERFORM erlaubt.

Mindestens sechs AFTER-Angaben müssen jetzt in einer PERFORM-Anweisung abgehandelt werden können. Dementsprechend muß der Compiler bei Tabellen bis zu sieben Dimensionen verarbeiten können.

Zu beachten ist allerdings, daß die Anweisung PERFORM, wie sie bisher erlaubt war, nicht mit dem Inline-PERFORM kombiniert werden darf. Außerdem muß der Inline-PERFORM mindestens eine unbedingte Anweisung enthalten und mit dem Bereichsbegrenzer END-PERFORM abgeschlossen werden.

Die Angabe WITH TEST BEFORE in der Anweisung PERFORM wirkt wie bisher schon bekannt. Mit der zweiten Angabe WITH TEST AFTER kann die Bedingung für die Beendigung der Schleife nach Ausführung der Schleifenanweisung getestet werden. Ohne diese Angabe erfolgt die Prüfung vor der Ausführung der Schleifenanweisungen (siehe Beispiel in Abbildung 2).

Wenn bisher das rufende Programm mit CALL . . . ein Unterprogramm aufrief , dann wurde bei einer Änderung der mittels Parameter übergebenen Datenfelder im gerufenen Programm auch der Inhalt des Datenfeldes im rufenden Programm geändert.

Mit der neuen Möglichkeit CALL . . . BY CONTENT ist dies nicht mehr der Fall. Es wird zwar der Wert aus dem rufenden Programm an das gerufene Programm übergeben, bei Änderungen werden diese jedoch nur im gerufenen Programm wirksam. Der Wert im rufenden Programm bleibt unverändert.

Eine Veröffentlichung aller weiteren Veränderungen würde den hier zur Verfügung stehenden Rahmen sprengen. Um aber dem Leser einen Eindruck von den vielfältigen Neuerungen zu ermöglichen, werden im folgenden die "neuen Möglichkeiten im Subset MINIMUM" als Beispiel herausgegriffen und auszugsweise abgedruckt:

(1) Kleinbuchstaben: Jede Zeichenkette im Quellcode darf Kleinbuchstaben enthalten. Beispiel: Pic X(5)b/ X hat dieselbe Bedeutung wie PIC X(5)B/X.

(3) Die Seperatoren Komma, Semikolon und Leerzeichen (Blank) sind in einem Quellprogramm austauschbar. Einige Hersteller erlaubten dies schon vorher.

(4) Programmierwörter und Systemnamen dürfen gleich sein. Durch den Kontext ist eine eindeutige Zuordnung gewährleistet. Systemnamen sind: computer-name, implementor-name und language-name.

(6) Nichtnumerische Literale dürfen nunmehr bis zu 160 Zeichen lang sein (bisher bis zu 120 Zeichen).

(8) Ein Programmiererwort, das in Datenbezeichnungen mehrfach definiert wird, muß nicht unbedingt eindeutig qualifizierbar (unique) sein, wenn es nicht benutzt wird.

(11) Relatives Subskribieren: A (SUBSKR + n), wobei n eine positive Ganzzahl ist.

(12) Subskripte und Indizes dürfen gemischt auftreten: A (SUBSKR- 1 IND + 2)

(l4) Die Folgenummer (in Spalte 1 bis 6) darf jedes Zeichen aus dem Zeichenvorrat des Rechners enthalten. Bisher waren nur Ziffern erlaubt. (15) Das Wort, das einem Stufenzeiger (CD, FD, RD und SD) oder der Stufennummer 01 oder 77 in der gleichen Zeit folgte darf auch im Bereich A (Spalte 8-1 1) beginnen. Bisher durfte ein solches Wort erst ab Spalte 12 (Bereich B) geschrieben sein.

(20) Die Programmteile ENVIRONMENT DIVISION, DATA DIVISION und PROCEDURE DIVISION wie auch die CONFIGURATION SECTION sind optional; ebenso die Paragraphen SOURCE-COMPUTER, OBJECT COMPUTER, SPECIAL-NAMES und I-O CONTROL

(21) Falls implementor-name ein Schalter ist, braucht der Bedingungsname nicht angegeben werden.

(22) Das reservierte Wort IS ist nunmehr auch im Paragraphen SPECIAL-NAMES optional.

(23) Neben STANDARD-1 (7-Bit-Code, US-amerikanische Referenzversion) ist auch STANDARD-2, der internationale 7-Bit Zeichenvorrat (ISO Referenzversion), spezifizierbar.

(24) In der Klausel ASSIGN TO ist neben dem implementor-name auch ein nichtnumerisches Literal erlaubt: ... ASSIGN TO "DATEI-NAME". (26) Die Worte ORGANIZATION IS innerhalb der Klausel ORGANIZATION sind nunmehr optional.

(29) Die Reihenfolge der Klauseln im Eintrag I-O-CONTROL ist nicht mehr vorgeschrieben.

(30) Alle Programmteile (DIVISIONs) mit Ausnahme von IDENTIFICATION DIVISION sind jetzt optional.

(31) Die Klausel BLOCK CONTAINS darf fehlen, wenn die Blockung durch Elemente der Betriebssystemsprache angegeben werden kann.

(32) Die Klausel CODE-SET darf nunmehr bei allen sequentiellen Dateien angegeben werden.

(33) Die Klausel LABEL RECORDS ist optional; wenn sie nicht angegeben ist, wird LABEL RECORDS ARE STANDARD angenommen. Außerdem gilt diese Klausel als veraltet.

(37) Die Klausel FILER ist nunmehr optional. Außerdem ist FILTER als Gruppenname erlaubt.

(40) Der Dezimalpunkt oder das Komma darf das letzte Zeichen in der PICTURE-Zeichenkette sein, wenn der abschließende Punkt unmittelbar folgt.

(42) In der Klausel REDEFINES darf der neue Eintrag kleiner (kürzer) sein als der redefinierte Speicherbereich.

(43) Die SIGN-Klausel darf auf Gruppenebene anders angegeben sein als beim untergeordneten Datenfeld:

05 Gruppe SIGN IS TRAILING.

06 NUM1 PIC S9(5).

06 NUM2 PIC S9(3) SIGN IS LEADING.

06 NUM3 PIC 99.

06 NUM4 PIC S99.

In diesem Beispiel enthalten die numerischen Felder NUM1 und NUM4 mit der Definition "S" das Vorzeichen im letzten, rechten Byte als "Überlochung" zusammen mit dein numerischen Wert (aufgrund der Angabe auf Gruppenebene). Das Feld NUM2 hat dagegen das Vorzeichen im ersten, linken Byte; das heißt die Einzelklausel hat Vorrang gegenüber dem Eintrag auf Gruppenebene.

(45) Die Klauseln USAGE IS BINARY und USAGE IS PACKED-DECIMAL sind neu. Mit diesen Klauseln ist es möglich, Datenfelder besser zu beschreiben als bisher. Die bisherige Klausel COMPUTATIONAL (nur diese Form entsprach bisher der Norm!) besagt, daß der numerische Wert in einer für Rechenoperationen günstigen Form gespeichert wird. Was genau unter COMP zu verstehen ist, kann von Hersteller zu Hersteller verschieden sein.

Bei Manchen Herstellern entspricht COMP dem neuen BINARY, bei anderen dem PACKED-DECIMAL. (Anmerkung: Für den Datenaustausch ist nur PIC S9(n) SIGN LEADING/TRAILING SEPARATE CHARACTER geeignet, es sei denn, man kann sich auf nicht der Norm entsprechende Absprachen berufen).

(46) Die Klausel VALUE darf neuerdings auch bei der OCCURS-Klausel und bei Datenfeldern, die einer OCCURS-Klausel untergeordnet sind, angegeben werden. Dies war bisher nicht erlaubt.

(51) Ein Datenfeld, welches in der LINKAGE SECTION ein anderes redefiniert oder welches einem Datenfeld untergeordnet ist, das im PROCEDURE DIVISION Eintrag genannt ist, darf jetzt in der PROCEDURE DIVISION benutzt werden.

(52) Alle bedingten Anweisungen können durch folgende Bereichsbegrenzer beendet werden: END-ADD, END-CALL, END-COMPUTE, END-DELETE, END-DIVIDE, END-EVALUATE, END-IF, END-MULTIPLY, END-PERFORM, END-READ, END-RECEIVE, END-RETURN, END-REWRITE, END-SEARCH, END-START, END-STRING, END-SUBTRACT, END-UNSTRING und END-WRITE.

Wenn eine bedingte Anweisung (zum Beispiel ADD ... TO... ON SIZE ERROR ... ) mit END-... abgeschlossen wird, dann wird sie dadurch zu einer unbedingten Anweisung. In Zukunft ist also folgendes erlaubt:

READ datei AT END

IF bedingung

MOVE ...

END-IF

END-READ

(53) Der neue relationale Operator < = oder IS LESS THAN OR EQUAL TO ist nunmehr erlaubt für IS NOT GREATER; ebenso natürlich auch > = oder IS GREATER THAN OR EQUAL TO für IS NOT LESS THAN.

(54) Der Benutzer kann nunmehr eigene Klassenbedingungen im Paragraphen SPECIAL-NAMES seines Programms festlegen. Alphanumerische Datenfelder können dann mit IF ... DEUTSCHES ALPHABET auf gültigen Zeicheninhalt geprüft werden.

(57) Der Zusatz NOT ON SIZE ERROR ist bei den arithmetischen Anweisungen ADD, COMPUTE, DIVIDE, MULTIPLY und SUBSTRACT möglich.

(59) In der Anweisung CALL dürfen nunmehr auch Datenfelder übergeben werden, deren Stufennummern anders lauten als 01 oder 77. Die übergebenen Parameter dürfen subskribiert und (Teil)feld-selektiert sein (Substrings).

(61) Der Zusatz REEL/UNIT kann bei der Anweisung CLOSE auch dann benutzt werden, wenn es sich nur um eine einzige Einheit (REEL/ UNIT) handelt.

(64) Die neue Anweisung CONTINUE zeigt, daß an dieser Stelle keine ausführbare Anweisung vorhanden ist und somit die Kontrolle an die nächste Anweisung weitergegeben wird.

(66) Die figurative Konstante ALL ist jetzt auch in der Anweisung DISPLAY erlaubt.

(70) Die Anweisung EXIT PROGRAM muß nicht mehr nicht einzige Anweisung in einem Paragraphen sein.

(71) Im GO TO DEPENDING ON ist nunmehr die Zahl der Paragraphennamen mindestens eins. Bisher waren mindestens zwei notwendig.

(72) In der Anweisung IF wurde das optionale Wort THEN erlaubt.

(86) In der Anweisung READ ist der Zusatz NOT AT END möglich.

(95) Die Anweisung SET darf nun Index-Namen und Datennamen gemischt enthalten.

(103) Der Eintrag USE AFTER EXCEPTION/ERROR für eine Datei hat Vorrang gegenüber dem Modus OPEN dieser Datei.

(106) In der Anweisung WRITE ist die Angabe NOT AT END-OF-PAGE erlaubt.

*Siegfried Mabkorn ist wissenschaftlicher Mitarbeiter am Institut für Technologietramfer der Gesellschaft für Mathematik und Datenverarbeitung mbH in Sankt Augustin. Er ist Mitglied bei nationalen und internationalen Normungsgremien.

Die vollständige Norm DIN 66028, Ausgabe August 1986, umfaßt 618 Seiten und ist beim Beuth-Verlag, Burggrafenstraße 4-7, 1 000 Berlin 30, erhältlich. Ein entsprechendes Arbeitspapier kann bei der GMD Gesellschaft für Mathematik und Datenverarbeitung mbH, Schloß Birlinghoven, 5205 Sankt Augustin 1 , gegen eine Schutzgebühr von zehn Mark angefordert werden.