【入門編】ENTRYステートメントによる複数エントリーポイントの定義 – PL/Iの基本構文とデータ制御実践ガイド

昔のエンジニアの知恵袋:PL/Iの「ENTRY」で、一つのプログラムに複数の顔を持たせる方法

こんにちは!メインフレームの世界へようこそ。

JavaやCOBOLを経験されてきた方にとって、PL/I(ピーエル・アイ)という言語は、一見すると「古めかしくて少し難解」に見えるかもしれません。でも、ご安心ください。PL/Iは、C言語の柔軟性とCOBOLの堅牢さを併せ持った、非常に強力で「職人気質」な言語なんです。

今日は、そんなPL/Iの中でも、特に「えっ、一つのプログラムにそんな入り口を作れるの?」と驚かれることが多い、ENTRYステートメントについて深掘りしていきましょう。

1. プログラムの「入り口」は一つだけじゃない?

通常、プログラムの入り口といえば、`OPTIONS(MAIN)`がついたメインプロシージャですよね。
しかし、大規模なバッチ処理や古い基幹システムでは、一つのモジュールの中に「普段はここから呼ぶけど、たまにこの処理だけ実行したい」というサブ機能が同居していることがよくあります。

ここで登場するのが `ENTRY` です。これは、一つのPROCEDUREの中に、別名で呼び出せる「副次的な入り口」を設ける仕組みです。

イメージで例えると……

メインの入り口が「建物の正面玄関」だとすれば、`ENTRY`は「勝手口」や「関係者専用通用口」のようなものです。同じ建物(PROCEDURE)に入りますが、どのドアから入るかによって、処理の開始地点を切り替えられるんですね。

2. ENTRYを使ってみよう:実例コード

さっそく、コードで動きを確認してみましょう。

/i
/ メインのプロシージャ定義 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ 1. 通常のメイン処理 /
PUT SKIP LIST(‘メイン処理が実行されました。’);
CALL SUB_FUNCTION_A(100);
RETURN;

/ 2. ENTRYを使った別の入り口 /
/ 引数として数値を受け取る設定です /
ENTRY_B: ENTRY(P_VAL);
DCL P_VAL FIXED BIN(31);

PUT SKIP LIST(‘ENTRY_Bから呼び出されました。値は:’, P_VAL);
RETURN;

END MAIN_PROC;

このように書くと、外部のプログラムから `CALL ENTRY_B(500)` と呼び出すだけで、プログラムの途中の `ENTRY_B` ステートメントから処理を開始させることができます。

3. 初学者がつまずきやすい「引数の罠」

ここで一つ、実務で必ずと言っていいほどハマるポイントがあります。それが「引数リストの整合性」です。

PL/Iは非常に厳格です。`ENTRY`で受け取る引数の型(FIXED BIN, CHAR, PICTUREなど)や属性が、呼び出し側と完全に一致していないと、メインフレームの環境では「データ例外(S0C7など)」や、メモリを破壊してとんでもない動きをすることがあります。

注意すべきポイント

  • データ属性の不一致: 呼び出し側が `FIXED DECIMAL` で投げているのに、受け取り側が `FIXED BINARY` だと、計算結果が化けます。
  • CHARACTERの長さ: `CHAR(10)` を期待しているのに `CHAR(20)` を渡すと、メモリ上の隣の領域を汚染してしまうリスクがあります。

現場の知恵:
「動くからいいや」ではなく、必ず `PROCEDURE` の外側で `DECLARE` ステートメントを用いて、入り口の定義(`ENTRY`属性)を明示的に宣言しておきましょう。これを「外部宣言」と呼びます。

/i
/ 呼び出し側の宣言例 /
DCL ENTRY_B ENTRY(FIXED BIN(31)) EXTERNAL;

こうやってコンパイラに「この関数はこういう型を受け取るよ」と教えてあげるだけで、コンパイル時にチェックが働き、実行時のミステリアスなバグを未然に防ぐことができます。

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

PL/Iの `ENTRY` は、使いこなせば非常に強力な武器になります。特に、複数の処理で共通のストレージ(変数領域)を共有したい場合、この「一つのPROCEDUREに複数の顔を持たせる」構成は、メモリ効率の面でも非常に理にかなっています。

「古い言語だから不便」と決めつけず、「どうして昔のエンジニアはこの書き方を選んだのか?」という意図を紐解いていくと、きっとPL/Iの奥深さと、その合理性に感銘を受けるはずです。

もし現場で `ENTRY` のコードに出会ったら、まずは「これはどのドアから入っているのか?」を紙に書き出してみてください。それだけで、複雑怪奇に見えるレガシーコードも、少しだけ優しく微笑んでくれるはずですよ。

それでは、また次回のレガシー探訪でお会いしましょう!

コメント

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