メインフレームの世界へようこそ!PL/Iの「ON ENDFILE」でファイル処理を優雅に制御しよう
こんにちは。IBMメインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきたエンジニアの方にとって、PL/I(ピーエルワン)という言語は、一見すると「なんだか古臭くて難しそう……」に見えるかもしれません。
でも、安心してください。PL/Iは「科学技術計算の強さ」と「事務処理の堅牢さ」を併せ持った、非常に洗練された言語です。今日はその中でも、バッチ処理の心臓部といえる「ファイル終了(EOF)の検知」について、PL/I流のスマートなやり方を一緒に紐解いていきましょう。
—
そもそも、PL/Iのプログラムってどんな形?
まずは基本の形を見てみましょう。Javaでいう`public static void main`にあたるのが、PL/Iの`OPTIONS(MAIN)`です。
/i
MYPROG: PROCEDURE OPTIONS(MAIN);
/ ここに変数宣言や処理を書きます /
PUT SKIP LIST(‘システム稼働開始!’);
END MYPROG;
PL/Iでは、プログラムの開始と終了を`PROCEDURE`と`END`で囲みます。`MYPROG:`のようなラベルを付けることで、どこからが処理の単位なのかを明示するんですね。このシンプルさが、実は数十年もの間、基幹システムを支え続けてきた秘訣でもあります。
—
「ファイルが終わった!」を検知する:ON ENDFILEの魔法
さて、本題です。外部ファイル(データセット)からデータを読み込む際、一番怖いのは「どこまでがデータか分からない」ことですよね。
COBOLなら`READ FILE AT END …`と書くところですが、PL/Iでは「ON条件(ON-Unit)」という、より宣言的でエレガントな仕組みを使います。
「ファイルが終了したら、こう振る舞え!」という命令をあらかじめ登録しておくイメージです。これが非常に強力なんです。
実践コード:ファイルを読み切るまでループする
/i
GET_DATA: PROCEDURE OPTIONS(MAIN);
/ ファイルの終了判定をあらかじめセットする /
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP LIST(‘— 全データの読み込みが完了しました —‘);
STOP; / 処理をここで終了させる /
END;
/ 読み込みループ /
DO WHILE(‘1’B); / ‘1’B は論理値の TRUE /
GET FILE(SYSIN) EDIT(IN_REC) (A(80));
PUT SKIP LIST(‘読み込んだデータ: ‘ || IN_REC);
END;
END GET_DATA;
このコードのポイント
1. ON ENDFILE(SYSIN): これが「見張り番」です。このプログラムが走っている間、誰かが`SYSIN`というファイルを見ている間ずっと、ファイル終端が来た瞬間にこのブロックが呼び出されます。
2. STOP: `ON`ブロックの中で呼ばれる`STOP`は、プログラムを正常に終了させるための強力な脱出ボタンです。
3. DO WHILE(‘1’B): 無限ループに見えますよね? でも大丈夫。ファイルが終われば`ON`ブロック内の`STOP`が呼び出されるので、安全にプログラムが終了する仕組みです。
—
なぜこの書き方が「メインフレーム流」なのか?
Javaなどの言語では、ループの中で常に「読み込みが成功したか?」を`if`文でチェックするのが一般的です。でも、PL/Iの`ON`ユニットを使うと、「正常系の処理」と「異常系(終了処理)の制御」を綺麗に分離できるんです。
現場の巨大なバッチプログラムでは、複数のファイルを同時に扱うことも珍しくありません。そんな時、`ON`ユニットを定義しておけば、「ファイルが終わったらどうする?」という共通のルールをプログラムの先頭で定義しておくだけで、メインのロジックを汚さずに済むのです。
初心者の方がつまずきやすいポイント
- ‘1’B って何?: PL/Iではビット列を扱うことが多く、`’1’B`は論理的なTRUEを指します。最初は奇妙に見えますが、慣れるとこのビット操作の細かさが、メモリを節約したいレガシー環境では愛おしくなってきますよ。
- ON-Unitはどこに書くの?: 基本はプログラムの冒頭です。`PROCEDURE`の中に書くことで、その有効範囲を制御できます。
—
最後に:怖がる必要はありません
レガシーなシステムといっても、結局は「データを読み込んで、加工して、書き出す」という基本は現代のJavaやPythonと同じです。
PL/Iの`ON ENDFILE`のような仕組みは、最初は「制御の流れが飛ぶようで怖い」と感じるかもしれません。しかし、これは「例外処理の先駆け」とも言える非常にモダンな考え方です。
もし現場のコードで`ON ENDFILE`を見かけたら、「ああ、ここでファイルが終わった時の後始末をしているんだな」と、落ち着いて眺めてみてください。一つずつ紐解いていけば、PL/Iはあなたの頼もしいパートナーになってくれるはずです。
また分からないことがあれば、いつでも聞いてくださいね。一緒にメインフレームの深淵を楽しく紐解いていきましょう!
