IBM-Rollenspiel - IBM RPG


Programmgenerator für RPG- Berichte
IBM RPG-Logo.png
Paradigma Multiparadigma
Entwickler IBM
Erstmals erschienen 1959 ; Vor 62 Jahren ( 1959 )
Stabile Version
RPG IV Version 7 Release 4 / 6. Oktober 2020 ( 2020-10-06 )
Schreibdisziplin Stark , statisch
Betriebssystem CPF , SSP , OS/400 , IBM i , OS/VS1 , z/OS , DOS/VSE , VSE/SP , VSE/ESA , z/VSE , VS/9 , PRIMOS , OpenVMS , Wang VS , Burroughs MCP , HP MPE , MS-DOS , OS/2 , Microsoft Windows
Dialekte
RPG, RPG II , RPG III , RPG 400, RPG IV , RPG/ILE; RPG/Free, Baby/36, Baby/400, Lattice RPG, VAX RPG II
Beeinflusst von
9PAC , FARGO

RPG ist eine höhere Programmiersprache für Geschäftsanwendungen , die 1959 für die IBM 1401 eingeführt wurde . Es ist am bekanntesten als die primäre Programmiersprache der Mittelklasse-Computerproduktlinie von IBM , einschließlich des Betriebssystems IBM i . RPG hat traditionell eine Reihe von charakteristischen Konzepten, wie den Programmzyklus und die spaltenorientierte Syntax. Die neueste Version ist RPG IV , die eine Reihe von Modernisierungsfunktionen enthält, einschließlich Freiform-Syntax.

Plattformen

Die RPG-Programmiersprache wurde ursprünglich von IBM für ihre 1401-Systeme entwickelt. Sie produzierten auch eine Implementierung für das System/360 , und es wurde die primäre Programmiersprache für ihre Midrange-Computer- Produktlinie ( System/3 , System/32 , System/34 , System/38 , System/36 und AS/400). ). Es gab auch Implementierungen für Digital VAX, Sperry Univac BC/7, Univac System 80, Siemens BS2000 , Burroughs B700, B1700 , Hewlett Packard HP 3000 , die ICL 2900- Serie, Honeywell 6220 und 2020, Four-Phase IV/70 und IV/90-Serie, Singer System 10 und WANG VS sowie diverse Compiler und Laufzeitumgebungen für Unix-basierte Systeme wie Infinite36 (ehemals Unibol 36) und PCs (Baby/400, Lattice-RPG).

RPG II-Anwendungen werden weiterhin unter den Betriebssystemen IBM z/VSE und z/OS , Unisys MCP , Microsoft Windows und OpenVMS unterstützt .

Frühe Geschichte

Der Name Report Program Generator wurde ursprünglich 1959 von IBM entwickelt und beschreibt den Zweck der Sprache: Erstellen von Berichten aus Datendateien. FOLDOC akkreditiert Wilf Hey für seine Arbeit bei IBM, die zur Entwicklung von RPG führte. FARGO ( F ourteen-o-one A utomatische R Berich G eneration O peration) war der Vorläufer RPG auf der IBM 1401 .

Beide Sprachen sollten den Techniker von IBM Tabulating Machine (Tab) -Einheitsaufzeichnungsgeräten den Übergang zu den damals neuen Computern erleichtern . Die Techniker von Tab-Maschinen waren es gewohnt, Drähte in Bedienfelder zu stecken , um Eingabe-, Ausgabe-, Steuer- und Zähleroperationen (Addieren, Subtrahieren, Multiplizieren, Dividieren) zu implementieren. Tab-Maschinenprogramme wurden durch Impulse ausgeführt, die in einem Maschinenzyklus abgegeben wurden; daher emulierten FARGO und RPG das Konzept des Maschinenzyklus mit dem Programmzyklus. RPG war FARGO überlegen und ersetzte es schnell als Reportgeneratorprogramm der Wahl.

Die damals allgemein verfügbaren Alternativsprachen waren Assembler , COBOL oder FORTRAN . Assembler und COBOL waren häufiger im Mainframe-Geschäftsbetrieb ( System/360- Modelle 30 und höher) und RPG häufiger von Kunden verwendet, die von der tabellarischen Ausrüstung (System/360-Modell 20) umstiegen.

