RPG (Programmiersprache)
Report Program Generator (RPG) ist eine problemorientierte Programmiersprache für den kaufmännischen Bereich. Die Sprache wurde von IBM entwickelt zunächst für das Erstellen von kaufmännischen Listen (Reports). Später wurde RPG erweitert zu einer Programmiersprache.
Geschichte
Die von IBM verfasste Geschichte der maschinellen Datenverarbeitung beschreibt RPG als „Brücke von der Stecktafel zur Datenbank“[1]. Sie ermöglichte daher den Übergang von der Tabelliermaschine (Stecktafel) zum Reportgenerator, wozu als Beispiel das System IBM 1401 herangezogen wurde.
Ähnlich argumentieren die ehemaligen IBM-Mitarbeiter Günther Sander, Hans Spengler bei ihrer Betrachtung von RPG:
„Um die große Anzahl der Umsteiger von Lochkartenmaschinen auf EDV-Systeme, insbesondere auf die IBM 1400-Serie zu unterstützen, entwickelte IBM den Report Program Generator (RPG). Dies ist eine Beschreibungssprache, mit der der Listenaufbau von Tabelliermaschinenanwendungen beschrieben werden konnte und einem Übersetzungsprogramm, das aus den abgelochten Beschreibungsformularen ein 1401-Programm erzeugte.“[2]
oder hier
„Um den Umstieg von traditioneller Lochkartenverarbeitung zu der elektronischen Datenverarbeitung zu erleichtern, wurde die Hochsprache RPG entwickelt und war auf vielen (IBM) Computern ab den 1960er Jahren verfügbar. Ihre Syntax war stark an die Arbeitsweise von Tabelliermaschinen angelehnt, doch die mühsame Verkabelung auf Steckbrettern war dem Schreiben von Sourcecode und Kompilieren gewichen.[3]“
Zu damaliger Zeit arbeitete man mit Tabelliermaschinen und Lochkarten in der Datenverarbeitung, deshalb war der Sprachaufbau, bevor die Version RPG IV erschien, spaltenorientiert. Abgebildet auf Gruppenwechsel.
Die Sprache wird hauptsächlich im Bereich der Großrechner, Minirechner gleich der mittleren Datentechnik, wie beispielsweise auf dem S/390 oder der AS/400 (System i), eingesetzt. Von einer Sprache zur Listenbearbeitung entwickelte sich RPG weiter zu einer Programmiersprache, die alle kaufmännischen Anwendungen abdeckte, inklusive Dialogverarbeitung und Arbeit mit relationalen Datenbanken.
RPG II, RPG III, RPG/400
Programme, die mit RPG geschrieben wurden, pflegt man auch in der heutigen Zeit. Nach Weiterentwicklungen (RPG II, RPG III, RPG/400) können neuere Projekte inzwischen mit dem besseren RPG IV (ILE RPG) geschrieben werden.
RPG-Programme werden in einem Programmzyklus verarbeitet, dessen Schritte sich ständig wiederholen. Im ersten Schritt werden allgemeine Informationen der Kopfzeile (Header) verarbeitet. Danach folgt das Lesen eines Datensatzes und dessen Verarbeitung. Der nächste Schritt ist die Ausgabe der verarbeiteten Daten. Ist danach ein bestimmter Indikator (der LR-Indikator) auf ON gesetzt, so wird das Programm beendet. Falls der Indikator weiterhin auf OFF gesetzt ist, wird der nächste Datensatz für die Verarbeitung vorbereitet.
Ein einfaches Programm kommt mit fünf von insgesamt zehn Bestimmungen aus:
- Calculation (Rechenbestimmung) – Sie dient der Verarbeitung der Daten. Sie legt die Reihenfolge und die jeweiligen Befehle fest
- File Description (Dateibeschreibung) − Sie beschreibt alle vom Programm verwendeten Dateien. Dafür werden folgende Informationen benötigt: 1. Dateiname, 2. Art der Dateiverwendung 3. Satzlänge in der Datei, 4. Eingabe- oder Ausgabeeinheit
- Header-Bestimmung − Sie legt allgemeine Bedingungen und Werte fest.
- Input (Eingabebestimmung) − Sie legt Felder, Konstanten oder Datenstrukturen fest.
- Output (Ausgabeoperation) − Sie beschreibt die Felder und Sätze der Ausgabedateien sowie die Bedingung, unter der die Ausgabe durchgeführt wird.
Der Programmzyklus übernimmt die Verarbeitungsregeln für die jeweilige Datei. Der Programmierer braucht sich also nicht um den Zugriff auf jeden einzelnen Datensatz zu kümmern, was jedoch auch eine gewisse Unflexibilität mit sich bringt. Die Verwendung des Zyklus ist ein Relikt aus RPG II. In heutigen RPG-Programmen wird er meist nicht mehr verwendet. RPG war außerdem mit gewissen Einschränkungen behaftet: So war es beispielsweise nicht möglich, komplexere Berechnungen, wie rekursive Algorithmen, auszuführen.
RPG IV
RPG IV (ILE RPG) ist eine von IBM entwickelte Programmiersprache. Die Abkürzung ILE steht für Integrated Language Environment und bezeichnet eine im Jahr 1993 eingeführte Entwicklungsumgebung. Die erste Sprache, die mit ILE konzipiert wurde, war ILE C/400 für die Version V2R3 des Betriebssystems OS/400. Erst in der Version V3R1 kamen die Sprachen ILE RPG, ILE COBOL/400 und ILE CL (Control Language) hinzu. Mit ILE ist es möglich, ein Programm zu erstellen, das aus Modulen besteht, die in unterschiedlichen Programmiersprachen (die aber der ILE-Familie angehören müssen) geschrieben wurden.
ILE RPG bietet als Nachfolger von RPG einige erhebliche Veränderungen und Erweiterungen:
- Die neue D-Bestimmung (Definitionsbestimmung) ist nun die Standardbestimmung für das Deklarieren von Feldern, Datenstrukturen oder Konstanten.
- Einbindung von SQL-Befehlen zum Lesen bzw. Ändern von Datenbanken.
- Es ist gleichgültig, ob der Quellcode in Groß- oder Kleinbuchstaben geschrieben wird.
- Etliche Beschränkungen wurden korrigiert, z. B. die Erweiterung für die maximale Zeichenlänge von Feldnamen von 6 Zeichen auf 17 Zeichen.
- Vielfältige Möglichkeiten für Datums- und Zeitoperationen.
- Pointerorientierte Operationen.
- Eine Vielzahl integrierter Funktionen wie beispielsweise %trim – entfernen von Leerzeichen.
- Möglichkeit nicht mehr spaltenorientiert arbeiten zu müssen durch die Compiler-Anweisung /FREE (erst ab OS/400-Version 5)
- Unicode-Unterstützung wird laufend verbessert; beispielsweise kann man ab V5R3 „UnicodeFeld = %UCS2(ZeichenFeld)“ kodieren, ab V6R1 reicht „UnicodeFeld = ZeichenFeld“.
- Ab V4R4 gibt es umfassende Unterstützung für die Anbindung von Java-Klassen. Dazu wurde der neue Datentyp „Objekt“ geschaffen, und durch prototypisierten CALL können Java-Methoden in Klassen direkt aufgerufen werden.
- Ab V5R4 können RPG-Programmierer mit den neu geschaffenen Operationsschlüsseln XML-INTO und XML-SAX bequem auf Inhalte von XML-Dokumenten zugreifen.
- Ab V6R1 können Dateien auch lokal (in Funktionen) definiert werden. Die Limits für Zeichenvariablen und Datenstrukturen wurden auf 16 MB angehoben.
Beispiele
1. Dateibeschreibung
FDateiname+IPEASF.....L.....A.E/AEinh.Schlüsselwörter++ Ftest1 IF E DISK
Dieses Beispiel zeigt, wie die Bestimmungen für die Datei test1 festgelegt wird. I definiert eine Eingabedatei, F legt eine voll prozedurale Datei fest, d. h. die Verarbeitung wird nicht dem Programmzyklus überlassen. Durch E wird festgelegt, dass die Datei extern beschrieben ist. DISK gibt an, dass die Datei auf der Festplatte oder im einstufigen Speicher liegt.
RPG genießt eine außerordentlich gute Unterstützung der Datenbank. So ist es beispielsweise möglich, einen bestimmten Satz einer Datei über ihren Key zu lesen (Operationsschlüssel CHAIN), und das in einer Performance, die SQL auf der Plattform „i“ bislang noch nicht erreicht. Dazu reicht die Angabe eines K für „keyed access“ unter dem „A“ vor der „Ein-/Ausgabe-Einheit“.
FDateiname+IPEASF.....L.....A.E/AEinh.Schlüsselwörter++ Ftest1 IF E K DISK
Durch das E in der Dateibeschreibung definiert der Compiler alle in der Datei vorhandenen Felder; wenn Hilfsfelder verwendet werden, die genau so wie die Dateifelder typisiert sein sollen, ist „LIKE“ zu verwenden. Dann reicht es bei Datenbankänderungen oft, nur das entsprechende Programm zu kompilieren. Normalerweise ist das ohnehin nötig, da das Betriebssystem den Aufruf von Programmen, die mit einer älteren Version der Datei erstellt wurden, mit der Ausgabe einer „Aktualitätsprüfung“ verhindert.
2. Prozeduren, Definitionsbestimmungen und Rechenbestimmungen
Programm zur Berechnung der Fakultät
H DFTACTGRP(*NO) H************************************************************ D Fak PR 10I 0 D Zahl 10I 0 VALUE D Wert S 10I 0 D************************************************************ C EVAL Wert = Fak(5) C DSPLY Wert C EVAL *INLR = *ON C************************************************************ P Fak B D Fak PI 10I 0 D Zahl 10I 0 VALUE C C IF Zahl = 1 C RETURN Zahl C ELSE C EVAL Zahl = Zahl * Fak(Zahl – 1) C RETURN Zahl C ENDIF P Fak E
Fak wird mit PR als Prozedur definiert. Das 10I 0 gibt an, dass es sich beim Rückgabewert um eine ganze Zahl handelt, die 10 Stellen lang ist und 0 Dezimalstellen besitzt. Zahl ist der erste Parameter der Prozedur. Er wird mit VALUE als Wertparameter deklariert. Die Prozedur muss schließlich unter den Hauptrechenbestimmungen definiert werden.
Durch die Anweisung EVAL werden Feldern bestimmte Werte zugewiesen. DSPLY gibt eine Programmnachricht aus. INLR (LR = last record = letzter Datensatz) ist der Indikator, der angibt, dass das Programm beendet ist.
3. RPG-Free-Format
DName+++++++++++ETDsVon++++Bi/L+++IDG.Schlüsselwörter++++++++ D Array S 10I 0 DIM(5) D K S 10I 0 /FREE FOR k = 1 TO %elem(Array); Array(k) = k; ENDFOR; EVAL *INLR = *ON; // das EVAL könnte man auch weglassen /END-FREE
Dieses Beispiel zeigt die Verwendung des Free-Formats. Die eigentlichen Anweisungen müssen hierbei zwischen den Compiler-Direktiven /FREE und /END-FREE stehen. Kommentare werden mit // eingeleitet.
RPG Jahr 2016
„Die Sprache, die IBM ursprünglich für Lochkarten-Umsteiger entwickelt hatte, stellt zum Beispiel eine Reihe von Werkzeugen bereit, um Webservices bereitzustellen – jetzt auch komplett nativ in RPG-Code. … Neu in RPG ist auch die ‚Free-Form‘, in der Programmieranweisungen in Spalte 1 beginnen dürfen und keine Längenbeschränkung haben, während in der alten ‚Fixed-Form‘ nur die Spalten 6 bis 80 Code enthalten durfte.[4]“
- (Eine Standard-Lochkarte hatte 80 Spalten, die Spalten 1–5 waren im RPG ursprünglich für die Zeilennummerierung reserviert.)
Plattformen
RPG wurde ursprünglich für die IBM 1401 entwickelt. Für die Systeme /3, /32, /34, /36, /38 wurden immer wieder Erweiterungen geschaffen, welche schließlich mit dem ILE-Konzept auf der AS/400, iSeries und dem System i (vorgestellt 2008) den vorläufigen Höhepunkt erreichten. Es existieren aber auch Implementierungen für Telefunken TR 440, Siemens BS2000, WANG VS und HP3000 sowie verschiedene Compiler für unixbasierte Systeme (Unibol) und PC (Baby/400, Lattice-RPG).
Linux/AIX: Ausgehend von dem ehemals öffentlich zugängigen Projekt „RPG2CPP“ von Edgar Hermanns wird seit 2007 bei der Firma „Phoenix Informatica Bancaria S.p.A.“ im italienischen Trient ein RPG400 zu C++ Übersetzer entwickelt, der RPG400 Anwendungen inklusive der zugehörigen CL Programme in Form nativer C++ Quellen auf Linux und AIX lauffähig macht. Derzeit (Stand Februar 2016) übersetzt der Compiler rund 98 % des Anwendungsbestandes der aus rund 30 Millionen Code-Zeilen in RPG400 besteht. Das Projekt ermöglicht es, weiter RPG400 Programme zu schreiben und auf den genannten Systemen laufen zu lassen. Dabei werden COPY-Statements, DDS-Quellen und Bibliothekslisten sowohl bei der Kompilierung als auch zur Laufzeit unterstützt. Als Datenbank kann dabei sowohl MySQL als auch Oracle eingesetzt werden.
Weblinks
- RPG II: System/36-Compatible RPG II – User’s Guide and Reference (PDF; 3,5 MB)
- RPG IV (ILE RPG): ILE RPG Referenz V7R1
- RPG IV: The RPG IV Developer Network
- IBM Information Center V5R4
- RPGPGM.COM - Eine umfangreiche Informationsquelle mit Beispielen für RPG-Code und zugehöriger Programmierung in englischer Sprache
Einzelnachweise
- Die Geschichte der maschinellen Datenverarbeitung. Band 1, Untertitel IBM Enzyklopädie der Informationsverarbeitung, - IBM Form D 12-0028 (3/91), Überschrift Seite 140
- Günther Sander, Hans Spengler: Die Entwickelung der Datenverarbeitung von Hollerith Lochkartenmaschinen zu IBM Enterprise-Servern. Selbstverlag, Böblingen 2006, ISBN 3-00-019690-0, S. 39.
- „RPG: Brücke von der Stecktafel zur Datenbank“. In: Die Geschichte der maschinellen Datenverarbeitung. Band 1: IBM Enzyklopädie der Informationsverarbeitung, IBM Form D 12-0028 (3/91), Seite 140–141.
- ‚Von Lochkarten zu Webservices: IBM i 7.3‘ Heise online 12. April 2016