[[Vorlage(Getestet, bionic)]]

{{{#!vorlage Wissen
[:Pakete installieren: Installation von Programmen]
[:Editor: Einen Editor öffnen]
[:Terminal: Ein Terminal öffnen]
}}}
[[Inhaltsverzeichnis]]

Wenn man Programme, die in [wikipedia:COBOL:] geschrieben sind bzw. selber Programme in COBOL schreiben möchte, unter Linux kompilieren möchte, benötigt man einen Compiler wie [https://open-cobol.sourceforge.io/ GnuCOBOL] {en} (ehemals OpenCOBOL). Dieser übersetzt COBOL-Quellcode in C-Quellcode und kompiliert diesen generierten Code mittels dem [:GCC:].

Die aktuelle Version 1.1 implementiert große Teile des COBOL 85- und COBOL 2002-Standards sowie Teile von IBM COBOL, Micro Focus COBOL, MVS COBOL, BS2000 COBOL und ermöglicht grafische Bildschirmausgaben im [:Terminal:] durch Benutzung von [wikipedia:Ncurses:]. Weiterhin ist es möglich, auf Datenbanken zuzugreifen sowie Webservices zu erstellen. Entgegen allem Anschein befindet sich GnuCOBOL in aktiver Entwicklung!

= Installation =
Möchte man GnuCOBOL unter Ubuntu einrichten, muss man folgendes Paket installieren [1]:
{{{#!vorlage Paketinstallation
open-cobol, universe
}}}

= Programmbeispiel =
Um die Funktionsfähigkeit von GnuCOBOL zu testen, sollte man das unten stehende "Hallo-Welt"-Programm in einem Editor [2] erstellen:
{{{#!code cobolfree
IDENTIFICATION DIVISION.
PROGRAM-ID. HALLO-WELT.
PROCEDURE DIVISION.
      DISPLAY "Hallo Welt!".
STOP RUN.
}}}
Anschließend speichert man die Datei als '''HalloWelt.cbl''' und öffnet ein Terminal [3], in welches man folgenden Befehl zum Übersetzen des Quellcodes eingibt:
{{{#!vorlage Befehl
cobc -x -free HalloWelt.cbl
}}}

Sofern man keine Fehler gemacht hat, erscheint im selben Verzeichnis eine ausführbare Datei namens '''HalloWelt'''. Diese Datei kann man mit dem folgenden Befehl ausführen:
{{{#!vorlage Befehl
./HalloWelt
}}}

= Wichtige Parameter =
== Kompilierungsmöglichkeiten ==
Folgende Parameter können den Übersetzungs- und Kompilierungsprozess beeinflussen. Ohne Angabe von Parametern versucht der Compiler ein dynamisch-gelinktes Modul zu bauen. Dies entspricht dem Kommandozeilenparameter `-m`.

|| <-2 rowclass="titel">'''Kompilierungsmöglichkeiten''' ||
|| <rowclass="kopf":>'''Parameter''' || <:>'''Erläuterung''' ||
|| `-E` ||  Nur [wikipedia:Pr%C3%A4prozessor:Präprozessor]. Compiler-Richtlinien ausgeführt werden. Kommentarzeilen werden entfernt. COPY-Anweisungen werden erweitert. Die Ausgabe des Ergebnisses erfolgt im Terminal ||
|| <rowclass="highlight">`-C` ||  Der Quellcode wird in C übersetzt. Das Ergebnis wird als '''*.c''' gespeichert. Außerdem wird die dazugehörige Header-Datei erzeugt (*.h) ||
|| `-S` ||  COBOL-Quelltext wird übersetzt, kompiliert und die Header- und der C-Quelltext werden zusammengefasst. Das Ergebnis wird als '''*.s''' gespeichert ||
|| <rowclass="highlight">`-c` ||  Der Quellcode wird nur übersetzt und kompiliert, aber noch nicht gelinkt. Das Ergebnis wird als '''*.o''' gespeichert ||
|| `-m` ||  Der Quellcode wird übersetzt, kompiliert und ein dynamisch-gelinktes Modul (z.B. ein Unterprogramm) wird erzeugt. Das Ergebnis wird als ''*.so'' gespeichert. Dies ist der Standard. ||
|| <rowclass="highlight">`-x` ||  Der Quellcode wird übersetzt, kompiliert und ausführbar gemacht ||
|| `-std=<dialect>` ||  Kompiliert Quellcode, der für einen spezifischen Dialekt geschrieben wurde. Verfügbare Dialekte: cobol2002, cobol85, ibm, mvs, bs2000, mf (Micro Focus), default ||
|| <rowclass="highlight">`-h` ||  Zeigt die Hilfe an. Hier sind weitere Parameter aufgezählt, die Code-Optimierungen oder zusätzliche Warnungen bieten ||

== Quellcodeformate ==
OpenCOBOL unterstützt sowohl fixe als auch freie Formatierungen des Quellcodes:

|| <-2 rowclass="titel">'''Quellcodeformate''' ||
||  <rowclass="kopf":>'''Parameter''' || <:>'''Erläuterung''' ||
||  `-fixed` ||  Fixes Format, d.h. die ersten 6 Spalten in jeder Zeile müssen entweder frei oder durchnummeriert 
(z.B. `000100`, `000200`, ...) sein. Weiterhin dürfen keine Zeichen nach der 72. Spalte stehen. Dies ist der Standard. ||
||  <rowclass="highlight">`-free` ||  Freies Format, d.h. die ersten 6 Spalten in jeder Zeile müssen __nicht__ frei gelassen bzw. nummeriert werden. 
Keine Spaltenbegrenzung vorhanden.
__Muss__ beim Übersetzungs-/Kompilierungsbefehl mitgegeben werden, sofern dieses Format genutzt wird, um Fehler zu vermeiden. 
(s. obenstehendes Programmbeispiel) ||

Die fixe Schreibweise ohne Zahlen ist die gebräuchlichste unter COBOL-Programmierern, da man die Quelltexte somit auch unter anderen Compilern problemlos kompilieren kann, die den Parameter `-free` nicht kennen. Allerdings sollte man darauf achten, keine Compiler-spezifischen Quelltexte zu schreiben, wenn man verschiedene Compiler bedienen soll.

Das "Hallo-Welt"-Programm im fixen Format ohne Nummerierung:
{{{#!code cobolfree
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HALLO-WELT.
       PROCEDURE DIVISION.
              DISPLAY "Hallo Welt!".
       STOP RUN.
}}}

Und mit Nummerierung:
{{{#!code cobolfree
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HALLO-WELT.
000300 PROCEDURE DIVISION.
000400        DISPLAY "Hallo Welt!".
000500 STOP RUN.
}}}

Möchte man das fixe Format kompilieren und ausführbar machen, kann man das `-free` aus dem obigen Beispiel weglassen:
{{{#!vorlage Befehl
cobc -x HalloWelt.cbl
}}}

== Warnungen beim Kompilieren ==
{{{#!vorlage Hinweis
Standardmäßig werden keinerlei Warnungen, sondern nur Fehler angezeigt!
}}}

Folgende Parameter können weiterhin übergeben werden, um die Anzahl der Warnungen zu beeinflussen:

|| <-2 rowclass="titel"> '''Warnungen beim Kompilieren''' ||
||  <rowclass="kopf":>'''Parameter''' || <:>'''Warnungen''' ||
||  `-Wall` ||  Alle Warnungen werden angezeigt. ||
||  <rowclass="highlight">``-Wcolumn-overflow`` ||  Warnt, wenn im Quellcode Zeichen nach der 72. Spalte stehen. ||
||  `-Wparentheses` ||  Warnt, wenn Klammern um eine AND-Verknüpfung in einer OR-Verknüpfung vergessen wurden. ||
f
Der Parameter `-h` zeigt zusätzliche Möglichkeiten für Warnungen an.

= Links =
 * [sourceforge:open-cobol:GnuCOBOL Projektseite] {en}
 * [http://opencobol.add1tocobol.com/ GnuCOBOL FAQ] {en}

#tag: Programmierung