活動化グループの理解を深めるために活動化グループとは何かをもう少し解説する。
活動化グループとは実行中のジョブのメモリを分割して管理する機能である。
先に(1)で説明したように活動化グループ : *CALLER
は呼び出し元の親プログラムの
メモリ生存に依存することである。
*CALLER
となるプログラムはRETURN
で親に戻ってもメモリ内に
留まっているのでもう一度呼び出されても変数値などは
元のままで維持されている。
このことはパフォーマンスが良くなるだけでなくプログラムの振る舞いとして
サービス・プログラム(*SRVPGM
)に利用されている。
サービス・プログラム(*SRVPGM
)とは Windows の
DLL (ダイナミック・リンク・ライブラリ)と同じであり複数の親プログラムから
共有して利用される機能を関数として*SRVPGM
に登録する。
すると多くのプログラムから*SRVPGM
の関数を利用することができる。
IBM i での C/400 ( C言語 ) のライブラリ関数はすべて IBM 提供の*SRVPGM
として
提供されている。
親のプログラムが活動中であれば*CALLER
となる子プログラムも
メモリの中に生存し続けるのだが親の消滅とともに*CALLER
となる子プログラムも
メモリの中より消滅する。
RPG III などの OPM プログラム( ILE に対して旧来のプログラムは OPM と呼ばれる)は、
*NEW
と呼ばれる。
*NEW
のプログラムは終了するとメモリ内より消滅する。
( IBM i の単一レベル記憶で実際は消滅しないでメモリ内に留まり続けて
次の呼び出しではメモリ・マップよりロードされるので
呼び出し速度が速くなる。これは読者も体験的に理解されていると思う)
*NEW
であれば次回の呼び出しの都度、すべての変数値は初期化されて
ロードされて新しいプログラムとして起動する。
ILE が発表するまでの RPG III などはこの動作であった。
従って従来と同じ動作を再現したいのであれば活動化グループは*NEW
と
指定するのが正しい。
CRTBNDRPG コマンドでは
省略時の活動化グループ . . . . *YES
ではなく
省略時の活動化グループ . . . . > *NO 活動化グループ . . . . . . . . *NEW
として指定するのが正しい指定である。
活動化グループ明示的に名前を命名して活動化グループとすることができる。
IBM は省略時の活動化グループとして QILE という名前の活動化グループを
推薦しているが、それまでの RPG III や CLP などの OPM が混在している状況では
QILE は別の管理が必要となってしまう。
すべてが ILE プログラムとして開発されており例外なく ILE で動作しているなら別だが、
CLP も ILE として開発している例が果たしてあるだろうか?
この理由によって QILE という活動化グループで作成するのは
米国の IBM ユーザーにも受け入れられなかった。
やはり活動化グループは*NEW
として作成することが一般的である。