Rollenspiel II

RPG II wurde mit der System/3- Computerserie eingeführt. Es wurde später auf System/32 , System/34 und System/36 mit einer verbesserten Version der Sprache verwendet. RPG II war auch für größere Systeme verfügbar, darunter den IBM System/370 Mainframe mit DOS/VSE (damals VSE/SP , VSE/ESA und z/VSE ). ICL produzierte auch eine Version auf seinem VME/K- Betriebssystem.

In den frühen Tagen des Rollenspiels war seine größte Stärke der Programmzyklus . Ein Programmierer würde Code schreiben, um einen einzelnen Datensatz zu verarbeiten, und der Programmzyklus würde die Änderung für jeden Datensatz einer Datei ausführen, wobei er sich um den Kontrollfluss kümmert. Zu diesem Zeitpunkt würde jeder Datensatz (einzelne Lochkarte) mit jeder Zeile im Programm verglichen, die auf den Datensatz einwirken würde oder nicht, je nachdem, ob diese Zeile eine "Anzeige" auf "ein" oder "aus" geschaltet hatte. Der Indikator bestand aus einem Satz logischer Variablen mit den Nummern 01-99 für benutzerdefinierte Zwecke oder anderen kleineren Sätzen basierend auf Datensatz-, Feld- oder Berichtsverarbeitungsfunktionen. Das Konzept von Level Breaks und Matching Records ist einzigartig in der RPG II-Sprache und wurde ursprünglich für Kartenleser entwickelt. Die Funktion des übereinstimmenden Datensatzes des Zyklus ermöglichte eine einfache Verarbeitung von Dateien mit einer Header-to-Detail-Beziehung. RPG-Programme, die geschrieben wurden, um den Programmzyklus zu nutzen, könnten komplexe Berichte mit weit weniger Zeilen Computercode erstellen als Programme, die in COBOL und anderen geschäftsorientierten Sprachen geschrieben wurden.

Die Programmdateispezifikationen listet alle Dateien auf, in die geschrieben, gelesen oder aktualisiert werden, gefolgt von Datendefinitionsspezifikationen, die Programmelemente wie Datenstrukturen und dimensionale Arrays enthalten, ähnlich wie ein "Arbeitsspeicher"-Abschnitt eines COBOL-Programms. Es folgen Berechnungsspezifikationen, die die ausführbaren Anweisungen enthalten. Es können Ausgabespezifikationen folgen, die verwendet werden können, um das Layout anderer Dateien oder Berichte zu bestimmen. Alternativ können Dateien, einige Datenstrukturen und Berichte extern definiert werden, wodurch meistens die Notwendigkeit der manuellen Eingabe und Ausgabe von Codes (" I/O ") entfällt .

Rollenspiel III

RPG III wurde für das System/38 und dessen Nachfolger das AS/400 entwickelt . RPG III ist deutlich von der Originalsprache abgewichen und bietet moderne strukturierte Konstrukte wie IF-ENDIF-Blöcke, DO-Schleifen und Unterprogramme . RPG III war auch für größere Systeme verfügbar, darunter den IBM System/370 Mainframe mit OS/VS1 . Es war auch von Unisys für das VS/9- Betriebssystem erhältlich, das auf den UNIVAC Series 90 Mainframes läuft .

Seit der Einführung des IBM System/38 im Jahr 1979 haben die meisten RPG-Programmierer die Verwendung des Zyklus eingestellt, um den Programmfluss mit Standard-Schleifenkonstrukten zu steuern, obwohl IBM weiterhin Abwärtskompatibilität für den Zyklus bereitstellt.

DE/RPG

DE/RPG oder Data Entry RPG war in den frühen 80er Jahren ausschließlich auf der IBM 5280- Serie von Dateneingabe-Workstations verfügbar . Es war RPG III ähnlich, aber es fehlten externe Datenbeschreibungen (DDS), um Daten (Dateien) wie auf dem System/38 und seinen Nachfolgern zu beschreiben. Stattdessen musste der DDS-Teil in die RPG-Quelle selbst aufgenommen werden.

