RPG

300. 活動化グループとは(2)

活動化グループの理解を深めるために活動化グループとは何かをもう少し解説する。
活動化グループとは実行中のジョブのメモリを分割して管理する機能である。

*CALLER

先に(1)で説明したように活動化グループ : *CALLERは呼び出し元の親プログラムの
メモリ生存に依存することである。
*CALLERとなるプログラムはRETURNで親に戻ってもメモリ内に
留まっているのでもう一度呼び出されても変数値などは
元のままで維持されている。
このことはパフォーマンスが良くなるだけでなくプログラムの振る舞いとして
サービス・プログラム(*SRVPGM)に利用されている。
サービス・プログラム(*SRVPGM)とは Windows の
DLL (ダイナミック・リンク・ライブラリ)と同じであり複数の親プログラムから
共有して利用される機能を関数として*SRVPGMに登録する。
すると多くのプログラムから*SRVPGMの関数を利用することができる。
IBM i での C/400 ( C言語 ) のライブラリ関数はすべて IBM 提供の*SRVPGMとして
提供されている。

親のプログラムが活動中であれば*CALLERとなる子プログラムも
メモリの中に生存し続けるのだが親の消滅とともに*CALLERとなる子プログラムも
メモリの中より消滅する。

*NEW

RPG III などの OPM プログラム( ILE に対して旧来のプログラムは OPM と呼ばれる)は、
*NEWと呼ばれる。
*NEWのプログラムは終了するとメモリ内より消滅する。
( IBM i の単一レベル記憶で実際は消滅しないでメモリ内に留まり続けて
次の呼び出しではメモリ・マップよりロードされるので
呼び出し速度が速くなる。これは読者も体験的に理解されていると思う)

*NEWであれば次回の呼び出しの都度、すべての変数値は初期化されて
ロードされて新しいプログラムとして起動する。
ILE が発表するまでの RPG III などはこの動作であった。
従って従来と同じ動作を再現したいのであれば活動化グループは*NEW
指定するのが正しい。

CRTBNDRPG コマンドでは

省略時の活動化グループ  . . . .   *YES

ではなく

省略時の活動化グループ  . . . . > *NO        
活動化グループ  . . . . . . . .   *NEW

として指定するのが正しい指定である。

名前(QILEなど)

活動化グループ明示的に名前を命名して活動化グループとすることができる。
IBM は省略時の活動化グループとして QILE という名前の活動化グループを
推薦しているが、それまでの RPG III や CLP などの OPM が混在している状況では
QILE は別の管理が必要となってしまう。
すべてが ILE プログラムとして開発されており例外なく ILE で動作しているなら別だが、
CLP も ILE として開発している例が果たしてあるだろうか?
この理由によって QILE という活動化グループで作成するのは
米国の IBM ユーザーにも受け入れられなかった。
やはり活動化グループは*NEWとして作成することが一般的である。