RPG

78. ILEのサブ・プロシージャーとサブ・ルーチン

ILEのサブ・プローシージャーを調べていくと従来のサブ・ルーチンとはどのように違うのかとの
疑問が湧いてくる。
サブ・プロシージャーはサービス・プログラム(*SRVPGM) からの公開プロシージャーだけでなく、
RPG自分自身の内部でも定義できるからである。
RPGの近代化として従来のサブ・ルーチンをサブ・プロシージャーに書き換えるようにとの
推薦を目にすることがよくある。
一見、サブ・プローシージャーもサブ・ルーチンに良く似ているようであるが最も異なるのは
サブ・プロシージャーは完全にカプセル化されていることである。
つまりサブ・プロシージャーはANSI-C やVisualBASIC、VisualC++、Java などの関数または
クラスに匹敵している。

サブ・プロシージャー内部で定義された変数はローカル変数としてサブ・プロシージャーの中だけで
有効である。
これに対してサブ・ルーチンはメイン・ルーチンの一部であり、メイン・ルーチンの変数とメモリなども
共有している。
つまりサブ・ルーチンとはメイン・ルーチンの一部なのである。
サブ・ルーチンの中から GOTO 命令や CABxx などでメイン・ルーチンへジャンプすることが
できることでも、サブ・ルーチンとはメイン・ルーチンの一部であることがわかる。

変数の値がおかしいと思ったらサブ・ルーチンの中で同じ変数名が使用されていたために
障害となっていたような経験はないだろうか?
サブ・プロシージャーでローカル変数を定義としておけば、このような障害は発生しない。
さらにサブ・プロシージャーではRPG全体で定義されているグローバル変数も使用することができる。
ILEでは厳密に言えばメイン・ルーチンさえもメイン・プロシージャーという、ひとつの特殊な
プロシージャーである。
さらにはILE ではひとつひとつのプロシージャーに対して入り口点が用意されている。
( CRTPGM + F4 で「プログラム入り口プロシージャー・モジュール」を指定することができる。)

*SRVPGM をILEで開発する場合は必ず H仕様書に NOMAIN と記述する。
つまりメイン・プロシージャーは無いことを示すのもこのためである。
RPGの近代化のためにサブ・ルーチンをサブ・プロシージャーに書き換えるという手法は
変数の重複を無くすためである。
このことによって他のPGM にプロシージャーをそのままコピーしても間違いなく正常に
動作するようになる。
つまりソースの再利用の可能性が高くなるのである。
ただしメイン・ルーチンとの変数の共有を意図的に行っているサブ・ルーチンには
サブ・プロシージャーへの移行では考慮が必要となる。