Dritte Cobol-Norm kurz vor der Vollendung:

Auch Alt-Programme unterliegen neuen Regeln

12.04.1985

BlRLINGHOVEN - Die ISO (International Organization for Standardization) hat ihren Mitgliedern einen dritten Entwurf zur neuen Cobol-Norm zur Abstimmung vorgelegt. Das DIN hat diesem Normentwurf zugestimmt. Es besteht die berechtigte Hoffnung, daß im November 1985 das American National Standards Institute (ANSI) in den USA diesen Entwurf als ANSI-Norm verabschieden wird.

Vor 26 Jahren entstand die Programmiersprache "Cobol". Die Entscheidung für diese "Common Business Oriented Language" fiel im Mai 1959 im Pentagon. Am l7. Dezember 1959 war die erste Version von Cobol fertig. Diese Version wurde am 7. und 8. Januar 1960 verabschiedet. Im April 1960 wurde sie veröffentlicht. Heute, nach 26 Jahren, steht die Fachwelt unmittelbar vor der Herausgabe einer neuen, dritten Norm für die Programmiersprache Cobol.

Die neue Norm unterscheidet sich von der derzeit gültigen Norm DIN 66 028, Programmiersprache Cobol, durch eine Reihe von Verbesserungen. Es handelt sich um insgesamt 165 Änderungen. 106 davon betreffen neue Möglichkeiten, so daß bestehende Programme hiervon nicht tangiert werden. Von 43 Änderungen können allerdings existierende Programme berührt werden. Die restlichen 16 werden als veraltet klassifiziert.

Von weiteren 16 Sprachelementen ist heute schon bekannt, daß sie nach Ablauf der neuen Norm ersatzlos gestrichen werden. Aus Gründen der Kompatibilität werden sie in der neuen Norm noch enthalten sein. Der Anwender hat somit während der Gültigkeitszeit der neuen Norm genügend Zeit, seine Programme nach und nach von diesen Dingen zu säubern und die Quellprogramme auf den Stand der neuen Norm zu bringen.

Die Working Group "Cobol" der ISO hat beschlossen, daß künftig kein Sprachelement mehr aus der Sprache Cobol entfernt werden darf, wenn es nicht vorher in der Kategorie "Veraltet" eingestuft war. Man will damit verhindern, daß ein Sprachelement ohne Übergangsfrist aus der Norm entfernt wird, wie es zum Beispiel beim Übergang von der alten Norm (Cobol68) zur derzeit gültigen Norm (Cobol74) mit der "EXAMINE"-Anweisung geschehen ist.

Folgende Anweisungen sind in der Kategorie "Veraltet": ALTER, STOP literal, RERUN und ENTER. Die Module SEGMENTATION und DEBUG gelten ebenfalls als veraltet. Weiterhin gelten als veraltet und überflüssig die Klauseln MULTIPLE FILE TAPE, LABEL RECORDS, VALUE OF, DATA RECORDS, REVERSED, MEMORY, KEY bei ENABLE und DISABLE und alle Paragraphennamen in der IDENTIFICATION DIVISION ohne PROGRAM - ID.

In die Gruppe der Änderungen bei bestehenden Programmen fallen 43 Modifizierungen. Die wichtigsten betreffen OCCURS, COLLATING sequence beim Schlüssel von Index Files, PERFORM-Anweisung, File Position Indicator, neue Werte für den File-Status (I-O Status) und 49 reservierte Wörter.

In der Gruppe der Neuheiten werden 106 Änderungen der Norm gezählt. Keine dieser Änderungen berührt ein bestehendes Programm! Die wesentlichsten Neuerungen sind: Möglichkeiten der strukturierten Programmierung, geschachtelte Programme, INITIALIZE-Anweisung, Reference-Modifikation (Substrings), REPLACE-Anweisung, De-Editing und In-Line-PERFORM-Anweisung.

Die strukturierte Programmierung hilft bei der Erstellung von leicht lesund damit besser wartbaren Programmen. Dazu gehört vor allem daß die GO TO-Anweisung, wenn schon nicht ganz verboten, so doch nur ganz eingeschränkt benutzt werden soll.

