RPG

397. モジュール(*MODULE)とサービス・プログラム(*SRVPGM)

ILEではモジュール(*MODULE)とサービス・プログラム(*SRVPGM)を
混同してはいけない。

項目 モジュール(*MODULE) サービス・プログラム(*SRVPGM)
作成コマンド CRTRPGMOD CRTSRVPGM
プログラムとの関連 プログラムに含まれる プログラムとは別に存在
存在期間 CRTPGM までのあいだ 永続的に存在が必要
>再コンパイルの影響 PGMも再コンパイルが必要 PGM再コンパイルは不要

[解説]

モジュール(*MODULE)はCRTRPGMODなどによって一時的に存在するオブジェクトであり
CRTPGMでプログラム(*PGM)を作成するともはや不要となる存在なので
一般にはモジュール(*MODULE)はライブラリーQTEMPに作成されるのが普通である。

※VisualC++でもコンパイルの途中で関数別の複数の .obj というファイルが生成されるのだが
これもコンパイルの途中で必要なだけで .exe が生成されれば不要となる。

これに対してサービス・プログラム(*SRVPGM)とはプログラム(*PGM)とは
全く別に独立して存在するオブジェクトでありプログラムから呼び出されて
プロシージャーを実行する。
Windowsでいう .DLL と同じ存在である。

モジュールに記述された内容はCRTPGMコマンドで作成されるプログラムの中に
含まれて同梱されている。
従ってモジュールの内容を変更したのであればプログラムも再作成しなければならない。

これに対してサービス・プログラムに含まれている内容はプログラムとは
完全に別物でありブログラム自身には含まれていない。
従ってサービス・プログラムに変更があって再作成したとしても
プログラムまで再コンパイルする必要は全くない。
ILEとはそのように設計されているのだ。

 しかし多くの誤解がある。
ILEとは複数のオブジェクトを複合してひとつのオブジェクトに生成することを
勘違いして複数のモジュールからひとつのプログラムを生成してしまう設計を
行う人がいることである。

[間違ったILEの構成] 複数のモジュールを構成する場合

      モジュール1(*MODULE)---------+
      モジュール2(*MODULE)---------+---------->プログラムA
        :                          |
        :                          :
        :                          |
      モジュールN(*MODULE)---------+

・複数のモジュールからひとつのプログラムを構成すると
どのモジュールが変わっても必ずプログラムの再コンパイルが必要になる。
要するに常に再コンパイルは2回必要になる。
ILEになって便利になるどころか仕事の手間ばかり増えてしまうのだ。
ILEにすると2回ずつコンパイルが必要なのはおかしいと
思わないといけない

     さらにこのモジュールが他のプログラムにも使用されていたとすると
それらのプログラムもすべて再コンパイルする必要が出てくる。
それを調べるのも大変だし管理の手間も増えてしまう。
ILEはこんな不便を生むことはない。

[正しいILEの構成] 複数のサービス・プログラムで構成する場合

      モジュール(*MODULE)----------+---------->プログラムA
      サービス・プログラム1 -------+
      サービス・プログラム2 -------+
        :                          :
      サービス・プログラムN -------+

   

・ひとつだけのモジュールが変わる場合はプログラムの再コンパイルも
必要となるがどのサービス・プログラムに変更があっても
プログラムを再コンパイルする必要は全くない。
サービス・プログラムを再コンパイルしたも上位のプログラムは
ほとんど再コンパイルする必要はない。
ILEは便利になるように構成されているのだ。

  

[結論] 複数個のモジュールのバインドはまちがい
ILEの誤解であり設計が間違っている。

ILEだけでなくIBMi は不便になるようには設計されていない。
不便と感じたらそれは自分の設計を疑うようにして欲しい。