プロシージャーを呼び出す演算命令には CALLB と CALLP という
2種類の命令があり、最初はちがいがよくわからないかも
知れないのでここでそのちがいについて解説する。
比較項目 | CALLB | CALLP |
---|---|---|
プロトタイプ | 不要 | 必要 |
バインド | 実行時解決 | コンパイル時パインド |
フリー・フォーマット | 使えない | 使用可能 |
ご覧のようにCALLPでは事前にプロシージャーの型(プロトタイプ)を宣言しなければ
ならない。
これはコンパイラーのために宣言するものであって
コンパイラーはプロトタイプに従ってモジュール(*MODULE)までを作成して
その後のバインド作業で実際のプロシージャーをバインドしてプログラム(*PGM)や
サービス・プログラム(*SRVPGM)に仕上げる。
これは何もIBM iのILEに限ったことではなくて一般に
Visualxxと呼ばれる開発言語やJavaもすべてこの方法によって
オブジェクトを生成している。
CALLBのプロシージャーはコンパイル時には見つからなくてもよい
これに対してCALLB は特殊で実行時解決と言って実行時に初めて
バインドしてオブジェクト(プロシージャー)の実体を探して実行されることになる。
つまりコンパイル時にCALLBが呼び出すプロシージャーが存在していなくても
コンパイル・エラーにはならない。
CALLPプロシージャーはコンパイル時に見つからないとエラーとなる
これに対してCALLPの記述ではコンパイル時のそのプロシージャーが見つからないと
XXXXを解決することができないとのエラーとなる。
逆に CALLB で作成したプログラムは実行時にプロシージャーを探せなくて
実行時エラーになる可能性がある。
CALLPで作成されたプログラムであればオブジェクトには既にオブジェクトが
作成された時点でプロシージャーの実体も含まれているので
実行時エラーになることはない。
それではCALLBの記述に間違いがないように記述しておけばCALLBのほうが
小さなメモリ・サイズのプログラムになって効率的ではないかと
言われる諸氏がいるかもしれないがCALLPであっても
使用時に初めてメモリに呼び出すという サービス・プログラムの活動化に
*DIFFER というオプションを指定することができるので遜色はない。
というわけで使うなら断然CALLP を使用するべきで、
CALLB は事実上の廃盤と言ったところである。
CALLP だけがフリー・フォーマットで使えるという点を見ても
IBM が推薦しているのはCALLPであることがわかる。
以前に紹介したCALLPの例で
C CALLP SNDPGMMSG(MSG)
というのをフリー・フォーマットで書くと
/FREE SNDPGMMSG(MSG); /END-FREE
となる。つまりCALLPという命令は省略されるのである。
ここで思い出して欲しいのが
0005.00 D CMD PR 10I 0 EXTPROC('system') 0006.00 D PATH * VALUE OPTIONS(*STRING) : /FREE CMD = .... SYSTEM(CMD); /END-FREE
という書き方である。
system という関数はC言語のライブラリーの関数であったはずだ。
そのとおり。C言語の関数は実はすべてプロシージャーであり
C言語のライブラリーはすべてサービス・プログラム(*SRVPGM)として
提供されたものであるのだから
BNDDIR(‘QC2LE’) でバインド・ディレクトリーを宣言して
C言語のサービス・プログラム(*SRVPGM)を使えるようにしているのだ。
これがILE(=Integraled Language Enviroment:統合化開発環境)の本質なのである。
C言語でできたサービス・プログラム(*STVPGM)もどのような開発言語で
できたものであってもすべて同じように扱ってオブジェクトどうしを
組み合わせることができるのだ。
RPGからC言語の保証されたライブラリーを自由に利用することができる。
その逆でもいいし開発言語は何であってもよい。
既に品質が保証されているオブジェクトを組み合わせて新たなプログラムを
生み出せば短時間で高品質な適用業務を開発することができる。
これが世に言うオブジェクト指向である。
このことが理解できればILEの本質が理解できたことになる。
RPGが古い? いいえ RPGは1995年には64 bit プロセッサーで ILEがもう始まりました。
そのとき Windows はやっと32ビットで Visual XX は2005年から。
RPG の進化は早すぎた。
… RPG IIIの頃のように単体プログラムの品質だけに依存していた時代とは
RPGも大きく進化していることをご理解して頂ければ幸いである。