Bisher fehlten in Cobol die nötigen Bereichsbegrenzer (scope delimiter). Im Entwurf gibt es diese Begrenzer für alle bedingten Anweisungen, zum Beispiel END-IF, END-ADD oder END-READ. Diese Begrenzer legen den Gültigkeitsbereich innerhalb einer bedingten Anweisung fest. Es wird also möglich, bedingte Anweisungen innerhalb von bedingten Anweisungen zu verwenden:

Beispiel:

IF condition

THEN READ file

AT END MOVE ... END-READ

PERFORM ... etc.

In diesem Beispiel würden ohne den Bereichsbegrenzer END-READ alle folgenden Anweisungen zur Bedingung AT END gehören, jetzt nur die MOVE-Anweisung. Das neue Wahlwort THEN dient zur besseren Lesbarkeit.

Ebenfalls der besseren Lesbarkeit dient die Nullanweisung CONTINUE, für die keinerlei Code erzeugt wird. Sie kann überall dort benutzt werden, wo bedingte oder unbedingte Anweisungen stehen dürfen, zum Beispiel:

IF condition

THEN CONTINUE

ELSE

...

Die EVALUATE-Anweisung ist eine wesentliche Hilfe in der strukturierten Programmierung. Sie definiert eine Vielfachverzweigung und erlaubt die Ermittlung von Mehrfachbedingungen in einer einzigen Anweisung. Außerdem kann sie die GO TO DEPENDING-Anweisung ersetzen, so beispielsweise:

EVALUATEABC

WHEN 1 ADD 11 TO XYZ

WHEN 2 ADD 10 TO XYZ

WHEN 4 ADD 10 TO XYZ

WHEN 5 ADD 1 TO XYZ

WHEN 6 CONTINUE

WHEN OTHER imperative-statement

END-EVALUATE.

Eine neue Form der PERFORM-Anweisung erlaubt In-Line-Schleifen. Die Syntax hierzu sieht vor, daß kein Paragraphenname angegeben wird und daß nach der Bedingung unbedingte Anweisungen folgen, zum Beispiel:

PERFORM identifier TIMES

MOVE ...

ADD ...

.

.

.

END-PERFORM. (oder Punkt).

Geschachtelte Programmierung erlaubt mehreren Unterprogrammen den Zugriff auf einmalig vorhandene Daten, ohne daß deren Namen einmalig sind. Dies wird erreicht durch Compilierung mehrerer Programme in einem Compileraufruf. Programme, die auf diese Weise compiliert und gebunden werden, werden als "run unit" betrachtet. Die Steuerung kann vom Hauptprogramm zu einem dieser Unterprogramme durch CALL geschehen, ähnlich wie bisher auch. Es gibt mehrere Wege, wie Programme in einer Run Unit auf Daten zugreifen können - durch Parameter, durch Dateien und Daten, die den Zusatz GLOBAL haben oder durch externe Dateiverbinder (external file connectors). Bei der Parameterübergabe gibt es nunmehr die Möglichkeit, zu wählen zwischen BY REFERENCE und BY CONTENT. Die BY REFERENCE-Option wirkt wie die Übergabe von Parametern in der bisherigen Norm. Die Parameter können durch das gerufene Programm benutzt und geändert werden. Bei Verwendung der BY CONTENT-Option ist nur ein Zugriff, jedoch keine Änderung möglich! Eine weitere Möglichkeit, Daten der Unterprogramme einer Run Unit verfügbar zu machen, sind durch die Klauseln EXTERNAL oder GLOBAL gegeben.

Mit der neuen Anweisung INITIALIZE können Datenfelder innerhalb von Sätzen oder Datengruppen (zum Beispiel 01-Stufen) initialisiert werden.

INITIALIZE SATZ1 SATZ2.

In diesem Beispiel werden alle Felder in den Gruppen SATZ1 und SATZ2 entweder auf Leerzeichen oder auf 0 gesetzt, abhängig von der Art ihrer Definition. Soll mit einem anderen Wert als Leerzeichen oder 0 aufgefüllt werden, so wird der Zusatz REPLACING notwendig; zum Beispiel:

