【入門編】ON ENDFILEユニットによるファイル終了制御 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの世界へようこそ!「予約語がない?」自由すぎる言語でファイル処理をマスターしよう

こんにちは!メインフレームの世界へようこそ。JavaやCOBOLの経験がある皆さんにとって、これから触れる「PL/I(Programming Language One)」は、時に不思議で、時にあまりの自由さに戸惑う存在かもしれません。

今日は、PL/Iの門を叩いたばかりの皆さんが最初に驚くであろう「識別子のルール」と、基幹システムのバッチ処理で避けては通れない「ENDFILE(ファイル終了)のトラップ」について、肩の力を抜いて紐解いていきましょう。

1. そもそも「予約語」がない? PL/Iの自由な世界

JavaやCOBOLでは、`if` や `while` といった単語をプログラムの変数名にすることはできませんよね? それらは「予約語」として言語が独占しているからです。

しかし、PL/Iは違います。PL/Iには、言語仕様としての「予約語」が存在しません。

これを聞くと「えっ、じゃあ `IF` という名前の変数を作ったらどうなるの?」と不安になりますよね。実は、PL/Iは文脈で判断します。

  • `IF = 10;` と書けば、コンパイラは「ああ、IFという名前の変数に10を代入するんだな」と理解します。
  • `IF A > B THEN …` と書けば、「おっ、これは条件分岐のIFだ」と判断します。

一見、最高に自由で便利そうに見えますが、やりすぎると「自分でも何を書いているか分からなくなる」という諸刃の剣です。実務では、可読性を保つために「予約語っぽい名前は変数名に使わない」のが暗黙のルールです。自由だからこそ、書き手の品性が問われる言語……それがPL/Iの奥深さなんです。

2. ファイルの終わりをどう見極める? ON ENDFILEの魔法

さて、ここからが本題です。メインフレームのバッチ処理では、膨大なデータを順次読み込む「ストリーム入出力」が欠かせません。そこで必ず直面するのが「ファイルの終わり(EOF)をどう検知するか」という問題です。

COBOLなら `AT END` を使いますが、PL/Iでは `ON ENDFILE` という「監視ユニット」を仕掛けます。これが非常に独特で面白いんです。

「ONユニット」という考え方

PL/Iにおける `ON` 文は、いわば「イベントリスナー」です。「もしファイルが終わったら、この処理を勝手に実行してね」と、あらかじめコンパイラに伝えておく仕組みです。

/i
/ ファイル終了時の制御例 /
TEST_PROG: PROC OPTIONS(MAIN);

DCL SYSIN FILE RECORD INPUT; / 入力ファイルを宣言 /
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグを初期化 /

/ ファイルが終わった時の「待ち伏せ」を仕掛ける /
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP LIST(‘ファイル読み込み完了!’);
EOF_FLAG = ‘1’B; / 終了フラグを立てる /
END;

OPEN FILE(SYSIN);

/ EOF_FLAGが立つまでループ /
DO WHILE(^EOF_FLAG);
GET FILE(SYSIN) EDIT(MY_DATA) (A(80));
IF ^EOF_FLAG THEN
PUT SKIP LIST(‘読み込んだデータ: ‘ || MY_DATA);
END;

CLOSE FILE(SYSIN);

END TEST_PROG;

このコードのポイント

1. 先回りした監視: `ON ENDFILE` は、実際に読み込みがエラーになる(ファイル末尾に達する)前に定義しておきます。
2. `BEGIN`ブロック: 終了時に複数の処理を行いたい場合、このように `BEGIN;` ~ `END;` で囲むことで、複雑な終了処理を記述できます。
3. ストリームの挙動: `GET` 文を実行した瞬間にファイル末尾に到達すると、プログラムは即座に `ON` ユニットへ飛び込みます。その後、`ON` ユニット内の処理が終わると、元の場所に戻るのではなく、次の行へ……といった制御の流れは、慣れるまで少し不思議な感覚かもしれません。

3. なぜPL/Iを使うのか?

現代の視点から見ると、`ON` ユニットのような記述は「どこで何が起きるか追いかけにくい」と感じるかもしれません。しかし、基幹システムの現場では、この「異常系や終了条件をメインのロジックから切り離して記述できる」という特性が、複雑なバッチ処理の可読性を助けてきたという歴史があります。

PL/Iは、「書くときは自由だけど、読むときは行儀よく」というのが鉄則の言語です。

最初は奇妙に見えるルールも、一つひとつ紐解いていけば、メインフレームの強力なパワーを自在に操るための「鍵」であることが分かるはずです。

もし現場で「この `ON` ユニット、何をしてるんだ?」と迷ったら、まずは「これはファイルが終わった時の『保険』をかけているんだな」と思い出してみてください。それだけで、コードの景色が少し違って見えるはずですよ。

それでは、次回の記事でもPL/Iの深い森を一緒に探索していきましょう!分からないことがあれば、いつでも聞いてくださいね。

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