【PL/I学習|初心者向け】異言語連携の要!PL/Iにおける「マングリング」回避と外部手続きの呼び出し術

1. 導入:なぜ「名前修飾(マングリング)」を意識するのか

メインフレームのシステム開発において、PL/Iで書かれた既存資産と、COBOLやC、あるいはJava(JNI)などの新しい技術を連携させる機会は増えています。しかし、ここで必ずと言っていいほど直面するのが「リンクエラー」です。コンパイラは、プログラム内の手続き名をそのままリンカ(バインダ)へ渡す際、先頭に修飾子を付けたり、文字数を制限したりと「マングリング(名前修飾)」を行うことがあります。この挙動を制御できなければ、別言語から呼び出そうとしても「シンボル未解決」でシステムは動きません。本稿では、この壁を突破するための重要な指定方法を解説します。

2. 基礎知識:PL/Iの外部手続きとリンカの関係

通常、PL/Iの手続き名は内部的な規則に従って変換されます。しかし、外部モジュールから呼び出されることを前提とする場合、呼び出し側と受け手側で「名前の一致」が不可欠です。リンカは、バイナリ上の「シンボル名」だけを見てリンクを行うため、ソースコード上の記述と実際のバイナリ名が一致していないと、プログラムを結合することができません。この名前の不一致を防ぐための鍵が、コンパイラオプションの制御にあります。

3. 実装と解決策:OPTIONS(FORTRAN)の魔法

最もシンプルかつ強力な解決策は、PROC文に OPTIONS(FORTRAN) を付与することです。これにより、PL/I特有の名前修飾が抑制され、リンカに対して「外部から呼び出される名前」として、ソースコード上に記述された名前がそのままシンボルとして登録されます。これにより、他言語とのバイナリ互換性を保ちやすくなります。

4. サンプルプログラム:外部から呼び出し可能な手続きの定義

以下のコードは、外部から明示的に呼び出されることを想定した、インターフェースを明確にしたPL/Iのプロシージャ例です。

/ 外部モジュールから呼び出されることを想定したサンプル /
/ OPTIONS(FORTRAN) を指定することで、名前の加工を回避します /
CALC_TOTAL: PROC(A, B) OPTIONS(FORTRAN);

/ パラメータの定義:参照渡しを明示 /
DCL A FIXED BIN(31) BYADDR;
DCL B FIXED BIN(31) BYADDR;
DCL RESULT FIXED BIN(31);

/ 計算処理 /
RESULT = A + B;

/ 呼び出し元へ結果を返すための処理(必要に応じて実装) /
PUT SKIP LIST(‘計算結果:’, RESULT);

END CALC_TOTAL;

5. 応用・注意点:移行とデバッグの極意

現場で最も陥りやすいのは、「ソース上の名前」と「ロードモジュール内のシンボル名」の不一致です。特に、大規模な移行プロジェクトでは、プログラム名が8文字を超えて切り詰められているケースや、特定のプレフィックスが付与されているケースが多々あります。

対策として、以下の2点を推奨します。
マッピング・カタログの作成:移行解析ツールを使用して、ソース上の名前と、実際にバインドされているバイナリ上のシンボル名の一覧表を作成してください。
AMBLISTの活用:作成したロードモジュールをAMBLISTユーティリティでダンプし、意図したシンボル名で登録されているかを必ず確認する癖をつけましょう。

名前修飾を正しく制御することは、異言語混在環境における「システム安定運用の第一歩」です。まずは簡単なサブルーチンから、このオプションで挙動の変化を試してみてください。

コメント

タイトルとURLをコピーしました