先の RPGIFSWRT のソースでは
FD = open('/tmp/hello.txt': O_CREAT + O_TRUNC + O_WRONLY + O_CCSID : O_RDWR : EBC_CCSID);
のようにしてopen
という関数が使われていた。
このopen
関数をもう少し調べてみよう。
open
関数は
/COPY QSYSINC/QRPGLESRC,IFS
と書かれている IFSというソースを見ると
さらに
/COPY QSYSINC/QRPGLESRC,SYSTYPES /COPY QSYSINC/QRPGLESRC,SYSSTAT /COPY QSYSINC/QRPGLESRC,FCNTL /COPY QSYSINC/QRPGLESRC,UNISTD /COPY QSYSINC/QRPGLESRC,ERRNO
と記述されており
/IF DEFINED(LARGE_FILES) D open_function C 'open64' /ELSE D open_function C 'open' /ENDIF D open PR 10I 0 EXTPROC(*CWIDEN : open_function) D path * VALUE OPTIONS(*STRING) D oflag 10I 0 VALUE D mode VALUE LIKE(mode_t) D OPTIONS(*NOPASS) D conversion_id... D 10U 0 VALUE D OPTIONS(*NOPASS) D text_file_creation_conversion_id... D 10U 0 VALUE D OPTIONS(*NOPASS)
のようにしてopen
関数のプロトタイプが定義されている。
open
という関数がプロシージャーであるならば
どこかのサービス・プログラム(*SRVPGM
)内に存在していて
コンパイルではそれをバインドしなければならないが
BNDDIR('QC2LE')
という記述によってバインド・ディレクトリーQC2CLE
の中から
プロシージャーopen
が探し出される。
バインド・ディレクトリー とはライブラリー・リストのようなもので
サービス・プログラムの検索のために使用されるディレクトリーである。
そこで
DSPSRVPGM RPGIFSWRT
を実行してバインドしているサービス・プログラムを調べてみると
プログラム情報の表示 画面 7 の 4 プログラム . . . . . . : RPGIFSWRT ライブラリー . . . . . : TEST.COM 所有者 . . . . . . . . : QTR プログラム属性 . . . . : RPGLE 詳細 . . . . . . . . . : *SRVPGM オプションを入力して,実行キーを押してください。 5= 表示 OPT サービス・プログラム ライブラリー 活動化 記号 QRNXIE QSYS *IMMED D8D9D5E7C9C540404040404040404040 QLEAWI QSYS *IMMED 44F70FABA08585397BDF0CF195F82EC1 QP0LLIB1 QSYS *IMMED D8D7F0D3D3C9C2F14040404040404040
と表示されるが、この3つのサービス・プログラムのうちのひとつ:QP0LLIB1
を
5=表示 (DSPSRVPGM QP0LLIB1 )
でさらに調べてみると
サービス・プログラム情報の表示 画面 10 の 5 サービス・プログラム . . . . . . . . . . : QP0LLIB1 ライブラリー . . . . . . . . . . . . . : QSYS 所有者 . . . . . . . . . . . . . . . . . : QSYS サービス・プログラム属性 . . . . . . . . : CPPLE 詳細 . . . . . . . . . . . . . . . . . . : *PROCEXP プロシージャーのエクスポート : プロシージャー名 ARGOPT lseek *NO lstat *NO mkdir *NO open *NO opendir *NO pathconf *NO read *NO readdir *NO readlink *NO readv *NO
のようにプロシージャーとしてのopen
が見つかる。
このようにしてopen
はプロシージャーであることを突き止めたのだが
もう一方でopen
は C言語( C/400 ) の関数でもある。
つまり IBM i では C言語の関数とはプロシージャーであるのだ。
C言語の関数がプロシージャーであれば RPGからも C言語の関数を利用できるのは
当然である。
このようにして異なる開発言語のあいだを相互に利用できるのが
ILE (=Integlated Language Enviroment)と呼ばれる統合化開発環境である。
ILE という概念を実感して頂けたことと思う。