Rollenspiel/400

RPG/400 war effektiv RPG III, das auf AS/400 lief. IBM hat den RPG-Compiler in "RPG/400" umbenannt, aber zum Zeitpunkt seiner Einführung war er identisch mit dem RPG III-Compiler auf System/38. Praktisch alle IBM-Produkte wurden in xxx/400 umbenannt und der RPG-Compiler war keine Ausnahme. Mit dem RPG/400-Compiler kompiliertes RPG III bot der RPG III-Sprache nichts Neues, bis IBM nach mehreren Jahren der Verfügbarkeit von AS/400 mit der Entwicklung neuer Operationscodes wie SCAN, CAT und XLATE begann. Diese Verbesserungen an RPG III waren in der System/38-Version von RPG III nicht verfügbar.

Entwicklungen von Drittanbietern

Eine Firma namens Amalgamated Software of North America (ASNA) produzierte Ende der 1980er Jahre einen Drittanbieter-Compiler für das System/36 namens 400RPG. Ein anderes Unternehmen namens BPS hat einen Drittanbieter-Preprozessor namens RPG II-1/2 entwickelt. Beide Produkte ermöglichten es Benutzern, RPG II-Programme mit RPG III-Opcodes zu schreiben.

Rollenspiel IV

RPG IV , auch bekannt als RPGLE oder ILE RPG ,) wurde 1994 als Teil der V3R2-Version von OS/400 (jetzt bekannt als IBM i) veröffentlicht. Mit der Veröffentlichung von RPG IV war der RPG-Name offiziell kein Initialismus mehr . RPG IV bot eine größere Vielfalt an Ausdrücken innerhalb seiner erweiterten Faktor-2-Berechnungsspezifikation und später in seiner frei formatierten Berechnungsspezifikationen und Verfahrenssyntax. RPG IV ist die einzige RPG-Version, die von IBM auf der aktuellen IBM i-Plattform unterstützt wird.

Im Jahr 2001 bot RPG IV mit der Veröffentlichung von OS/400 V5R1 mehr Freiheit für Berechnungen als die Extended Factor-2 Calculation Specification: ein frei formatierter textfähiger Quelleintrag als Alternative zur ursprünglichen spaltenabhängigen Quelle Format. Die Berechnung "/FREE" erforderte nicht, dass der Operationscode in einer bestimmten Spalte platziert wurde; der Operationscode ist für die Operationen EVAL und CALLP optional; und die Syntax ähnelt im Allgemeinen eher der von Mainstream-Allzweck-Programmiersprachen. Bis November 2013 galt das freie Format ausschließlich für die Berechnungsvorgaben. Mit dem Upgrade von IBM i V7R1 TR7 auf die Sprache entfallen die Berechnungen "/free" und "/end-free" und die Sprache hat endlich die Verbindung zu Lochkarten gebrochen.

Während die Bearbeitung weiterhin über SEU, den einfachen Greenscreen-Editor, erfolgen kann (obwohl die Syntaxprüfung für die ab IBM i V7R1 eingeführten Funktionen nicht unterstützt wird), wurde im Laufe der Zeit eine lange Reihe von Tools entwickelt. Einige davon waren CODE/400 und Visual Age for RPG, die von IBM entwickelt wurden. Derzeit ist die bevorzugte Bearbeitungsplattform IBMs Websphere Development Studio-Client (WDSc), der jetzt RDi (Rational Developer for i) heißt und eine angepasste Implementierung von Eclipse ist. Eclipse und damit RDi laufen hauptsächlich auf PCs und anderen Geräten. IBM erweitert seine Fähigkeiten kontinuierlich und fügt weitere integrierte Funktionen (BIFs) hinzu. Es kann mit Java- Objekten und IBM i- APIs verknüpft werden ; es kann zum Schreiben von CGI- Programmen mit Hilfe des IBM Cgidev2- Web-Toolkits, der RPG-Toolbox und anderer kommerzieller webfähiger Pakete verwendet werden. Trotz der Änderungen behält es ein hohes Maß an Abwärtskompatibilität, sodass ein vor 37 Jahren geschriebenes RPG-Programm heute mit geringen oder keinen Änderungen ausgeführt werden kann.

