Ich wurde Online von einem jungen Programmierer gefragt, wie man denn in COBOL klassischerweise druckt.
Nun denn, hier ein COBOL „Hello, World!“ mit klassischer Druckausgabe. Ist auch ein guter Test für das WP-GeSHi-Highlight Plugin.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--- *1 IDENTIFICATION DIVISION. PROGRAM-ID. CobPrint. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. *2 FILE-CONTROL. SELECT OutPrt ASSIGN TO PRINTER. DATA DIVISION. *3 FILE SECTION. FD OutPrt. 01 OutRec PIC X(80). *4 WORKING-STORAGE SECTION. 01 Hello PIC X(80) VALUE "Hello, World!". PROCEDURE DIVISION. Main. OPEN OUTPUT OutPrt. *5 WRITE OutRec FROM Hello AFTER 1. CLOSE OutPrt. Finito. EXIT PROGRAM.
Also das ist zwar ILE-COBOL auf einer IBM i – ist aber genauso mit GnuCOBOL zu kompilieren und läuft auch. Natürlich nutze ich hier keine IBM i Features wie extern beschriebene Drucker-Dateien – es sollte ja klassisches COBOL sein.
Nun zu den einzelnen *-Kommentaren im Source-Code:
- Ich gehe davon aus, dass zumindest grundlegende COBOL Kenntnisse vorhanden sind, und gehe nicht näher auf DIVISIONS, SECTIONS, *-A-B, usw. ein.
- In der FILE-CONTROL müssen wir die Datei definieren. Der SELECT hat hier nichts mit SQL zu tun, sondern weist der Datei „OutPrt“ (den Namen darf man sich selbst aussuchen) einem „Gerät“ oder eben einer Datei zu. „PRINTER“ bedeutet eben, dass wir in diese Datei drucken wollen – um den Rest muss sich das Betriebssystem kümmern.
- In der FILE SECTION wird nun der Datei „OutPrt“ ein programminterner Speicherbereich – in unserem Fall einfach 80-Zeichen am Stück – zugewiesen. Das ist unsere Druckzeile, die wir mit wechselnden Daten fühlen können.
- In der WORKING-STORAGE SECTION definieren wir nun, was wir drucken wollen. Hier der Einfachheit halber ein Feld „Hello“ mit 80 Zeichen am Stück und dem Wert „Hello, World!“.
- Natürlich muss die Datei OutPrt geöffnet und geschlossen werden. Spannend ist aber die WRITE Anweisung. Mit FROM können wir direkt angeben, was geschrieben werden soll – müssen das nicht vorher in das Feld „OutRec“ bringen. Und „AFTER 1“ bedeutet, dass VOR dem Ausdruck 1 Zeilenvorschub gemacht wird – also drucke NACH 1 Zeilenvorschub.
Alternativ zum „AFTER 1“ gibt es noch „BEFORE x“ – da erfolgt der Zeilenvorschub nach dem Ausdruck – und auch AFTER|BEFORE 1 PAGE – da erfolgt dann ein Seitenvorschub.
Am besten liest man sich das alles mal in einer COBOL Referenz durch.
COBOL ist eine sehr wortreiche Sprache, das is auch gewollt, und macht COBOL auch sehr gut lesbar.
Zum Schluß noch der ewige Kampf COBOL vs. RPG … natürlich geht so ein Hello World auch in RPG/III – und das Folgende ist mal die kürzeste Version, die mir dafür einfällt:
----+X*--1----+----2----+----3----+----4----+----5----+----6----+----7--- FQPRINT O F 80 PRINTER C MOVE *ON *INLR OQPRINT D 1 LR O 13 'Hello, World!'
Wie man sieht ist RPG/III wesentlich kompakter als COBOL. Das ist zwar schön, weil die Programme damit wesentlich kürzer sind. Aber besser lesbar ist das nur für jemanden, der sehr routiniert ist.
Die Full-Free RPG Version ist da schon viel besser gut lesbar.
**FREE Dcl-F QPRINT Printer(80); Dcl-DS OutputDS; Hello Char(80) Pos(1) Inz('Hello, World!'); End-DS; Write QPRINT OutputDS; *INLR = *ON;
Wer noch eine kürzere Version von „Hello, World!“ mit Druckausgabe in RPG (fixed oder free) kennt, kann mir diese gerne schicken.