メインフレームの深淵へ:PL/IのDOループ制御と「予約語なき世界」の落とし穴
若手エンジニア諸君、お疲れ様。今日もバッチジョブのログと格闘していることだろう。
PL/Iという言語は、CやJavaに慣れた現代のエンジニアから見れば「古臭い」かもしれない。だが、この言語の柔軟性と、かつてIBMが目指した「万能言語」としての設計思想には、今なお学ぶべき深淵がある。
今回は、現場のトラブルシューティングで最もケアレスミスを誘発しやすい「DOループの制御(ITERATE/LEAVE)」と、PL/I特有の「予約語を持たない」という仕様が生む罠について、実務の視点から紐解いていこう。
—
1. 「予約語がない」というPL/Iの自由と呪縛
まず、PL/Iの最大の特異点について触れておく。PL/Iには、厳密な意味での予約語が存在しない。
例えば、`IF`や`THEN`、あるいは`DO`といった制御構文すら、実は変数名として宣言できてしまうのだ。
1
/ 悪い例:可読性を極限まで破壊するコード /
DECLARE DO FIXED BIN(15) INIT(10);
DO = 5; / 変数名としてのDO /
これはコンパイラが文脈(コンテキスト)から「これは命令か、それとも変数か」を判断しているからだ。しかし、現場の保守でこれをやると、後の担当者が地獄を見る。コード規約で「制御構文を変数名にしないこと」を徹底しているのは、コンパイラを混乱させるためではなく、人間の脳のメモリを節約するためだ。
—
2. DOループの制御:ITERATEとLEAVEの流儀
バッチ処理でVSAMファイルを読み込み、特定のレコードだけを処理対象外にする――そんな時に多用するのが`ITERATE`と`LEAVE`だ。
ITERATE(次へ進む)
現在のループの残りの処理をスキップし、次のループの評価へ移る。
LEAVE(強制終了)
ループの制御を即座に放棄し、ループブロックの直後の命令へ制御を渡す。
ここで重要なのは、「ネストされたループからどう脱出するか」という点だ。PL/Iではラベルを使うことで、多重ループを一気に脱出できる。これを知っているだけで、フラグ変数を無駄に立てる汚いコードを書かなくて済む。
—
3. 実践コード:VSAMアクセスとループ制御の融合
以下の例は、VSAMファイルを読み込み、エラーレコードがあれば飛ばし、致命的な異常があればループ全体を脱出する、現場でよくあるパターンだ。
1
/ ———————————————————– /
/ VSAMレコード処理のメインループ /
/ ———————————————————– /
MAIN_LOOP: DO WHILE (EOF_FLAG = ‘N’);
READ FILE(IN_VSAM) INTO(RECORD_AREA);
/ 1. レコードの妥当性チェック /
IF RECORD_AREA.KEY = ‘9999’ THEN DO;
/ キーが9999ならこのレコードの処理はスキップして次へ /
ITERATE MAIN_LOOP;
END;
/ 2. 重大なエラー検出時のループ脱出 /
IF RECORD_AREA.STATUS = ‘FATAL’ THEN DO;
PUT SKIP LIST(‘致命的エラー発生:処理を中断します’);
LEAVE MAIN_LOOP;
END;
/ 通常処理 /
CALL PROCESS_DATA(RECORD_AREA);
END MAIN_LOOP;
ここがポイント
- ラベルの重要性: `DO`文にラベル(`MAIN_LOOP:`)を付けること。これにより、ネストが深くなっても`LEAVE ネスト名`と書くことで、意図した階層を正確に脱出できる。
- ONユニットとの兼ね合い: `ON ENDFILE(IN_VSAM)`でフラグを立てる設計は定石だが、`LEAVE`でループを抜けた場合、その後の後始末(CLOSEや出力確定)の処理が正しく実行されるか、フローチャートを必ず確認すること。
—
4. 現場の教訓:なぜ「謎の挙動」が起きるのか
稀に、「`LEAVE`したはずなのに、なぜかループが継続している」という相談を受けることがある。原因のほとんどは「ONユニットの戻り先」にある。
PL/Iの`ON`ユニット(例外処理)から`GOTO`でループ外に飛んだ場合、スタックのクリアや制御フローの復帰が中途半端になることがある。レガシーなコードを改修する際は、`ON`ユニット内での複雑な制御フローを避け、極力フラグチェックによる制御へ書き換えるのが、バグを生まないための「大人のコード」だ。
—
最後に:ベテランからのアドバイス
PL/Iの保守において最も重要なのは、「トリッキーなコードを書かないこと」に尽きる。
DOループの制御は強力だ。しかし、複雑な`ITERATE`と`LEAVE`の応酬は、デバッグ時に我々を苦しめることになる。
コードは「次に読む人(半年後の自分を含む)」への手紙だ。
適切なラベル付け、読みやすいインデント、そして何より「なぜこの制御を行っているのか」というコメント。これらがあって初めて、君の書いたPL/Iコードは、メインフレームの歴史に刻まれる価値を持つ。
何か疑問があればいつでも聞くがいい。現場の最前線で、共にシステムを守り抜こう。