Der SQL-Precompiler ermöglicht es aktuellen RPG-Entwicklern, die kostenbasierte SQE (SQL Query Engine) von IBM zu nutzen. Beim traditionellen F-Spec-Ansatz musste ein Entwickler einen bestimmten Zugriffspfad auf einen Datensatz identifizieren, jetzt kann er Standard-Embedded-SQL-Anweisungen direkt im Programm implementieren. Beim Kompilieren wandelt der SQL-Precompiler SQL-Anweisungen in RPG-Anweisungen um, die die Datenbankmanagerprogramme aufrufen, die letztendlich die Abfrageanforderung implementieren.

Die Sprache RPG IV basiert auf dem EBCDIC- Zeichensatz, unterstützt aber auch UTF-8, UTF-16 und viele andere Zeichensätze. Die threadsicheren Aspekte der Sprache werden von einigen als idiosynkratisch angesehen, da das Compiler-Team Threads adressiert hat, indem es jedem Thread seinen eigenen statischen Speicher gegeben hat, anstatt die RPG-Laufzeitumgebung erneut eintretend zu machen. Dies wurde festgestellt, um die Unterscheidung zwischen einem Thread und einem Prozess zu verwirren (was RPG IV-Threads zu einer Art Hybrid zwischen Threads und Prozessen macht).

2010 brachte IBM RPG Open Access auf den Markt , auch bekannt als Rational Open Access: RPG Edition . Es ermöglicht die Definition neuer I/O-Handler durch einen Programmierer, wodurch Daten aus Quellen gelesen und in Quellen geschrieben werden können, für die RPG keine integrierte Unterstützung bietet.

Datentypen

RPG unterstützt die folgenden Datentypen.

Hinweis:
Das Zeichen in der Datentypspalte ist das Zeichen, das in der Definitionsspezifikation in der für den Datentyp vorgesehenen Spalte kodiert ist. Zum Vergleich: In einer Sprache wie C, in der Variablendefinitionen im freien Format vorliegen und ein Schlüsselwort wie int zum Deklarieren einer Integer-Variablen verwendet wird, wird in RPG eine Variable mit einer Definitionsspezifikation mit festem Format definiert. In der Definitionsspezifikation, gekennzeichnet durch einen Buchstaben D in Spalte 6 einer Quellzeile, würde das Datentypzeichen in Spalte 40 codiert werden . Wenn das Datentypzeichen weggelassen, d. h. leer gelassen wird, ist der Standardwert A, wenn keine Dezimalstellen angegeben sind, P, wenn Dezimalstellen für eigenständige Felder angegeben sind, und S (ZONED), wenn Dezimalstellen innerhalb angegeben werden eine Datenstruktur.

