まず Microsoft の VC++ のコンパイルを見てみよう。
Microsoft VC++ では
.obj
はコンパイルの
途中でできる一時的なオブジェクトであり、
プログラムを作成したら
廃棄してしまう。
オブジェクト ( .obj
) はもうプログラムの
内部に含まれてしまっているからである。
ILE の *MODULE も同様で
*MODULE はコンパイルの
途中でできる一時的なオブジェクト。
モジュールはプログラムを作成したら
廃棄してしまうが常識。
モジュールを提供していると
モジュールが変わる都度、プログラムの
再コンパイルが必要となってしまう。
サービス・プログラム ( *SRVPGM ) を配布すれば
サービス・プログラム ( *SRVPGM ) の内容が変わっても
プログラムを再コンパイルする必要はない。
要するに CRTRPGMOD でモジュール ( *MODULE ) を一時的に作成したら
次は CRTPGM または CRTSRVPGM で *PGM にするか *SRVPGM を作成する。
その作成が終われば モジュール ( *MODULE ) はもはや不要である。
従ってモジュール ( *MODULE ) は QTEMP に作成することが一般的である。
モジュール ( *MODULE ) をどこかのライブラリーに残しておいて
後でこれを CRTPGM や CRTSRVPGM でバインドすることをゆめゆめ
考えてはいけない。
なぜならモジュール ( *MODULE ) が変われば、そのモジュール ( *MODULE ) を
利用している上位のプログラム ( *PGM ) やサービス・プログラム ( *SRVPGM ) も
すべて再コンパイルが必要となる。
上図で示しているようにモジュール ( *MODULE ) はプログラム ( *PGM ) や
サービス・プログラム ( *SRVPGM ) のオブジェクト内に含まれてしまって
いるからである。
この ILE-RPG の処理構造を正しく理解していないと CRTRPGMOD の都度に
上位の *PGM や *SRVPGM の再コンパイルが必要となり
かなり不便な構造となってしまう。
大抵のユーザーはそこで ILE の構造を調べなおすものだが
中にはこのモジュール配布をソフトウェア製品にしてしまっている
ベンダーもある。
その製品を使うと PTF を適用するとユーザーのほんどのプログラムも
再コンパイルが必要となってしまう。
そこでそのベンダーは決して PTF を配布することができない。
IBM i の i5/OS の PTF を適用するとユーザーのプログラムの再コンパイルが
必要になることはない。
これは IBM が PTF として配布しているのは *PGM および *SRVPGM だけである
からである。
i5/OS の中にモジュールが含まれていることは絶対ない。
モジュールは使ったら捨てる。
これが原則である。