RPG (programmeertaal)

programmeertaal

RPG is een programmeertaal uit de jaren zestig, die tot op heden met name wordt gebruikt door programmeurs op de IBM System i-midrangesystemen van IBM. Alhoewel RPG een ouderwets imago heeft, is de recentste versie uit 2020 (RPG IV) een moderne programmeeromgeving, die onder andere mogelijkheden biedt voor webtoepassingen. RPG is anno 2020 nog steeds de meest gebruikte programeertaal voor IBM i.[1]

RPG
RPG
Paradigma multiparadigma
Verschenen 1959
Ontworpen door IBM
Huidige versie RPG IV
Typesysteem statisch, sterk
Dialecten RPG, RPG II, RPG III, RPG 400, RPG IV, RPG/ILE; RPG/Free, Baby/36, Baby/400, Lattice RPG
Besturingssysteem CPF, SSP, OS/400, OS/VS1, z/OS, VS/9, OpenVMS, Burroughs MCP, Windows
Portaal  Portaalicoon   Informatica

Geschiedenis bewerken

RPG staat van oorsprong voor Report Program Generator, een taal die, zoals de naam al aangeeft, bedoeld was voor het genereren van rapportages uit een informatiesysteem. Als zodanig was RPG een van de eerste programmeeromgevingen, waarbij de omgeving veel van het programmeerwerk wegnam bij de programmeur. De basis van RPG is de tabelleermachine, ook wel de holleritmachine genoemd. De tabelleermachine werd met stekkerdraadjes geprogrammeerd. De ponskaartinvoer was gesorteerd op een bepaalde codering. Bij wisseling van de codering werd automatisch een (tussen)totaal afgedrukt (cyclis). Dit automatisme maakt ook deel uit van RPG.

Om dit te bewerkstelligen, werkte RPG met de Logic Cycle, een iteratief proces waarin de standaard bewerkingen voor een batchgeoriënteerd programma konden worden uitgevoerd, zoals het openen en sluiten van bestanden (tabellen), het lezen van het invoerbestand etc. De Logic Cycle stond de programmeur toe om in de resultaten in te grijpen door instructie op te nemen in de Calculationsroutine. Deze routine wordt door de Logic Cycle aangeroepen nadat een invoerrecord (rij) beschikbaar is gemaakt, en voordat de uitvoer wordt weggeschreven. Deze calculations staan de programmeur toe om berekeningen te maken, eventueel informatie uit additionele bestanden (tabellen) op te halen en te verwerken, etc. Hoewel de Logic Cycle ook door de huidige RPG-versies ondersteund wordt, wordt deze in de praktijk nog amper gebruikt.

Versies en evolutie bewerken

Vanaf de jaren tachtig heeft RPG een sterke evolutie doorgemaakt op de IBM-systemen S/34, S/36, S/38 en de latere AS/400, eServer iSeries en de huidige System i. Toevoeging van schermafhandeling maakte het mogelijk interactieve programma's te maken. SQL werd beschikbaar gemaakt (maar weinig gebruikt) voor database toegang. Met RPG werd het mogelijk om CGI te implementeren, en op die manier webpagina's te maken. Ook zijn er diverse tools beschikbaar voor het bouwen van een grafische interface.

In de loop der jaren zijn er verschillende RPG-versies uitgekomen die telkens aangepast werden aan de eisen van de tijd:

  • RPG
  • RPG II
  • RPG III
  • RPG IV
  • RPG 400
  • RPG ILE
  • RPG ILE free format

In de laatste free format-versie is het mogelijk om gedeeltelijk af te wijken van het vaste formaat waarin de broncode is geschreven, waardoor het geheel qua structuur meer begint te lijken op andere talen als C, Pascal et cetera. Onder invloed van de eenvoud en de kracht van deze programmeertaal, zijn er ook pc-versies voor diverse RPG-varianten in de handel (geweest), maar door de onbekendheid heeft dit nooit een hoge vlucht gehad. Op webpagina's is het inmiddels mogelijk om RPG-Script te gebruiken.

Inleiding in de syntaxis bewerken

Een RPG-programma bestaat uit vast ingedeelde instructies, die oorspronkelijk maximaal 80 posities lang waren.

Elke instructie bevat een identifier die het type van de instructie aangeeft. De instructietypes zijn:

  • H – Header (komt één keer voor, en biedt mogelijkheden voor het instellen van programma-defaults zoals datumformaat, valutateken).
  • F – File (Declaratie van een bestand)
  • E – Extention (Declaratie van tabellen)
  • D – Definitie (Dit vanaf de ILE-RPG-versie)
  • L – Linecounter (extensie voor programma's met uitvoer naar printers)
  • I – Input (Declaratie van invoer, hulpvariabelen etc.)
  • C – Calculations (Ruimte voor berekeningen, programma-flow etc.)
  • O – Output (Declaratie van uitvoer)

Elke instructie heeft een vaste indeling, waarbij de positie waar een entry staat bepaalt wat de functie van deze entry is.

Voorbeeld van een File declaratie: FBESTAND IP E DISK Waarbij de F bepaalt dat dit een bestandsdeclaratie is; De entry 'BESTAND' is de naam van het bestand (tabel) die moet worden geopend; De I aangeeft dat dit bestand voor Input wordt geopend; De P aangeeft dat dit het Primarybestand is (aansturend voor de Logic Cycle); De E aangeeft dat de definities van het bestand (tabel) en de records (rijen) en velden (attributen) extern kunnen worden opgehaald door de compiler; De entry 'DISK' aangeeft dat het een databestand betreft dat via het schijvengeheugen kan worden benaderd.

Vergelijking van RPG-versies bewerken

Een Hello world-programma in RPG/400:

C                     MOVE 'world'   HWSTR  11         
C                     MOVEL'Hello '  HWSTR             
C           HWSTR     DSPLY                            
C                     SETON                     LR

In de eerste regel wordt variabele HWSTR gedefinieerd (als 11 posities alfanumeriek) en rechts aansluitend gevuld met de tekst world. In de tweede regel wordt variabele HWSTR links aansluitend gevuld met Hello, zodat de waarde van de variabele Hello world is. In één keer vullen is niet mogelijk doordat de vaste ruimte die nodig is voor een tekenreeks van die lengte te klein is. In de derde regel wordt de inhoud van variabele HWSTR op het scherm getoond. In de vierde regel wordt indicator LR aangezet, een systeemvlag die aangeeft dat het programma beëindigd kan worden.

Een Hello world-programma in ILE-RPG:

C     'Hello world' DSPLY                 
C                   EVAL      *inlr = *ON

De truc met de variabele is hier niet nodig, omdat de ruimte vergroot is.

Een Hello world-programma in ILE-RPG free format:

/FREE                 
 DSPLY 'Hello world'  
 *inlr = *ON          
/END-FREE

Hierbij is de vaste indeling losgelaten.