PL/Iの世界へようこそ:DOループの制御と「予約語がない」という不思議な自由
こんにちは。メインフレームの世界へようこそ。
これまでJavaやCOBOLを触ってきた方にとって、PL/Iという言語は少し「異質」に見えるかもしれません。「予約語がない」という衝撃的な仕様や、独特な宣言スタイルに最初は戸惑うことでしょう。
でも安心してください。PL/Iは、一度その「気質」を理解してしまえば、非常に柔軟で強力な相棒になります。今日はその中でも、バッチ処理で避けては通れない「DOループの制御(ITERATEとLEAVE)」について、現場の知見を交えて紐解いていきましょう。
—
1. PL/Iには「予約語」が存在しない?
まず、皆さんが最も驚くのが「予約語がない」という事実です。
Javaなら `if` や `while` は変数名に使えませんが、PL/Iではなんと `IF` という変数名を宣言してもエラーになりません。
/i
/ 極端な例ですが、こんな宣言も文法上は「合法」です /
DCL IF FIXED BIN(31) INIT(10);
DCL THEN FIXED BIN(31) INIT(20);
コンパイラはどうやって判断しているのか? それは、コードの「文脈」を解析しているからです。PL/Iは非常に賢い(というより、文脈を読み取る力が異常に高い)ので、「ここは変数だな」「ここは命令だな」と判断してくれます。
ただし、コードの可読性を保つために、予約語っぽい名前を変数名に使うのは絶対にやめましょう。 混乱するのはコンパイラではなく、次に保守を担当するあなた自身ですからね。
—
2. DOループを自在に操る:ITERATEとLEAVE
さて、本題のループ制御です。Javaの `continue` や `break` に相当するものが、PL/Iではそれぞれ `ITERATE` と `LEAVE` になります。
ITERATE:ループを「スキップ」して次へ
「ある条件の時だけ処理を飛ばしたい」。そんな時は `ITERATE` を使います。
/i
DO I = 1 TO 10;
/ もしIが偶数なら、残りの処理を飛ばして次のループへ /
IF MOD(I, 2) = 0 THEN ITERATE;
PUT SKIP LIST(‘奇数です:’, I);
END;
LEAVE:ループを「強制脱出」する
「目的の値が見つかったから、もうループを回す必要がない」。そんな時は `LEAVE` です。
/i
DO I = 1 TO 100;
IF DATA_FOUND(I) THEN DO;
PUT SKIP LIST(‘見つかりました:’, I);
LEAVE; / ループを抜けます /
END;
END;
—
3. ネストされたループからの「華麗なる脱出」
ここからがPL/Iの真骨頂です。複数のループが重なっている場合、`LEAVE` を使うと「直近のループ」だけを抜けますよね。でも、「外側のループまで一気に抜けたい!」というケース、現場ではよくあります。
そんな時、PL/Iには「ラベル」を付けるという非常にスマートな解決策があります。
/i
OUTER_LOOP: DO I = 1 TO 5;
INNER_LOOP: DO J = 1 TO 5;
IF SOME_FATAL_ERROR(I, J) THEN DO;
/ OUTER_LOOPという名前を指定して、二重ループから一気に脱出! /
LEAVE OUTER_LOOP;
END;
END INNER_LOOP;
END OUTER_LOOP;
この「ラベル指定」ができるおかげで、フラグ変数(`FOUND = ‘Y’` とか)を大量に用意して `IF` 文で判定を重ねるような、いわゆる「スパゲッティコード」を回避できるんです。これはJavaのラベル付きbreakに近いですが、PL/Iの方がより直感的で、かつ構造的に書けるのが魅力です。
—
現場のアーキテクトからのアドバイス
PL/Iのループ制御において、最も注意すべきは「スタック操作」を意識することです。
`LEAVE` や `ITERATE` は、コンパイラが自動的にループの終了位置を計算してジャンプコードを生成しますが、複雑なネストや `GOTO` 文(あまり推奨されませんが)と組み合わせると、どこに飛ぶのか追いにくくなることがあります。
- 基本は「ラベル」を付けること: 上記の例のように、どのループに対して `LEAVE` しているのかを明確にしましょう。
- 深すぎるネストは罪: 3重以上のネストが必要な場合は、処理を別サブルーチン(`PROCEDURE`)に切り出すサインです。
PL/Iは古い言語ですが、その設計思想には「どうすればプログラムを論理的に書けるか」という先人の知恵が詰まっています。最初は奇妙に見えるかもしれませんが、一つずつ紐解いていけば、これほど書きやすく、堅牢な言語は他にありません。
焦らず、怖がらず、まずは小さなループから触ってみてくださいね。応援しています!
