【実務・中級編】DOループにおけるITERATEおよびLEAVE文の制御フロー – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの深淵へ: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コードは、メインフレームの歴史に刻まれる価値を持つ。

何か疑問があればいつでも聞くがいい。現場の最前線で、共にシステムを守り抜こう。

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