Datentyp Name Länge Beschreibung
A Alphanumerisches Zeichen 1 bis 16.773.104 Byte (fest)
1 bis 16.773.100 Byte (variable Länge)
Alphanumerisches Zeichen
B Binär numerisch 1 Byte (8-Bit)
2 Byte (16-Bit)
4 Byte (32-Bit)
8 Byte (64-Bit)
Vorzeichenbehaftete binäre Ganzzahl
C UCS-2-Zeichen 1 bis 8.386.552 Zeichen (fest)
1 bis 8.386.550 Zeichen (variabel)
16-Bit-UCS-2-Zeichen ( DBCS oder EGCS)
D Datum 10 Byte Datum: Jahr, Monat, Tag
F Gleitkommazahl numerisch 4 Byte (32 Bit)
8 Byte (64 Bit)
Vorzeichenbehafteter binärer Gleitkomma-Real
G Grafischer Charakter 1 bis 8.386.552 Zeichen (fest)
1 bis 8.386.550 Zeichen (variabel)
16-Bit-Grafikzeichen ( DBCS oder EGCS)
I Integer numerisch 1 Byte (8 Bit)
2 Byte (16 Bit)
4 Byte (32 Bit)
8 Byte (64 Bit)
Vorzeichenbehaftete binäre Ganzzahl
N Zeichenanzeige 1 Byte '1' = WAHR
'0' = FALSCH
O Objekt Größe nicht bekannt Objektreferenz
P Packed dezimal numerische 1 bis 63 Stellen,
2 Stellen pro Byte plus Vorzeichen
Vorzeichenbehaftete Festkomma-Dezimalzahl mit Ganz- und Nachkommastellen
S Zoned dezimal numerisches 1 bis 63 Stellen,
1 Stelle pro Byte
Vorzeichenbehaftete Festkomma-Dezimalzahl mit Ganz- und Nachkommastellen
T Zeit 8 Byte Zeit: Stunde, Minute, Sekunde
U Integer numerisch 1 Byte (8 Bit)
2 Byte (16 Bit)
4 Byte (32 Bit)
8 Byte (64 Bit)
Binäre Ganzzahl ohne Vorzeichen
Z Zeitstempel 26 Byte Datum und Uhrzeit :
  Jahr, Monat, Tag, Stunde, Minute, Sekunde, Mikrosekunden
* Basis-Zeiger
Prozedur-Zeiger
System-Zeiger
16 Byte Adresse an Daten
Adresse an aktivierte Prozedur
Adresse an Objekt

Beispielcode

Das folgende Programm erhält als Eingabeparameter eine Kundennummer und als Ausgabeparameter den Namen und die Adresse zurück. Dies ist die primitivste Version der RPG IV-Syntax. Das gleiche Programm wird später mit nach und nach moderneren Versionen der Syntax und nach und nach lockereren Regeln gezeigt.

      * Historically RPG was columnar in nature, though free-formatting
      * was allowed under particular circumstances.
      * The purpose of various lines code are determined by a
      * letter code in column 6.
      * An asterisk (*) in column 7 denotes a comment line

      * "F" (file) specs define files and other i/o devices
     F ARMstF1   IF   E       K     Disk    Rename(ARMST:RARMST)

      * "D" (data) specs are used to define variables
     D pCusNo          S              6p
     D pName           S             30a
     D pAddr1          S             30a
     D pAddr2          S             30a
     D pCity           S             25a
     D pState          S              2a
     D pZip            S             10a

      * "C" (calculation) specs are used for executable statements
      * Parameters are defined using plist and parm opcodes
     C     *entry        plist
     C                   parm                    pCusNo
     C                   parm                    pName
     C                   parm                    pAddr1
     C                   parm                    pAddr2
     C                   parm                    pCity
     C                   parm                    pState
     C                   parm                    pZip

      * The "chain" command is used for random access of a keyed file
     C     pCusNo        chain     ARMstF1

      * If a record is found, move fields from the file into parameters
     C                   if        %found
     C                   eval      pName  = ARNm01
     C                   eval      pAddr1 = ARAd01
     C                   eval      pAddr2 = ARAd02
     C                   eval      pCity  = ARCy01
     C                   eval      pState = ARSt01
     C                   eval      pZip   = ARZp15
     C                   endif

      * RPG makes use of switches.  One switch "LR" originally stood for "last record"
      * LR flags the program and its dataspace as removable from memory

     C                   eval      *InLR = *On

Das gleiche Programm mit kostenlosen Berechnungen, die ab V5R1 verfügbar sind:

      * "F" (file) specs define files and other i/o devices
     FARMstF1   IF   E        K     Disk    Rename(ARMST:RARMST)

      * "D" (data) specs are used to define variables and parameters
      * The "prototype" for the program is in a separate file
      * allowing other programs to call it
      /copy cust_pr
      * The "procedure interface" describes the *ENTRY parameters
     D getCustInf      PI
     D  pCusNo                        6p 0   const
     D  pName                        30a
     D  pAddr1                       30a
     D  pAddr2                       30a
     D  pCity                        25a
     D  pState                        2a
     D  pZip                         10a
      /free
        // The "chain" command is used for random access of a keyed file
        chain pCusNo ARMstF1;

        // If a record is found, move fields from the file into parameters
        if %found;
           pName  = ARNm01;
           pAddr1 = ARAd01;
           pAddr2 = ARAd02;
           pCity  = ARCy01;
           pState = ARSt01;
           pZip   = ARZp15;
        endif;

      // RPG makes use of switches.  One switch "LR" originally stood for "last record"
      // LR actually flags the program and its dataspace as removable from memory.
        *InLR = *On;
      /end-free

