PL/Iの世界へようこそ!「ON ENDFILE」で学ぶ、メインフレーム流の例外処理の作法
こんにちは。IBMメインフレームの世界へようこそ。
Javaでバリバリとオブジェクト指向を操っていた方や、COBOLの堅牢な手続き型プログラミングに慣れ親しんだ方にとって、PL/I(ピー・エル・ワン)という言語は、どこか「古風で少し気難しい職人」のように見えるかもしれませんね。
でも、安心してください。PL/Iは「何でも屋」として設計された非常に柔軟で、かつ一度コツを掴めばこれほど頼もしい相棒はいません。今日は、PL/Iを語る上で欠かせない「ONユニット」と、ファイル読み込みの制御について紐解いていきましょう。
—
PL/Iには「予約語」がない? 自由すぎる命名規則の話
まず、皆さんが驚くのが「PL/Iには厳密な予約語が存在しない」という事実です。
JavaやCOBOLでは `IF` や `SELECT` といったキーワードを変数名に使うことはできませんよね。しかし、PL/Iの世界では、あなたが仮に `IF` という名前の変数を作ったとしても、コンパイラは文脈を読み取って「これは変数だな」「これは制御文だな」と判断してくれます。
…とはいえ、現場では「可読性を下げるので予約語っぽい名前は避ける」のが鉄則です。あくまで「言語仕様上は可能」というだけで、メンテナンスする未来の自分を泣かせないような命名を心がけましょうね。
—
ファイル読み込みの終着点「ON ENDFILE」
ファイル処理の現場で最も頻出するのが、データの読み込み終了処理です。COBOLでは `AT END` 句を使いますが、PL/Iでは「例外処理(ONユニット)」という仕組みを使います。
「ファイルが空になった(ENDFILE)」という事象が発生した瞬間、プログラムは「あ、終わったんだな」と割り込み処理を自ら実行します。これが `ON ENDFILE` です。
コードで見る「ONユニット」の基本
まずは、シンプルな読み込みループを見てみましょう。
/i
/ ファイル読み込みのサンプル /
MY_PROC: PROC OPTIONS(MAIN);
DCL SYSIN FILE RECORD INPUT; / 入力ファイルを定義 /
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグを初期化 /
/ ファイル終了時の振る舞いを定義 /
ON ENDFILE(SYSIN) BEGIN;
EOF_FLAG = ‘1’B; / 終了フラグを立てる /
PUT SKIP LIST(‘データ読み込み完了!’);
END;
OPEN FILE(SYSIN);
/ 読み込みループ /
DO WHILE(EOF_FLAG = ‘0’B);
READ FILE(SYSIN) INTO(MY_RECORD);
IF EOF_FLAG = ‘0’B THEN DO;
/ ここでデータ処理を行う /
PUT SKIP LIST(MY_RECORD);
END;
END;
CLOSE FILE(SYSIN);
END MY_PROC;
—
ここで注意!ONユニット内での「GOTO」は禁断の果実?
ここが初心者の方が一番躓きやすいポイントです。
ONユニットの中で `GOTO` を使って、処理のメインストリームへ強制的にジャンプさせるコードを見かけることがあります。
「え、これって便利じゃない?」と思うかもしれません。しかし、これはメインフレームのバッチ処理において、「プログラムの実行コンテキストを破壊する」という危険な行為になり得ます。
- なぜ危険なのか?
ONユニットは、ある意味で「割り込み処理」です。その中で無理やり `GOTO` で外に出るということは、本来スタックとして管理されている処理の流れを無視することになります。最悪の場合、メモリリークや、ファイルポインタの不整合を引き起こす「謎の異常終了(ABEND)」の温床になります。
推奨される制御フロー
基本的には上記の例のように、「フラグ(ビット変数など)を立てて、通常のループ制御に戻る」のが、最も安全で、かつ後任のエンジニアにも優しい書き方です。「GOTOでショートカットしたい」という誘惑に駆られたら、一度立ち止まって、「フラグで管理できないかな?」と考えてみてくださいね。
—
最後に:怖がる必要はありません
PL/Iの宣言(DCL文)は `DCL MY_VAR FIXED BIN(31);` のように、属性を細かく指定するため、最初は呪文のように感じるかもしれません。しかし、これらは全て「計算機がいかに効率よくメモリを使うか」を定義するための先人の知恵です。
一つずつ、変数の型と、その変数がシステムの中でどう振る舞うかをイメージできるようになれば、PL/Iほど論理的で美しい言語はありません。
もし現場で `ON ENDFILE` に悩んだら、いつでもこの記事を思い出してください。あなたのメインフレーム開発ライフが、少しでも快適なものになりますように!
それでは、次回の記事でお会いしましょう。ハッピー・コーディング!
