PL/Iの「ON ENDFILE」で迷子にならない!レガシー世界のファイル読み込みを優しく解説
メインフレームの世界へようこそ!Javaの`while`ループやCOBOLの`READ … AT END`に慣れている方にとって、PL/Iのファイル読み込み制御は最初、少しだけ「魔法」のように見えるかもしれません。
特に`ON ENDFILE`という仕組みは、他の言語にはあまりない「イベント駆動」に近い考え方を持っています。今日は、このPL/I流の「ファイルの終わり方」について、現場の知見を交えながら紐解いていきましょう。
—
1. まずはPL/Iのプログラム構造を覗いてみよう
PL/Iのプログラムは、非常に整理整頓された家のようなものです。`PACKAGE`で全体を囲み、`PROCEDURE`で部屋を区切り、`OPTIONS(MAIN)`で「ここからプログラムが始まりますよ!」と宣言します。
/i
MY_PROG: PACKAGE;
/ メイン処理の入口 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ ここに処理を書きます /
END MAIN_PROC;
END MY_PROG;
COBOLに慣れていると「パッケージ?」と思うかもしれませんが、これは大規模なシステムで名前の衝突を防ぐための「名前空間」だと考えてください。Javaの`package`に近い役割ですが、PL/Iではもっと堅牢に、メモリ上の配置まで管理されています。
—
2. 「ON ENDFILE」という名の守護神
さて、本題です。多くの言語では「読み込みに失敗したらループを抜ける」という判定をループの先頭で書きますよね。しかし、PL/Iは「ファイルの終わりが来たら、この処理を自動で実行せよ」とあらかじめ予約しておくスタイルを取ります。
これが`ON ENDFILE`ユニットです。
実際にコードを見てみましょう
/i
DCL SYSIN FILE RECORD INPUT; / ファイルの定義 /
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグ /
/ ファイルの終わり(ENDFILE)が来たら、フラグを立てるように予約 /
ON ENDFILE(SYSIN) EOF_FLAG = ‘1’B;
OPEN FILE(SYSIN);
/ EOF_FLAGが立つまで回る /
DO WHILE(EOF_FLAG = ‘0’B);
READ FILE(SYSIN) INTO(MY_RECORD);
/ 正常に読み込めた場合のみ処理 /
IF EOF_FLAG = ‘0’B THEN DO;
/ ここでビジネスロジックを実行 /
END;
END;
CLOSE FILE(SYSIN);
ここがポイント!
- 予約(ONユニット): `ON ENDFILE(SYSIN)` は、「万が一SYSINでファイル終端に達したら、この後の命令を実行せよ」という「待ち伏せ」のようなものです。
- スマートな分離: 読み込みループの中で「もしEOFなら…」と細かく判定しなくていいので、メインロジックがスッキリします。
—
3. テストの救世主:SIGNAL ENDFILE
「ファイルが空の時の動作をテストしたいけれど、わざわざ空のファイルを用意するのは面倒だな…」なんて思うことはありませんか?そんな時に使えるのが `SIGNAL` 文です。
これは「実際にファイル終端に達していなくても、達したことにする」という、いわば「強制シミュレーション」コマンドです。
/i
/ 異常系テストのために、意図的にENDFILEを発生させる /
IF DEBUG_MODE THEN DO;
SIGNAL ENDFILE(SYSIN);
END;
これを使うことで、エラーハンドリングのロジックが正しく動くか、本番環境のデータを使わずにユニットテストで確認できるんです。現場の改修で「本当にこの終了処理は動くのか?」と不安になったら、まずはこの`SIGNAL`を仕込んでトレースしてみるのが、ベテランの定石です。
—
4. 初学者がつまずきやすい「データ宣言」のワナ
PL/Iが「奇妙だ」と言われる理由の一つに、データ型の柔軟性があります。
例えば `DCL VAL FIXED BIN(31);` と書けば32ビット整数ですが、`DCL VAL FIXED DEC(5,2);` と書けば「小数点以下2桁を持つ5桁の10進数」になります。
これらはすべて、メインフレームが内部で効率よく計算できるように設計されたストレージ形式です。最初は難しく感じるかもしれませんが、「PL/Iはコンピュータが一番計算しやすい形でデータを保持しようとしているんだな」とイメージしてみてください。
—
まとめ:PL/Iは怖くない!
PL/Iの`ON ENDFILE`は、最初は独特の感覚が必要かもしれません。しかし、一度慣れてしまえば、これほど「エラー処理とメイン処理を分離して記述できる」美しい言語は他にありません。
- ONユニットは、「もしもの時のための待ち伏せ」
- SIGNALは、「テストのためのシミュレーター」
この2つを覚えるだけで、あなたはもうPL/Iのファイル制御をマスターしたも同然です。何か困ったことがあれば、いつでもまた聞きに来てくださいね。レガシーシステムの迷宮も、一つずつ紐解けば必ず出口が見えてきますよ!
