こんにちは!IBMメインフレームの世界へようこそ。
Javaの`for`ループやCOBOLの`PERFORM`文に慣れ親しんだ皆さんが、PL/Iのコードを初めて見たとき、「なんだか古めかしいし、キーワードが独特で難しそう…」と感じるのは当然のことです。
でも、安心してください。PL/Iは「あらゆる用途(Programming Language One)」という名の通り、実は非常に柔軟で、論理的な構造を持った言語なんです。今日は、ループ処理における制御の要、「`ITERATE`」と「`LEAVE`」について、肩の力を抜いて紐解いていきましょう。
—
1. ループ制御の「スキップ」と「脱出」
Javaなら`continue`や`break`を使う場面ですよね。PL/Iではそれぞれ`ITERATE`と`LEAVE`を使います。
- ITERATE: 「今の回はもういいや、次は次!」と、ループの先頭へスキップする命令。
- LEAVE: 「もう疲れた、ここでおしまい!」と、ループを強制終了する命令。
これらは、特定の条件で処理を飛ばしたり、エラーを見つけて即座に打ち切ったりする際に非常に重宝します。
—
2. 実践コードで見る制御フロー
百聞は一見に如かず。実際にコードを見てみましょう。PL/Iでは「ラベル」を使うことで、どのループを制御しているのかを明確にします。これがPL/Iの優しさであり、強力な武器です。
/i
TEST_PROC: PROCEDURE OPTIONS(MAIN);
/ 変数宣言:PL/Iは型宣言が豊富ですが、まずは基本の固定小数点から /
DCL (I, J) FIXED BIN(15);
/ 外側のループにラベルを付ける(これが重要!) /
OUTER_LOOP: DO I = 1 TO 3;
/ 内側のループ /
INNER_LOOP: DO J = 1 TO 5;
/ Jが3の時はスキップ(ITERATE) /
IF J = 3 THEN DO;
PUT SKIP LIST(‘J=3をスキップしました’);
ITERATE INNER_LOOP;
END;
/ Jが4の時は内側ループを終了(LEAVE) /
IF J = 4 THEN DO;
PUT SKIP LIST(‘J=4で内側ループを脱出!’);
LEAVE INNER_LOOP;
END;
PUT SKIP LIST(‘I=’ || I || ‘, J=’ || J);
END INNER_LOOP;
END OUTER_LOOP;
END TEST_PROC;
—
3. なぜ「ラベル」が大切なの?
コードを見て、「なぜわざわざ`INNER_LOOP:`なんて書くの?」と思いませんでしたか?
Javaなどの言語では、`break`は通常「直近のループ」を抜けるのがデフォルトですよね。しかし、PL/Iは「どのループを抜けたいか(あるいは飛ばしたいか)」を明示的に指定できるんです。
例えば、ネスト(二重ループ)の深い場所から、一気に外側のループまで抜け出したい時、PL/Iならこう書けます。
/i
LEAVE OUTER_LOOP; / これだけで外側のループも一気に脱出できる /
これ、実は基幹システムの複雑なバッチ処理では神機能なんです。COBOLだとフラグ変数を立てて、あちこちで`IF FLG = ‘Y’ THEN EXIT`なんて書かなければならないケースも、PL/Iならラベル一つでスッキリ解決できるんですから。
—
4. 現場で役立つアドバイス
PL/Iを扱う上で、初心者がハマりやすいポイントを一つだけ。
それは「DOグループのEND」です。
`IF`文の中で`ITERATE`や`LEAVE`を使う際、`DO; … END;`で囲むのを忘れないでください。PL/Iのコンパイラは非常に厳格で、`THEN`の後に単一のステートメントしか書かないと、意図しない制御フローになりがちです。
「条件分岐の中では、必ず`DO`と`END`でブロックを作る」
このルールさえ守っていれば、PL/Iの制御構造は非常に読みやすく、メンテナンス性の高いものになりますよ。
—
まとめ:怖がる必要はありません
PL/Iの構文は、最初は少し堅苦しく見えるかもしれません。ですが、それはメインフレームという「止まることが許されない堅牢な世界」で、ロジックを曖昧にしないための工夫です。
`ITERATE`で次へ進み、`LEAVE`で安全に脱出する。
この2つをラベルで制御できるようになれば、もうあなたはPL/Iのバッチ改修を恐れる必要はありません。
また何か分からないことがあれば、いつでも聞きに来てくださいね。あなたのメインフレーム開発ライフが、少しでも快適なものになりますように!
