先の 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 という概念を実感して頂けたことと思う。