こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLという素晴らしい言語を使いこなしてきた皆さんにとって、PL/Iは少し「古めかしく、頑固な職人気質の言語」に見えるかもしれませんね。でも安心してください。PL/Iは、一度その「クセ」を理解してしまえば、これほど計算機に優しく、かつ強力な言語はありません。
今日は、PL/Iにおけるファイル処理の登竜門であり、かつトラブルの温床にもなりやすい「ON ENDFILE」について、現場の知恵を交えて紐解いていきましょう。
—
そもそも「ON ENDFILE」って何者?
Javaでファイルを読むとき、`while`ループの中で「読み込みに失敗したら終了」というロジックを書きますよね。でも、PL/Iの流儀は少し違います。
PL/Iには「ONユニット」という概念があります。これは、あるイベント(ファイル終了やゼロ除算など)が発生した瞬間に、「おっと、その時はこっちの処理を割り込んで実行してくれ」とOSに予約しておく仕組みです。
ファイル読み込みのループを回している最中に「あ、もうデータがないぞ!」というシグナルが飛んできたら、メインの処理を中断して、予約しておいたコードを叩く。これが`ON ENDFILE`の正体です。
—
実際にコードで見てみましょう
まずは、基本の形です。
1
/ メイン処理の開始 /
TEST_PROG: PROCEDURE OPTIONS(MAIN);
DCL SYSIN FILE RECORD INPUT; / 入力ファイルを宣言 /
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了判定用のフラグ(’0’BはFALSE) /
/ ファイル終了時の予約受付! /
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP LIST(‘ファイル読み込み完了。後処理を開始します。’);
EOF_FLAG = ‘1’B; / フラグをTRUEにして終了を合図 /
END;
OPEN FILE(SYSIN);
/ 読み込みループ。ENDFILEが起きるまで回り続ける /
DO WHILE(EOF_FLAG = ‘0’B);
READ FILE(SYSIN) INTO(MY_RECORD);
/ ここに実際の業務ロジックが入る /
END;
CLOSE FILE(SYSIN);
PUT SKIP LIST(‘プログラム正常終了です。’);
END TEST_PROG;
ここがポイント!
- ON ENDFILEは「割り込み」である: ループの中に終了判定を書くのではなく、OSに「終わったらよろしく」と先にお願いしておくのがPL/Iスタイルです。
- BIT型: `BIT(1)`はJavaの`boolean`だと思ってください。`’0’B`や`’1’B`という書き方はPL/I独特ですが、慣れると「ビット単位で制御してる感」があって格好いいですよ。
—
ネストされたONユニット:優先順位の罠
次に、少し高度な話です。もし、プログラムの中で「ここは別の読み込み処理があるから、さっきと違う終了処理にしたい!」となった場合、ONユニットを重ねて書くことができます。
これを「ONユニットのネスト(入れ子)」と呼びます。
1
/ 外側のONユニット /
ON ENDFILE(SYSIN) … ;
BEGIN;
/ 内側のONユニット(このスコープ内ではこっちが優先!) /
ON ENDFILE(SYSIN) … ;
…
END;
「どっちが呼ばれるの?」という疑問が湧きますよね。ルールは単純です。「一番最近(内側)で宣言されたものが優先される」。
これ、現場では「罠」になりやすいんです。深い階層で宣言したONユニットを解除し忘れると、予期せぬ場所で古い終了処理が動いてしまい、バグの原因になります。もし特定の処理が終わったら、`REVERT ON ENDFILE(SYSIN);`を使って、元の状態(外側の処理)に戻してあげるのが、プロの「後片付け」です。
—
初学者の皆さんがハマりやすい「落とし穴」
最後に、一つだけ覚えて帰ってください。「ON ENDFILE内でファイルをクローズしてはいけない」という鉄則です。
ONユニットは「読み込み中断中」のイベントです。その最中に`CLOSE`を投げると、OSが「えっ、まだ読み込み中じゃないの?」とパニックを起こすことがあります。後処理は、あくまでフラグを立てて、メインループを抜けた後の場所で行うのが、メインフレームを長生きさせる秘訣です。
—
最後に
PL/Iの記述は、一見するとCOBOLのように冗長で、Javaのようにモダンではないかもしれません。しかし、コンパイラが「どう動くか」を細かく制御できるこの言語は、まさにシステムアーキテクトの腕の見せ所です。
「ON ENDFILE」一つとっても、その背景にはメインフレームのOS(z/OS)がどうリソースを管理しているかという深い意図があります。怖がらず、まずは小さなプログラムで「ファイルが空っぽになった瞬間」を捕まえてみてください。
もし、実務のコードで「このONユニットの挙動が怪しい…」と迷ったら、いつでもまた聞きに来てくださいね。あなたのメインフレームライフを応援しています!
