Az RPG programozási nyelv

Alprogramok, modulok

Mivel a változók mind globálisak, ezért paraméterátadás szubrutin hívásakor nincs, egyetlen érdekes eset van: ha egy másik programot hívunk meg, és annak kell bemenő paramétert adni. Két utasítás segíti a paraméterátadást, a PLIST és a PARM.
Pl.:

C SPCL PLIST
C PARM FLD1
C PARM FLD2
C PARM FLD3

A példában jól látható, hogy milyen formában is kell több paraméter esetén azokat felsorolni.
A PLIST egy nevet rendel hozzá a paraméterhalmazhoz, a PARM-ban egy-egy paramétert adhatunk meg. A tárfoglalás csak a hívó programban történik meg, ha a hívott program változtat azértéken, akkor az azonnal a tártrületen okoz módosulást. Ha megszeretnénk tartani az átadáskori értéket (pl. abnormális lefutás kivédése) akkor a következő lehetőségünk van: a PARM második faktorában megadunk egy változónevet, ez híváskor belemásolódik a RESULT pozíción álló változóba. A hívott program indulásakor a paraméterek a hívott program PARM utasításában álló első faktorba másolódik, a lefutás végén a második faktor bekerül a RESULT mezőbe, de csak akkor, ha normális volt a lefutás.
Az RPG IV-es változata ezen a téren is hozott -- a mainstream nyelvek tulajdonságait kölcsönző -- újdonságokat, vizsgáljuk meg ezeket is:

Alprogramok, bounding

Először is röviden (részletek az ILE Reference című könyvben, vagy nálam specin) szót kell ejtenünk az ILE 2-féle hívási módjáról. Az AS/400 eredeti programozási környezete (OPM) egyféle hívási módot támogatott: az ún. dynamic program callt (másnéven late binding). Ez azt jelenti, hogy a hívottra a referenciát a rendszer futásidőben oldja fel. Ez az akkor elterjedt nyelveknek (COBOL, RPG), amelyek kevés függvényhívással operáltak, elegendő volt, viszont a C-hez hasonló nyelveknek nem volt megfelelő, mert erőforrásigényes, másrészt az OPM nem tette lehetővé pl. lokális változók használatát. Később az ILE megjelenése oldotta meg ezeket a problémákat, amely a static call bevezésével lehetővé tette, hogy egy programon belüli alprogramok egymást gyorsan hívják, ill. bevezette a statikusan tárolt globális változók mellett a stacken tárolt lokális változók, ill. a heapen való memóriafoglalás lehetőségét.

Egy RPG IV program egy főprogramból (main procedure), és 0 vagy több alprogramból (subprocedure) áll. A főprogram és az alpgrogramok közti leglényegesebb különbség, hogy az alprogramokban nincs RPG ciklus. A főprogam elhagyható, ha megadjuk a NOMAIN kulcsszót a kontrol specifikációban. Ekkor nincs főprogram, és nem generál a fordító RPG-cikluskódot sem. Ennek akkor lehet értelme, ha olyan modult írunk, amelyik nem tartalmaz program belépési pontot (pl. egy program 1 kivételével az összes modulja ilyen). Így a fölösleges kódgenerálás megspórolásával helyet takaríthatunk meg. Egy NOMAIN modul nem tartalmazhat specifikációkat primary vagy secondary file-okra, részlet- és összeg-kiírásokra, és általában az RPG-ciklushoz tartozó dolgokra.

Végül érdemes felsorolni az alprogramoknak (subprocedure) a korábbi szubrutinokhoz (subroutine) képesti bővebb lehetőségeit:

Ugyanakkor meg kell jegyezni, hogy egy EXSR egy hagyományos szubrutinra gyorsabb, mint egy alprogram hívása.