【入門編】ENTRY属性による外部PROCEDUREのインターフェース定義 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「ENTRY」って何者?外部プロシージャ呼び出しを怖がらずに使いこなそう!

こんにちは。メインフレームの世界へようこそ。
普段、JavaやCOBOLに慣れ親しんでいる方にとって、PL/Iのコードを目にしたとき、「なんだこの独特な宣言は…?」と少し戸惑うことはありませんか?

特に、大規模な基幹システムでは、一つの巨大なプログラムではなく、複数の小さなパーツ(外部PROCEDURE)を組み合わせて動かすのが基本です。今日は、そんなプログラム同士を安全につなぐための鍵、「ENTRY属性」について、現場の知見を交えながら優しく解説していきます。

1. 「ENTRY」は、いわば「名刺交換」のルールブック

Javaでいえばメソッドの定義、COBOLでいえば`CALL`文で呼び出すサブプログラムのインターフェース。PL/Iでは、外部にあるプログラムを呼び出す際、「これから呼び出す相手はこういう名前で、こういう引数を受け取るよ」ということをコンパイラに教えてあげる必要があります。

それが `ENTRY` 宣言です。

もしこの宣言をサボるとどうなるか? コンパイラは相手の姿が見えないため、「とりあえず動かしてみるか」と適当な型で引数を渡そうとします。結果、実行時にメモリの不整合が起き、いわゆる「システム異常終了(ABEND)」という、夜中に呼び出される悪夢が待っているわけです。

2. 実践!ENTRY属性を使った安全な呼び出し方

では、実際にコードを見てみましょう。`MAIN_PROG` から、外部にある `CALC_TAX` という計算用プログラムを呼び出す例です。

/i
/ 呼び出し側のメインプログラム /
MAIN_PROG: PROCEDURE OPTIONS(MAIN);

/

  • ここがENTRY宣言!
  • 相手のプログラム名と、渡すデータの型を厳密に書きます。
  • FIXED BIN(31)は、Javaでいうint型のようなものです。

/
DCL CALC_TAX ENTRY(FIXED BIN(31), FIXED BIN(31))
OPTIONS(LINKAGE(SYSTEM));

DCL PRICE FIXED BIN(31) INIT(1000);
DCL TAX_RESULT FIXED BIN(31);

/ 呼び出し実行 /
CALL CALC_TAX(PRICE, TAX_RESULT);

PUT SKIP LIST(‘計算結果:’, TAX_RESULT);

END MAIN_PROG;

ここがポイント!

  • ENTRY(FIXED BIN(31), FIXED BIN(31)): 「2つの整数を受け取る準備をしておいてね」と指示しています。これを書くことで、コンパイラが「引数の型が違いますよ!」と事前に怒ってくれるようになります。
  • OPTIONS(LINKAGE(SYSTEM)): これがメインフレーム特有の「おまじない」です。OS(z/OS)が標準的に使う呼び出し規約を使うよう指定します。これを忘れると、呼び出し先で引数が正しく受け取れず、わけのわからない数値が返ってくることになります。

3. なぜ「LINKAGE」を指定するのか?

COBOL経験者ならピンとくるかもしれませんが、メインフレームの世界では、「どの規約でデータを渡すか」が非常に重要です。

PL/Iには柔軟性がある分、呼び出し規約も複数存在します。`OPTIONS(LINKAGE(SYSTEM))` を指定することで、「汎用レジスタを使って、OSの作法通りに引き渡してくれ」と明確に指示できます。これを指定しておけば、将来的にCOBOLで書かれたプログラムとPL/Iが連携するような「混在環境」になっても、トラブルを最小限に抑えることができるんです。

4. 初学者が陥りやすい罠:データ型の「暗黙の変換」

PL/Iの優しさゆえの落とし穴が「自動変換」です。
例えば、`ENTRY`で `FIXED BIN(31)` と宣言しているのに、適当な変数(例えば `CHAR` 型)を渡すと、PL/Iコンパイラは気を利かせて変換を試みようとします。

しかし、この変換がバグの温床になります。
「コンパイラに任せるな、宣言で縛れ」。これが、長年メインフレームを支えてきたアーキテクトたちの鉄則です。

  • アドバイス: 呼び出し側と呼び出される側で、変数の属性(長さ、型、精度)は「これ以上ないくらい厳密に」一致させてください。`DCL`文をコピー&ペーストして、共有の「インクルードメンバー(%INCLUDE)」にしておくのが、現場では最も安全な運用です。

最後に:怖がる必要はありません

PL/Iの宣言は一見すると呪文のようですが、実は「プログラム同士の約束事」を極めて厳格に書いているだけです。

Javaのように実行時に型を解決するのではなく、コンパイル時にすべてを確定させることで、あの巨大で複雑な基幹システムは、何十年もの間、止まることなく動き続けてきました。

まずは、小さな外部プロシージャを作って、ENTRY属性でつなぐところから始めてみてください。一度その「カチッとハマる」感覚を覚えたら、PL/Iの堅牢さの虜になるはずですよ。

それでは、次回の記事では「構造体(STRUCTURE)を使ったデータの受け渡し」について、もう少し深掘りしていきましょう。ご質問があれば、いつでもお気軽にどうぞ!

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