COBOL ist eine Programmiersprache, die wie FORTRAN in der Frühzeit der Computerei nach dem zweiten Weltkrieg entstanden ist und eine für diese Branche ungewöhnliche Überlebensfähigkeit bis in die heutige Zeit hinein bewiesen hat.
Die Abkürzung COBOL steht für "Common Business Oriented Language".
Geschichte
Cobol entstand aus dem dringenden Wunsch, eine hardware-unabhängige standardisierte problemorientierte Sprache für die Erstellung von Programmen für den betriebswirtschaftlichen Bereich zu haben. Eine vom amerikanischen Verteidigungsministerium eingesetzte Arbeitsgruppe entwickelte einen Standard aus der Vermählung der damaligen Programmiersprachen FLOW-MATIC von Sperry Univac (Remington-Rand), COMTRAN von IBM. und FACT von Minneapolis-Honeywell. Namentlich beteiligt hieran war eine Frau: Grace M. Hopper.
Das Ergebnis ist dann 1960 als Cobol-60 von CODASYL verabschiedet worden und in der Folgezeit weiterentwickelt und von nationalen und internationalen Normierungsinstituten (ANSI, ISO) standardisiert worden.
COBOL fand schnell den Weg in die zivile Nutzung als eine der ersten kommerziell eingesetzten kompilierbaren und bis heute am weitesten verbreiteten Programmiersprachen, vor allem für kommerzielle Anwendungen.
Sprachsyntax
COBOL zeichnet sich aus durch eine strikte Trennung von Datendeklaration und prozeduralen Anweisungen. Im Prozedurteil kann man nur Variablen benutzen, die vorher im Datenteil deklariert worden sind. Auch das Aussehen von formatierten Ausgaben wird nicht im Prozedurteil, sondern im Datenteil durch die PICTURE-Klausel festgelegt. Der "REPORT WRITER" macht es möglich, die Struktur einer Druckliste komplett im Datenteil als physische Struktur von Seiten, und logische Struktur von Postenzeilen mit Gruppensummen etc zu beschreiben, ohne daß sich der Prozedurteil darum kümmern muß.
Ein COBOL-Programm ist in Teile (DIVISION), Kapitel (SECTION) und Abschnitte (PARAGRAPH) gegliedert. Die vier DIVISIONs sind in ihrer festgelegten Reihenfolge:
- Identification Division mit dem Programmnamen und einigen weitgehend obsoleten Paragraphen für Kommentare;
- Environment Division, wo Schnittstellen zum Betriebs- und dessen Dateisystem definiert werden;
- Data Division mit der Definition der Programmvariablen und Datenstrukturen
- Procedure Division nit den prozeduralen Anweisungen.
In der IDENTIFICATION DIVISION gibt es keine SECTIONs, und in der PROCEDURE DIVISION können neuerdings SECTIONS und auch Paragraphs entfallen. ENVIRONMENT und DATA DIVISIONs können u.U. ganz entfallen.
Das traditionelle Kodierschema bei Cobol entspricht der Lochkarte mit ihren 80 Spalten, d.h Schreibstellen. Dabei waren reserviert
- die ersten 6 Stellen für Zeilennummerierungen
- Spalte 7 zur Kennzeichnung einer Kommentar- oder einer Fortsetzungszeile oder einer, die nur für Debugging übersetzt werden soll
- Spalte 73 bis 80 für sonstige Markierungen wie z.B. den Namen von Programm oder Sourceelement
- Spalte 8 bis 11 für die Namen von Divisions, Sections und Paragraphs.
Der aktuelle Standard (2002) kennt ein fixes Zeilenformat, wo die rechte Randbegrenzung aufgehoben ist, und ein ganz freies Format, wo auch die Einteilung der ersten 12 Spalten aufgegeben ist.
Ursprünglich wurde COBOL nur in Großbuchstaben geschrieben (man hatte nur Lochkarten und Zeilendrucker ohne Kleinbuchstaben), heute können Variablen und COBOL-Anweisungen beliebig groß oder klein geschrieben werden. Die Sprache ist nicht case-sensitive:
Ein fast minimales Cobol-Programm:
Identification Division. Program-ID. HALLOPGM. Procedure Division. Display "Hallo Wikipedianer!" Stop Run.
Die Data Division
- Dateien und deren Satzstrukturen werden in der File Section beschrieben.
- Arbeitsvariable werden in der Working-Storage Section definiert.
- Aufruf-Parameter werden in der Linkage Section definiert.
- Komplexe Drucklisten werden in der Report Section definiert.
- Bildschirmein- und ausgabe in der Screen Section.
Eine Variable in Cobol ist entweder elementar (elementary Item) oder eine Gruppen-Variable (Group Item).
Eine Gruppen-Variable entspricht eine struct in C oder Record in Pascal und die physische Verkettung der sie enthaltenen Untergruppen bzw. elementaren Variablen.
Eine elementare Variable ist entweder alphabetisch, alphanumerisch, numerisch oder numerisch-editiert. Variablen-Definitionen beginnen mit einer Stufennummer gefolgt vom Variablennamen und weiteren Cobol-Klauseln.
Das folgende Beispiel beschreibt das Layout einer z.B. 80-stelligen COBOL-Programmzeile:
01 Cobol-Zeile. 05 Zeilennummer PIC 9(6). 05 Kommentar PIC X. 05 Bereich-A-und-B. 10 Bereich-A PIC X(4). 10 Bereich-B PIC X(61). 05 Zeilen-Endekennung PIC X(8).
Die Stufennummern werden üblicherweise zweistellig geschrieben. Die 01-Stufe ist die oberste Ebene. Alle darunterliegenden Stufennummern - üblicherweise in 5-er-Schritten - werden dann elementar behandelt, außer sie sind wiederum durch Unterstufen deklariert. Folgt auf eine Stufe eine mit höherer Stufennummer, so beginnt eine neue Datengruppe.
Hier ein Beispiel für eine derartige Definition:
01 Oberste-Stufe.
05 Unterstufe. 10 Weitere-Unterstufe. 15 Noch-eine-Unterstufe. 20 Das-element-Alphanum PIC x(1) Value Space. 20 Das-element-Nummerisch PIC 9(1) Value 0. 15 Neue-Gruppenstufe. 20 Das-2-element-Alphanum PIC x(1) Value Space. 20 Das-2-element-Nummerisch PIC 9(1) Value 0. 10 Noch-eine-10-er-Unterstufe. 15 Noch-eine-3-Unterstufe. 20 Das-3-element-Alphanum PIC x(1) Value Space. 20 Das-3-element-Nummerisch PIC 9(1) Value 0. 15 Noch-eine-4-Unterstufe. 20 Das-4-element-Alphanum PIC x(1) Value Space. 20 Das-4-element-Nummerisch PIC 9(1) Value 0.
Abhängig von dem Code lassen sich nun Dateninhalte auf ein Element übertragen:
MOVE "A" TO Das-element-Alphanum.
...oder auf eine Gruppe:
MOVE Spaces TO Noch-eine-4-Unterstufe.
...oder auf die höchste Gruppe:
MOVE ALL ZERO TO Oberste-Stufe.
Durch den Move-Befehl werden die Initialwerte (VALUE) überschritten. COBOL unterscheidet auf Stufenebene nicht nach Felddefinitionen, was u.U. auf der Host-Umgebung zu sog. S0C7 (Datenfehlern) führen kann (Rechnen mit nicht-nummerischen Inhalten)
Die Stufennummern reichen von 01 bis 49, außerdem gibt es noch die Nummern 66, 77 für elementare Definitionen (selten genutzt, da auch auf normalem Weg erreichbar) und 88 für Wertebereiche.
Die Definition eines Wertebereiches sieht als Beispiel so aus:
01 Wertebereich PIC 99
88 Einerwerte Value 1 thru 9 88 Zehnerwerte Value 10 thru 19 88 Zwanzigererwerte Value 20 thru 29
Im Programm-Code kann nun der Inhalt eines Werte mittels "Move" übertragen werden:
MOVE 5 to Wertebereich IF Einerwert ....mach was... END-IF. IF Zehnerwert ....mach was anderes... END-IF. IF Zwanzigerwert ....mach sonstwas... END-IF.
Procedure Division
In der Procedure Divsion findet sich der ausführbare Programmcode. Die Procedure Divsion besteht aus einer oder mehreren Prozeduren. Eine Prozedur ist entweder
- eine Section: Ein Name, der in Spalte 8 beginnt gefolgt von dem Schlüsselwort SECTION und einem Punkt.
- eine Gruppe von Sections
- ein Paragraph: Ein Name, der in Spalte 8 beginnt und mit Punkt endet.
- eine Gruppe von Paragraphs
Eine solche Prozedur besteht dann aus einem oder mehreren Cobol-Anweisungen (Statements).
Die erste Prozedur in der Procedure Division bestimmt den Einstieg in das Programm, die übrigen Prozeduren werden dann mit der Cobol-Anweisung Perform angesprungen. Es gibt keine formale Parameterübergabe, alle Prozeduren haben Zugriff auf alle Felder in der Data Division.
Mittels CALL können externe Programme (Cobol oder andere Programmiersprachen) aufgerufen werden. Dabei werden Parameter By Reference oder By Content übergeben.
Cobol unterstützt die strukturierte Programmierung; die Verwendung des ebenfalls zulässigen GOTOs ist heute verpönt. In der professionellen Programmierung herrschen hausinterne Programmierstandards, die legen dann in der Mehrzahl fest, dass Prozeduren ausschließlich aus einer Section bestehen.
Ziel der Cobol-Syntax soll sein, dass auch ein nicht an formale Programmiersyntax gewohnter Mensch den Sinn eines Cobol-Programm erahnen kann (wenn er oder sie denn etwas Englisch kann). Alle Cobol-Anweisungen beginnen mit einem Verb und davon gibt es viele.
Einfache Codeschnipsel
Zur Darstellung der Syntax wird einfaches C (oder Java) zu Hilfe genommen.
- Ein a = b; ist in Cobol MOVE b TO a.
- Wenn es z.B. in C heißt a = b + c;, dann schreibt ein Cobol-Programmierer entweder ADD b to c GIVING a oder alternativ COMPUTE a = b + c.
- Ein a++; in C entspricht auf Cobol ADD 1 TO a.
IF/ELSE und EVALUATE
IF und ELSE sind so, wie man es erwartet.
If Nenner > 0 Compute Zahl = Zaehler / Nenner Else Display "Ich bin so unglücklich!" Move 0 To Zahl End-If
EVALUATE macht die mehrfache Fallunterscheidung, womit jede Form von CASE oder Switch (wie in C), Folgen von IF/ELSIF/ELSIF/END-IF bis hin zu kompletten Entscheidungstabellen dargestellt werden kann.
Evaluate True When Nenner > 0 Compute Zahl = Zaehler / Nenner When Nenner < 0 Compute Zahl = Zaehler / Nenner * -1 When Other Display "Ich bin schon wieder unglücklich!" Move 0 To Zaehler End-Evaluate
Eine Cobol-Spezialität sind die sogenannten Conditional Statements, das sind Cobol-Anweisungen mit einer Bedingungs-Klausel:
Read Eingabesatz At End Display "Dateiende erreicht " Eingabe-Zaehler " gelesen!" Set Ende-der-Verarbeitung To True Not At End Add 1 to Eingabe-Zaehler End-read
Schleifen
Eine C-Schleife wie for(i=0; i>10;i++) {...} wird in Cobol mit PERFORM kodiert:
Perform Varying i From 1 By 1 Until i > 10 . . . End-Perform
Cobol heute
Die Sprache ist an Batch-Verarbeitung orientiert und enthält z.B. keine Elemente, um interaktive Ein/Ausgabe an einem Terminal oder PC zu programmieren. Dennoch spielt Cobol problemlos eine große Rolle als Programmiersprache bei der Erstellung von Online-Systemen wie CICS oder IMS; solche Transaktionsmonitore stellen ihre Dienste mit einem Cobol-tauglichen API zur Verfügung: Entweder wie z.B. bei IMS als reines CALL-Interface (CALL 'CBLTDLI') oder wie bei CICS als EXEC-Sprache, die von einem Preprozessor in Cobol-Code umgesetzt wird.
Das gleich gilt für den Zugriff auf relationale Datenbanken: Cobol-Programme benutzen dann embedded SQL (EXEC SQL). Auch kann man Stored Procedures in Cobol programmieren.
Neuerungen in Cobol aus der jüngsten Zeit:
- Nested Program erlauben es, innerhalb eines Cobol-Programms Prozeduren mit lokalen Variablen zu schreiben.
- Intrinsic Functions für mathematische und andere Funktionen.
- Rekursion bei externen Calls ist möglich.
- Das Cobol-Verb XML PARSE bietet einen integrierten XML-Parser.
- OO-Erweiterungen erleichterten die Zusammenarbeit mit objektorientierten Menschen und Programmen.
Insgesamt lässt sich sagen, dass mit der Programmiersprache Cobol viel und mit Verstärkung durch Transaktionssysteme und kleinen Hilfsroutinen in C oder Assembler so ziemlich alles geht.
Entwicklung und Standardisierung
Ein Ausschuß des oben erwähnten CODASYL erarbeitete im Jahr 1959 einige Grundsätze, legte den Namen COBOL fest, und veröffentlichte im April 1960 seinen Abschlußbericht mit den ersten Spezifikationen der Programmiersprache, die als COBOL-60 in die Geschichte eingingen.
Im Rahmen von CODASYL gab es dann ständig einen Ausschuß, teilweise mit Unterausschüssen, der bzw. die sich mit der Weiterentwicklung von COBOL befaßten und im Lauf der Jahrzehnte verschiedene Namen und verschiedene Stati innerhalb von CODASYL hatten.
Entwicklung durch CODASYL
COBOL-60 zeigte die Praktikabilität der angestrebten gemeinsamen Programmiersprache.
COBOL-61 war nur teilweise kompatibel mit der Vorgängerversion, wurde aber weitgehend in zahlreichen Compilern implementiert. CODASYL hat sich dann darauf verpflichtet, die Sprache von da aus evolutionär zu weiterzuentwickeln, statt revolutionäre Änderungen vorzunehmen.
Mit COBOL-61 EXTENDED kamen u.a. die SORT-Möglichkeiten und der REPORT WRITER hinzuu.
COBOL, EDITION 1965 fügte u.a. interne Tabellen und Optionen für Dateibearbeitung hinzu.
Weitere Dokumente zur Entwicklung sind die CODASYL COBOL JOURNAL OF DEVELOPMENT der Jahre 1968, 1969, 1970, 1973, 1976, 1978, 1981 und 1984.
Standardisierung durch ANSI
Im Jahr 1960 wurde, angeregt durch den Industrieverband "Computer and Business Equipment Manufacturers Association" im Rahmen der US-amerikanischen Standardisierungsorganisation (ASA) ein "Committe on Computers and Information Processing" mit der Nummer X3, geschaffen, welches dann einen Unterausschuß X3.4 für Programmiersprachen einrichtete, der wiederum einen Unterausschuß X3.3.4 für COBOL einrichtete. Im Dezember 1962 wurden Hersteller und andere Interessierte zur Mitarbeit an der Standardisierung eingeladen, wobei dann festgelegt wurde, daß die Standardisierung auf den Publikationen des CODASYL fußen sollten.
Der erste Standard wurde am 23. August 1968 als USA Standard COBOL 1968 verabschiedet und als Dokument X3.23-1968 veröffentlicht.
Der Ausschuß X3.4.4 wurde dann zum Technischen Komitee X3J4, wie er auch heute noch heißt, und machte sich an die Arbeit, den nächsten Standard zu entwickeln, der dann am 10.5.1974 als American National Standard COBOL 1974 verabschiedet und dann im Dokument ANS X3.23-1974 veröffentlicht wurde.
Der nächste Standard wurde im April 1985 von X3J4 verabschiedet und im September vom zuständigen Entscheidungsgeremium der inzwischen ANSI heißenden Organisation angenommen und dann als ANS X3.23-1985 veröffentlicht. COBOL-85 führte mit Begrenzern wie END-IF und END-PERFORM erstmals die Möglichkeit ein, in COBOL beliebig geschachtelte Entscheidungs- (IF, EVALUATE) und Wiederholungsanweisungen (PERFORM) zu schreiben und damit die sog. "Strukturierte Programmierung" in COBOL zu praktizieren. Zu COBOL-85 wurde später ein Zusatz mit eingebauten (intrisic) Funktionen und eine weiterer mit Korrekturen zum Standard veröffentlicht.
Der aktuelle Standard ist X3.23-2002 und bringt als wesentliche Änderungen die explizite Unterstützung von internationalen Zeichensätzen einschließlich Unicode, die Objektorientierte Programmierung sowie bedingte Compilierung, neben zahlreichen anderen Erweiterungen und Präsizierungen.
Der nächste Standard wird für das Jahr 2008 vorbereitet.
Internationale Standardisierung bei ISO
Das Komitee X3J4 (führe X3.4.4) hat von Anfang an eng mit verschiedenen internationalen Gremien zusammengearbeitet. Dementsprechend stimmte ANS COBOL X3.23-1968 mti der ISO-Empfehlung für COBOL überein.
In der ISO ist das Technical Committee ISO/TC 97, Computers and Information Processing'# zuständig, dessen Sekretariat vom ANSI gestellt wird.
ISO hat zu COBOL eine Empfehlung (Recommendation) R-1989-1972, sowie Standards ISO 1989-1978, ISO 1989-1985 sowie ISO/IEC 1989:2002 verabschiedet.
Module und standardkonforme Implementierungen
COBOL-68, COBOL-74 und COBOL-74 ordneten die verschiedenen Features der Sprache einem Modul mit jeweils einem bis drei "Levels" zu, woraus dann minimale und volle Implementierungen des Standards als Kombination von bestimmten Levels der jeweiligen Module definiert wurden. Eine mit COBOL-2002 konforme Implementierung muß den gesamten Sprachumfang implementieren.
Cobol Compiler
Für Computer der Klassen "Großrechner" und "Mittlere Datentechnik" boten und bieten deren jeweiligen Hersteller -- IBM, Unisys, Siemens, HP, u.a. -- auf ihre proprietären Betriebssysteme zugeschnittene COBOL-Compiler an, z.T. verschiedene Compiler, die beispielsweise verschiedenen Standards entsprechen.
Für Betriebssysteme, die aus der UNIX bzw. MS-DOS-Tradition entstanden sind, gibt es COBOL-Compiler von verschiedenen Software-Herstellern. Näheres siehe in der unten verlinkten COBOL-FAQ von William M. Klein.
Weblinks
- Website des COBOL-Standards: http://www.cobolstandards.com/
- COBOL-FAQ von Bill Klein: http://www.cobolreport.com/faqs/cobolfaq.htm
- Diverse Websites zu COBOL:
- Webring "All Things COBOL": http://www.geocities.com/Eureka/2006/ring.htm
- Eine lustige Geschichte: http://www.windswept.org.uk/funnies/COBOLStory.htm