RPG

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

20年以上前にIBMはILE-RPGを発表した。
IBMはILE(=Integlated Language Enviroment:統合開発環境)という
開発環境を提唱してどうのうな開発言語のオブジェクトも
相互に利用できる環境を作り出した。
ILEではプログラム(*PGM)はひとつ以上の
複数のモジュール(*MODULE)から生成されることになり
各モジュールはどのような開発言語から生成されたものであってもよい。
さらにサービス・プログラム(*SRVPGM)というオブジェクトも
用意してプログラムはひとつ以上の複数のサービス・プログラムを
実行時に静的にバインドして実行できるようにした。
_

これはMicrosoftのDLLとほぼ同じ考えのアーキテクチャである。

Microsoft IBM
コンパイル
途中
オブジェクト(.obj) モジュール(*MODULE)
ダイミナック・リンク
ライブラリー(.dll)
サービス・プログラム
(*SRVPGM)
実行プログラム プログラム(.exe) プログラム(*PGM)

…ここでIBM iのモジュール(*MODULE)とサービス・プログラム(*SRVPGM)の
ちがいを明確にしておこう。

Microsoftのコンパイルの途中でも複数のオブジェクト(.obj)が生成されて
最終的にオブジェクト(.obj)はプログラム(.exe)の中に組み込まれる。
コンパイルが終わればオブジェクト(.obj)はプログラム(.exe)の中に
既に組み込まれているのでもはや必要はなく不要である。

■ プログラムのコンパイル

これと同じようにIBM iの場合も

     CRTRPGMOD : モジュールの作成
       ↓
     <*MODULE> ........................ QTEMPに作成する
       ↓
     CRTPGM    : プログラムの作成
       ↓
     <*PGM>

  モジュール(*MODULE)はコンパイルの途中経過に必要なだけであって
プログラム(*PGM)が生成された後ではマック必要ない。
そのためモジュール(*MODULE)はライブラリー: QTEMPに作成するのが
普通である。
QTEMPに作成しておけば5250セッションをSIGNOFFすれば自動的に
モジュールも消滅するからである。
CRTRPGMOD と CRTPGM を連続して実行するのか CRTBNDRPG である。
しかし CRTBNDRPG は CRTRPGPGM をILEに移行しただけのコンパイラーであって
CRTRPGPGM のコマンドが変わっただけと考えてはいけない。
CRTBNDRPG は ILEなのである。

■ サービス・プログラムのコンパイル

  次にサービス・プログラム(*SRVPGM)のコンパイルを見てみよう。
サービス・プログラム(*SRVPGM)とはWindowsのDLLと同じである。

    CRTRPGMOD : モジュールの作成
       ↓
     <*MODULE> ........................ QTEMPに作成する
       ↓
     CRTSRVPGM    : サービス・プログラムの作成
       ↓
     <*SRVPGM>

プログラム(*PGM)のときのコンパイルと同じで
モジュール(*MODULE)はサービス・プログラムの中に
組み込まれてする。

■サービス・プログラムをバインドするプログラムの作成

さらにサービス・プログラムをバインドしてプログラムを
作成する方法を見てみよう。

   <*SRVPGM1> <*SRVPGM2> ..... <*SRVPGMn> : サービス・プログラム
       ↓        ↓               ↓
       ----------------------------
                 ↓
           プログラムの作成(CRTPGM)
                 ↓
              <*PGM>

ここで複数のサービス・プログラムをバインドしてひとつのプログラムを
生成することができるのだがサービス・プログラムのオブジェクトは
決してプログラムの内部に組み込まれることはない。
あくまでプログラムが実行するときは初めてサービス・プログラムも
呼び出されてCPIメモリ内にロードされるのである。

実はIBM にのC言語の関数はすべてこのサービスプログラムによって
  公開されている関数である。
サービス・プログラムのオブジェクトは上位で使用するプログラムとは
分離されているのでサービス・プログラムに変更があっても
それを参照している上位のプログラムまでは再コンパイルする必要がない。

■モジュールを誤解しているソフト会社

これに対してモジュール(*MODULE)を関数として配布してしまうと
それを使用しているプログラムはすべて再コンパイルはなければならない。
モジュールの場合は上位のプログラムの中にオブジェクトが組み込まれて
しまっているのでもモジュールに変更があるともう一度再コンパイルによって
組み込まなければならないからである。
_

このILEの構造を正しく理解しないでモジュールの提供を製品として
配布してしまっているソフトウェア製品もある。
となるとこのような製品はPTFを配布することはできない。
もしPTFを配布すると毎回、最コンパイルしてくださいとユーザーに
依頼いなければならない。
i5/OSのリリースがアップする都度再コンパイルをIBMが要求しているのと
同じことになる。
ソフトウェア会社でありながらILEの構造を理解していないと
製品の寿命も短期間で終わってしまうことになる。
ソフト会社でモジュールを誤解している会社が2社あった。
1社はこのソフト製品を製作販売している会社でもう一社はIBM iの業界から
撤退してしまった。

IBMユーザーはILEの構造を正しく理解してオブジェクト指向の
システムを開発したいものである。