1. 導入:なぜ今、BIND(C)なのか
メインフレームの資産を活かしつつ、オープン系のシステムや最新の言語と連携させる「ハイブリッド構成」が主流となっています。しかし、PL/Iで書かれた長年のビジネスロジックを、C言語やJava(JNI経由)から呼び出そうとすると、引数の渡し方や命名規則の不一致で躓くことが多々あります。この課題を劇的に解決するのが、PL/Iの「BIND(C)」属性です。これを用いることで、PL/Iの手続きをC言語の規約に適合させ、言語の壁を越えたスムーズな連携を実現します。
2. 基礎知識:BIND(C)とは何か
通常、PL/Iの手続きはメインフレーム特有の呼び出し規約に従いますが、BIND(C)属性を付与することで、コンパイラに対して「この手続きはC言語の規約(Calling Convention)に従って出力せよ」と指示を送ります。これにより、C言語側からは通常の関数呼び出しと同じようにPL/Iの手続きを呼び出せるようになります。これは、メインフレームの資産を「ブラックボックス化」して再利用するための鍵となる現代的な拡張機能です。
3. 実装と解決策
実装は非常にシンプルです。手続きの宣言(PROC)に「BIND(C)」を付加し、引数の型をC言語で対応する型(FIXED BIN(31)であればintなど)に合わせるだけです。これにより、データ型の不整合によるメモリ破壊や異常終了を防ぎ、安全なデータ受け渡しが可能になります。
4. サンプルプログラム
以下は、C言語から呼び出されることを想定した、BIND(C)を使用したPL/Iのサンプルコードです。
/ PL/I手続き: BIND(C)を指定することでC言語規約に準拠 /
CALC_TOTAL: PROC(INPUT_VAL, RESULT) BIND(C);
/ 引数の型を定義。C言語のint型と互換性を持たせる /
DCL INPUT_VAL FIXED BIN(31) VALUE;
DCL RESULT FIXED BIN(31) REFERENCE;
/ 簡単な計算ロジック:入力値に100を足して返す /
RESULT = INPUT_VAL + 100;
/ 手続きの終了 /
END CALC_TOTAL;
5. 応用・注意点
注意点1:データ型のサイズ
C言語の「int」は環境によりサイズが異なる場合があります。メインフレームのFIXED BIN(31)と確実に対応させるためには、C言語側でも「int32_t」などのサイズ固定型を使用することを強く推奨します。
注意点2:ポインタの扱い
BIND(C)を使用する場合、引数はデフォルトで参照渡し(Address)となります。C言語側からはポインタを渡す形になるため、C言語側のポインタ演算には細心の注意を払ってください。
活用のアドバイス:
この機能は、JNIを通じてJavaからPL/Iの計算ロジックを呼び出す際にも非常に有効です。移行の過渡期において、既存のPL/Iロジックを書き換えることなく、新しいインターフェースとして「ブリッジ」させることで、リスクを最小限に抑えたモダナイゼーションを実現してください。

コメント