Angenommen, die Beispieltabelle ARMSTF1 wurde mit der folgenden SQL-Anweisung erstellt:

create table armstf1
(arcnum decimal(7,0),
 arname char(30),
 aradd1 char(30),
 aradd2 char(30),
 arcity char(25),
 arstte char(2),
 arzip  char(10))

Das gleiche Programm mit freien Berechnungen und Embedded SQL:

      * RPG IV no longer requires the use of the *INLR indicator to terminate a program.
      * by using the MAIN keyword on the "H" (Header) spec, and identifying the "main" or
      * entry procedure name, the program will begin and end normally without using the
      * decades-old RPG Cycle and instead a more "C like" begin and end logic.
     H  MAIN(getCustInf)
      * "D" (data) specs are used to define variables and parameters
      * The "prototype" for the program is in a separate file
      * allowing other programs to call it
      /copy cust_pr
      * The "procedure interface" describes the *ENTRY parameters
     P getCustInf      B
     D getCustInf      PI
     D  pCusNo                        6p 0   const
     D  pName                        30a
     D  pAddr1                       30a
     D  pAddr2                       30a
     D  pCity                        25a
     D  pState                        2a
     D  pZip                         10a
      /free
        exec sql select arName, arAddr1, arAdd2, arCity, arStte, arZip
                 into  :pName, :pAddr1, :pAddr2, :pCity, :pState, :pZip
                 from   ARMstF1
                 where  arCNum = :pCusNo
                 for fetch only
                 fetch first 1 row only
                 optimize for 1 row
                 with CS;
      /end-free
     P GetCustInf      E

Ab V7R1 des Betriebssystems würde das obige Programm den Prototyp nicht unbedingt in einer separaten Datei benötigen, sodass es vollständig geschrieben werden könnte als:

     H main(GetCustInf)
     D ARMSTF1       E DS
     P GetCustInf      B
     D GetCustInf      PI                  extpgm('CUS001')
     D  inCusNo                            like(arCNum) const
     D  outName                            like(arName)
     D  outAddr1                           like(arAdd1)
     D  outAddr2                           like(arAdd2)
     D  outCity                            like(arCity)
     D  outState                           like(arStte)
     D  outZip                             like(arZip)
      /free
       exec sql select arName, arAdd1, arAdd2, arCity, arStte, arZip
                into  :outName, :outAddr1, :outAddr2, :outCity, :outState,
                      :outZip
                from   ARMSTF1
                where  arCNum = :inCusNo
                fetch first 1 row only
                with CS
                use currently committed;
      /end-free
     P GetCustInf      E

Wenn Sie schließlich das Compiler-PTFs-bezogene Technology Refresh 7 (TR7) auf Ihr 7.1-Betriebssystem anwenden, kann das obige Programm wie folgt vollständig in freier Form codiert werden:

       ctl-opt main(GetCustInf);
       dcl-ds ARMSTF1 ext end-ds;
       dcl-proc GetCustInf;
         dcl-pi *n extpgm('CUS001');
           inCusNo like(arCNum) const;
           outName like(arName);
           outAddr1 like(arAdd1);
           outAddr2 like(arAdd2);
           outCity like(arCity);
           outState like(arStte);
           outZip like(arZip);
         end-pi;
         exec sql select arName, arAdd1, arAdd2, arCity, arStte, arZip
                  into  :outName, :outAddr1, :outAddr2, :outCity, :outState,
                        :outZip
                  from   ARMSTF1
                  where  arCNum = :inCusNo
                  fetch first 1 row only
                  with CS
                  use currently committed;
         return;
       end-proc;

Siehe auch

Verweise

Weiterlesen

Externe Links