現代のエンジニアへ贈る:PL/Iの世界へようこそ(予約語がない自由と、ENDFILEの流儀)
こんにちは。メインフレームの深淵で長年システムアーキテクトをしている者です。
JavaやCOBOLの世界からやってきた皆さんにとって、PL/I(ピーエル・ワン)という言語は、まるで「少し古いけれど、とんでもなく頑丈な名車」のように映るかもしれません。今回は、そんなPL/Iの少し不思議で、でも一度わかると非常に頼もしい「識別子の自由さ」と「ファイル終了処理(ON ENDFILE)」について紐解いていきましょう。
「PL/Iって何だか難しそう」と思っているあなたも、大丈夫。一つずつ、紐解いていきましょうね。
—
1. 「予約語」が存在しない?PL/Iの不思議な自由
COBOLやJavaでプログラミングをしていると、「予約語(言語仕様で決められた単語)」には神経を使いますよね。「`IF`という名前の変数を作っちゃダメ」といったルールです。
ところが、PL/Iの世界には純粋な意味での「予約語」は存在しません。
例えば、`IF`という変数を作ったとしても、PL/Iコンパイラは「あ、これは文脈的に変数だな」と空気を読んで解釈してくれます。これは非常に自由な反面、初心者の頃は「何でもありすぎて、逆に何が正しいの?」と混乱するポイントでもあります。
【現場のアドバイス】
自由だからといって、`IF = 10;` なんてコードを書くと、後から読む人がパニックを起こしますよね。PL/Iの歴史は長いですが、コーディング規約で「キーワードは避ける」のが暗黙の了解であり、プロとしてのマナーです。言語に縛られるのではなく、美しく書くための「自制」が求められる、そんな大人な言語なんです。
—
2. ファイル終了(ENDFILE)をエレガントに扱う
さて、本題のファイル読み込み制御です。メインフレームのバッチ処理では、大量のデータを読み込むのが日常茶飯事ですよね。
PL/Iでは、ファイルの終わりを検知するために `ON ENDFILE` という「条件監視ユニット」を使います。これは、ファイルの読み込み中に「もうデータがないよ!」という合図(例外)が飛んできた時に、「その時、何をすべきか」をあらかじめ登録しておく仕組みです。
実践的なコード例
/ ファイル読み込みの基本構造 /
/ 読み込み処理が終了した時の振る舞いを定義する /
ON ENDFILE(INPUT_FILE) BEGIN;
PUT SKIP LIST(‘データ終了です。処理を締めくくります。’);
EOF_FLAG = ‘Y’; / 終了フラグを立てる /
END;
EOF_FLAG = ‘N’;
OPEN FILE(INPUT_FILE) INPUT;
DO WHILE (EOF_FLAG = ‘N’);
READ FILE(INPUT_FILE) INTO(DATA_RECORD);
/ 読み込んだ後のメインロジック /
PUT SKIP LIST(DATA_RECORD.ID, DATA_RECORD.NAME);
END;
CLOSE FILE(INPUT_FILE);
このコードのポイント
- ONユニットの先払い: `ON ENDFILE` は、読み込みループの「前」に書いておくのが鉄則です。
- BEGIN-ENDブロック: 「終了した時に何をしたいか」をこのブロックの中に詰め込みます。今回はフラグを立てるだけにしていますが、ここで統計情報を出力したり、ログを閉じたりといった後処理を記述するのが一般的です。
—
3. SIGNAL ENDFILEで「擬似終了」を操る
時には、「ファイルはまだ終わっていないけれど、特定の条件になったら強制的に終了処理(ENDFILE時の処理)に飛ばしたい」というケースがあります。
そんな時に使うのが `SIGNAL ENDFILE(ファイル名);` です。
/ 特定のレコード番号に達したら強制終了させる例 /
IF REC_COUNT > 1000 THEN DO;
PUT SKIP LIST(‘1000件到達。強制的に終了処理へ移行します。’);
SIGNAL ENDFILE(INPUT_FILE); / わざと終了イベントを発生させる /
END;
これを使うと、わざわざ複雑な `GOTO` 文を書かなくても、正常系の終了処理(`ON ENDFILE` に書いた処理)をそのまま再利用できるんです。この「意図的にイベントを発生させる」という考え方は、現代の例外処理の先駆けとも言える、非常に賢い設計だと思いませんか?
—
最後に:怖がらなくて大丈夫です
PL/Iは、その歴史の長さゆえに「難しい」という先入観を持たれがちです。しかし、今日触れたように、コンパイラは非常に柔軟ですし、例外処理の仕組みも非常に理にかなっています。
メインフレームの現場でPL/Iに出会った時、「これは古臭い言語だ」と遠ざけるのではなく、「柔軟に書ける自由なキャンバス」だと思って接してみてください。きっと、あなたのエンジニアとしての引き出しを大きく広げてくれるはずです。
何かまた分からないことがあれば、いつでも聞きに来てくださいね。一緒にコードを読み解いていきましょう!
