COBOL ist eine Programmiersprache, die in der Frühzeit der Computerentwicklung, Ende der 1950er-Jahre, entstand und bis heute verwendet wird. Der Stil dieser Programmiersprache ist stark an die natürliche Sprache angelehnt und dient vor allem der Programmierung kaufmännischer Anwendungen.
Die Abkürzung COBOL steht für „Common Business Oriented Language“.
Geschichte COBOL entstand aus dem dringenden Wunsch, eine hardwareunabhängige, standardisierte, problemorientierte Sprache für die Erstellung von Programmen für den betriebswirtschaftlichen Bereich anwenden zu können. Die Programmierung kaufmännischer Anwendungen unterscheidet sich von technisch-wissenschaftlichen Anwendungen vor allem durch die Handhabung großer Datenmengen statt der Ausführung umfangreicher Berechnungen. Nachdem die Programmierung technisch-wissenschaftlicher Anwendungen durch FORTRAN bereits sehr vereinfacht worden war, sollte die neue Programmiersprache kaufmännische Problemstellungen, insbesondere die Handhabung großer Datenmengen und deren Ein- und Ausgabe stärker unterstützen – wozu bis dahin weitgehend Assemblersprachen verwendet wurden.
Eine vom amerikanischen Verteidigungsministerium eingesetzte Arbeitsgruppe entwickelte einen Standard aus der Verbindung der damaligen Programmiersprachen FLOW-MATIC von Sperry Univac (Remington-Rand), Commercial Translator (COMTRAN) von IBM und FACT von Minneapolis-Honeywell. Namentlich beteiligt hieran war Grace M. Hopper, die bereits FLOW-MATIC sowie den ersten Compiler (A-0) entwickelt hatte.Grace Hopper, aufgerufen am 8. Juni 2016
Das Ergebnis wurde 1960 als COBOL-60 von CODASYL verabschiedet, in der Folgezeit weiterentwickelt und von nationalen und internationalen Normierungsinstituten (ANSI, ISO) standardisiert.
COBOL fand schnell den Weg in die zivile Nutzung als eine der ersten kommerziell eingesetzten kompilierbaren Programmiersprachen und ist bis heute eine der am weitesten verbreiteten für kaufmännische Anwendungen.
2020 entstand in den USA noch einmal Nachfrage nach COBOL-Entwicklern, als im Zuge der Corona-Pandemie die Arbeitslosenzahlen sprunghaft anstiegen, aber die Verwaltungssysteme der Arbeitslosenversicherung im US-Bundesstaat New Jersey der Nachfrage nicht mehr gewachsen waren."Covid-19: Warum in den USA plötzlich wieder Cobol-Programmierer gebraucht werden" der Standard vom 6. April 2020
Sprachsyntax Ursprünglich wurde COBOL nur in Großbuchstaben geschrieben, da nur Lochkarten und Zeilendrucker ohne Kleinbuchstaben zur Verfügung standen. Auch heute wird nicht zwischen Groß- und Kleinschreibung unterschieden. COBOL ist somit case insensitive. 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, in der Schnittstellen zum Betriebs- und dessen Dateisystem definiert werden; Data Division mit der Definition der Programmvariablen und Datenstrukturen und Procedure Division mit 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 unter Umständen ganz entfallen.
Hieran sieht man die strikte Trennung von Datendeklaration und prozeduralen Anweisungen, durch die sich COBOL auszeichnet. 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 dass sich der Prozedurteil darum kümmern muss.
Kodierung Das traditionelle Kodierschema bei COBOL entspricht der Lochkarte mit ihren 80 Spalten, d. h. Schreibstellen. Dabei waren die ersten 6 Stellen für die Zeilennummerierungen reserviert. Spalte 7 wurde zur Kennzeichnung einer Kommentar- oder einer Fortsetzungszeile beziehungsweise einer, die nur für das Debugging übersetzt werden soll, reserviert. Spalte 8 bis 11 (Area A) beinhaltete die Namen von Divisions, Sections und Paragraphs. Die 12. bis 72. Spalte (Area B) beherbergten alles übrige, zum Beispiel Anweisungen (statements). Spalte 73 bis 80 waren für sonstige Markierungen wie z. B. den Namen des Programms oder Quelltext-Elementen vorgesehen.
Die Standards ab 2002 kennen neben dem fixen Zeilenformat, das die Einteilung in Area A und Area B aufhebt, ein ganz freies Format, das in den Spalten 1 bis 255 alles erlaubt. Die Sonderrolle der Spalte 7 entfällt, da Kommentare mit *> eingeleitet, Literale mittels & zusammengesetzt und Debuggingzeilen mittels bedingter Übersetzung realisiert werden >>DEFINE … >>IF ….
Ein fast minimales COBOL-Programm: Identification Division. Program-ID. HALLOPGM. Procedure Division. Display "Hallo Welt!". STOP RUN.
Datendeklarationen … erfolgen in der Data Division Dateien und deren Satzstrukturen werden in der File Section beschrieben. Statische (globale) Variablen werden in der Working-Storage Section definiert. Automatische (lokale bzw. dynamische) Variablen werden in der Local-Storage Section definiert (siehe Stack). Aufruf-Parameter werden in der Linkage Section definiert. Komplexe Drucklisten werden in der Report Section definiert. Bildschirmein- und -ausgabe in der Screen Section.
Zur Deklaration von Variablen bietet COBOL zahlreiche Klauseln, deren wichtigsten die Stufennummer, die PICTURE-Klausel und die USAGE-Klausel sind.
Stufennummer Die Stufennummer 77 kennzeichnet eine freistehende Variable. Die Stufennummer 01 kann ebenfalls eine freistehende Variable bezeichnen, leitet aber normalerweise die Deklaration einer Gruppe ein – was in anderen Sprachen als Record (Pascal u. ä.) oder struct (C++, C u. ä.) bezeichnet wird. Die Stufennummern 02 bis 49 kennzeichnen dann dieser Gruppe untergeordnete Datendeklarationen, die selber auch wieder Gruppen sein können. Eine Datendeklaration, die keine untergeordneten Datendeklarationen (d. h. mit höheren Stufennummern) hat, wird in COBOL als elementar (elementary item) bezeichnet, anderenfalls ist es eine Gruppen-Variable (group item). Derartige Datendeklarationen kann man abstrakt als Baum darstellen; mit den Gruppen als Knoten und den elementary items als Blättern – denen über die PIC-Klausel Datenformate zugeordnet sind.
Mit der speziellen Stufennummer 66 kann man ganzen Speicherbereichen einen anderen Namen geben, mit 88 einen Bedingungsnamen definieren, der wie ein boolescher Ausdruck in zum Beispiel einer IF-Anweisung verwandt werden kann.
Die Stufennummern werden üblicherweise zweistellig geschrieben. Aus den Lochkartenzeiten stammt die Gewohnheit, die Stufennummern in einer Gruppendefinition nicht fortlaufend, sondern in Schritten von 5 oder 10 zu vergeben, weil man dann Zwischenstufen einfügen konnte, ohne gleich einen ganzen Kartenstapel neu lochen zu müssen.
Das folgende Beispiel beschreibt das Layout der traditionellen 80-stelligen COBOL-Programmzeile:
01 Cobol-Zeile USAGE DISPLAY. 05 Zeilennummer PIC 9(6). 05 Indikator PIC X. 88 Ist-Kommentar VALUES '*' '/'. 88 Ist-Fortsetzungszeile VALUE '-'. 88 Ist-Debuggingzeile VALUE 'D' 'd'. 05 Bereich-A-und-B. 10 Bereich-A PIC X(4). 10 Bereich-B PIC X(61). 05 Zeilen-Endekennung PIC X(8).
Die Definition eines Wertebereiches sieht als Beispiel so aus:
01 Wertebereich PIC 99V99 USAGE COMPUTATIONAL. 88 Einerwerte Value 1 thru 9. 88 Zehnerwerte Value 10 thru 19. 88 Zwanzigerwerte Value 20 thru 29.
Internes und Externes Datenformat Äußere Erscheinung und interne Repräsentation werden im Wesentlichen durch die Klauseln PICTURE und USAGE bestimmt. Mit USAGE COMP werden binäre Rechen- und Vergleichsoperationen ausgeführt, USAGE DISPLAY dient zur Anzeige. Arithmetische Operationen und Vergleiche (kleiner/gleich/größer …) sind mit USAGE COMP-3 direkt möglich.
Mit Angaben hinter PICTURE wird die Anzahl der Stellen/Zeichen oder auch Editiersymbole wie Dezimal- oder Tausendertrennzeichen, Vorzeichen, Währungssymbole, gedachtes Dezimaltrennzeichen (V) etc. festgelegt. Sie bestimmen eine elementare Variable damit als entweder alphabetisch, alphanumerisch, numerisch oder numerisch-editiert. Sind für arithmetische Operationen (wie ADD BETRAG-X to SUMME-Y oder IF DATUM-A > DATUM-B) Variablen mit uneinheitlichen numerischen Formaten beteiligt, so wird vor der Operation automatisch eines oder beide der Datenfelder in ein (für die Operation) gültiges Format konvertiert.
Die Formatierung für sichtbare Ausgaben wird durch die Datendeklaration bestimmt, nicht durch prozedurale Anweisungen wie in Sprachen wie Pascal oder C. Weitere der insgesamt etwa 60 möglichen Klauseln einer Datendeklaration möge man in einem COBOL-Handbuch nachschlagen.
Tabellenformate Mehrfach auftretende Daten (in COBOL ‚Tabellen‘ genannt, siehe Feld (Datentyp)) werden durch die OCCURS-Klausel definiert; Beispiel für eine mehrdimensionale Tabelle: 05 PRODUKT OCCURS 100. 10 PRODUKTNR PICTURE 999. 10 PRODUKTNAME PICTURE X(30). 10 PREIS PICTURE 999V99 OCCURS 5 INDEXED BY IND_KUNDENGRUPPE. Die Occurs-Klausel ist sowohl je Datengruppe als auch für Elementarfelder möglich. Die Adressierung der jeweiligen Dimension kann alternativ durch die Index-Methode (Zusatz Indexed BY <IND-NAME>) oder durch ein Subscript erfolgen: Ein ‚Subscript‘ ist der Name einer (numerischen) Variable im jeweiligen COBOL-Befehl (Beispiel: MOVE PRODUKTNR (PNR) TO xx). Ein ‚Index‘ enthält die Distanz der zu adressierenden Datendimension zum Beginn der Tabelle und wird mit einem SET-Befehl explizit auf diesen Wert eingestellt: SET IND_KUNDENGRUPPE BY KUNDENGRP. Die Indizierung ist vorteilhaft, wenn sich mehrere/viele Einzelbefehle auf die zu adressierende Dimension beziehen, weil der wesentliche Teil der Adressberechnung nicht je Befehlsausführung, sondern bei SET erfolgt.
Die Maschinenbefehle zur Berechnung des Abstands der durch Index/Subscript adressierten Dimension zum Anfang der Tabelle {z. B. (PNR-1)*Länge(Datengruppe PRODUKT)} werden in beiden Versionen automatisch dem eigentlichen COBOL-Befehl (MOVE, IF usw.) vorangestellt und ausgeführt. In mehrdimensionalen Tabellen (siehe Beispiel) können beide Adressierungsmethoden gemischt angewendet werden.
Mit dem Zusatz DEPENDING ON xxx kann die Anzahl der Tabellenelemente variabel definiert werden.
Prozedurale Anweisungen In der Procedure Division findet sich der ausführbare Programmcode. Die Ausführung beginnt mit der ersten Anweisung hinter der Überschrift Procedure Division bzw. den DECLARATIVES, deren Ausführung nur durch bestimmte Ereignisse ausgelöst wird. Danach werden alle Anweisungen sequentiell ausgeführt, bis ein STOP RUN das Programm beendet, oder ein GO TO bzw. PERFORM (mit anschließender Rückkehr) zu einer anderen Stelle im Programm verzweigt.
Die Procedure Division besteht aus einer oder mehreren Prozeduren. Eine Prozedur ist entweder eine Section: Bezeichnet mit einem Namen, der in Spalte 8 beginnt, gefolgt von dem Schlüsselwort SECTION und einem Punkt; enthält meist mehrere Paragraphen. ein Paragraph: Bezeichnet mit einem Namen, der in Spalte 8 beginnt und mit Punkt endet. Eine solche Prozedur enthält die Anweisungen des COBOL-Programms (Statements).
Prozeduren können mit der COBOL-Anweisung Perform von anderen Stellen im Programm aus ausgeführt/aufgerufen werden. Durch den Zusatz THRU <proz-name> in der Perform-Anweisung können mehrere Prozeduren zur Ausführung zusammengefasst werden. Es gibt keine formale Parameterübergabe, alle Prozeduren haben Zugriff auf alle Felder in der Data Division.