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

こんにちは。メインフレームの世界へようこそ。
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ユニットの挙動が怪しい…」と迷ったら、いつでもまた聞きに来てくださいね。あなたのメインフレームライフを応援しています!

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