INITIALIZE Gruppe REPLACING NUMERIC DATA BY 9.

Die REPLACE-Anweisung erlaubt Änderungen im Quellprogramm eines Programms. Sie kann überall im Quellcode stehen. Sie ist gültig bis zum Auftreten einer neuen REPLACE-Anweisung oder der Begrenzungsanweisung REPLACE OFF. Sinnvoll ist diese Anweisung immer dann, wenn in bisherigen Programmen Datennamen verwendet werden, die nunmehr reservierten Wörter sind, zum Beispiel:

REPLACE = = CLASS = = BY

= = KLASSE = = .

De-Editing ermöglicht die Umkehrung der Druckaufbereitung von Daten. Beispiel:

03 USER-IMPUT-

PIC ZZZ9.99.

03 STORED-INPUT PIC9(4).99.

MOVE USER-INPUT TO

STORED-INPUT.

Nach Ausführung der MOVE-Anweisung können die so übertragenen Daten auch in arithmetischen Anweisungen benutzt werden.

Durch Referenzmodifikation können Teilzeichenketten definiert werden. Dies geschieht durch Angabe der linken Stelle der Teilkette und der Länge.

Beispiel:

01 ADRESSE.

02 ZEILE-1 PIC X(30).

02 ZEILE-2 PIC X(30).

02 ZEILE-3 PIC X(3 0).

Die ZEILE-2 kann nunmehr auch durch folgende Syntax angesprochen werden:

MOVE ADRESSE (31:30)

TO DRUCK-BEREICH (5:30).

Die leichte Verständlichkeit (Lesbarkeit) eines Quellprogramms kann darunter allerdings leiden.

Ein weiteres Syntaxformat erlaubt die Definition von variabel langen Sätzen in einer Datei. Neben dem bekannten FORMAT3:

RECORD CONTAINS integer-4 TO integer-5 CHARACTERS

gibt es nunmehr zusätzlich Format2

RECORD IS VARYING IN SIZE [[FROM integer-2] [TO integer-3] CHARACTERS]

[DEPENDING ON data-name- 1].

Durch dieses Format2 wird gewährleistet, daß nach einer READ-Anweisung in data-name-1 die Länge des aktuellen Satzes steht. Außerdem wird durch

READ filename

INTO . . .

der Satz in der aktuellen Länge gemäß den Regeln zur MOVE-Anweisung übertragen. Ist das Empfangsfeld größer als der aktuelle Satz, wird mit Leerzeichen aufgefüllt. Beim Schreiben oder Zurückschreiben wird der Satz in der Länge geschrieben, die im Datenfeld data-name-1 angegeben ist! Die Klimzüge, die die Programmierer heute teilweise machen mußten - Assembler-Unterprogramme oder nicht normgerechte Subskripte mit negativem Wert, um an das Satzlängenfeld zu kommen - gehören nunmehr der Vergangenheit an. Nur aus Gründen der Kompatibilität zur heutigen Norm ist das Format3 aus der Kategorie "veraltet" zurückgenommen worden und weiterhin uneingeschränkte Sprachmöglichkeit.

Aus den gleichen Gründen wurde auch die ALTER-Anweisung in die Kategotie "Veraltet" genommen; zunächst sollte diese Anweisung sofort aus der Sprache entfernt werden.

Obwohl noch der Datenbankteil und eine Möglichkeit der Bildschirmbehandlung fehlen, hofft die Mehrheit der ISO-Arbeitsgruppe "Cobol" auf möglichst rasche Verabschiedung der neuen Norm. Es ist beabsichtigt, die Module "Datenbank" und "Bildschirm" nach ihrer Fertigstellung in irgendeiner Form zu veröffentlichen, vielleicht als Teil 2 zur Norm.

Auch wenn die neue Norm noch nicht perfekt ist, so enthält sie doch viele Möglichkeiten für eine leichtere und effizientere Programmierung in modernem Cobol, so daß schon allein aus diesen Gründen die Normung zu unterstützen ist.

Siegfried Mahkorn ist wissenschaftlicher Mitarbeiter der GMD, Sankt Augustin bei Bonn.