【入門編】DO-WHILEとDO-UNTILのループ終了判定タイミングの差異 – PL/Iの基本構文とデータ制御実践ガイド

こんにちは。メインフレームの世界へようこそ。
Javaのオブジェクト指向やCOBOLの厳格なピクチャ句に慣れ親しんだ方ほど、PL/Iという言語は「えっ、そんなに自由でいいの?」と少し戸惑うかもしれませんね。でも大丈夫です。実はPL/Iほど、プログラマの意図を汲み取ろうと「空気を読む」言語も珍しいんですよ。

今日は、多くのエンジニアが最初の関門として躓きがちな「DO-WHILE」と「DO-UNTIL」の違いについて、現場の知見を交えて紐解いていきましょう。

1. PL/Iに「予約語」がないという驚き

まず、PL/Iの門を叩いて一番驚くのが「予約語がない」という事実かもしれません。
例えば、他の言語なら`IF`や`WHILE`といったキーワードを変数名に使うとコンパイルエラーになりますよね? しかし、PL/Iでは以下のような記述も(あまり褒められた書き方ではありませんが)文法的には正当なものとして扱われます。

1
/ 悪い例:変数を予約語と同じ名前にする /
DCL IF FIXED BIN(15);
IF = 10;

なぜこれが可能なのか? それはコンパイラが文脈(コンテキスト)を見て「これは命令か、それとも変数か」を判断しているからです。この「融通の利く性格」が、時にはバグの温床にもなるのですが、裏を返せば「非常に柔軟な設計が可能」という強力な武器でもあります。

2. DO-WHILEとDO-UNTIL:判定タイミングの「ズレ」

さて、本題のループ制御です。ここを勘違いすると、バッチ処理で「データが1件足りない!」あるいは「余計に1回処理してしまった!」という悲劇が起こります。

DO-WHILE:入口で「入るかどうか」を決める

`DO WHILE`は、ループに入る前に条件をチェックします。これはJavaの`while`文と全く同じ感覚です。

1
DCL I FIXED BIN(15) INIT(1);

/ Iが10以下の間だけ処理を繰り返す /
DO WHILE (I <= 10); / 処理内容 / I = I + 1; END; この場合、もし最初に`I`が11だったら、中の処理は一度も実行されずにスキップされます。非常に安全で、手堅いループです。

DO-UNTIL:出口で「終わるかどうか」を決める

一方で`DO UNTIL`は、ループを一度回した後に条件をチェックします。「とりあえず1回はやってみて、ダメならやめる」というスタイルです。

1
DCL I FIXED BIN(15) INIT(1);

DO UNTIL (I > 10);
/ 処理内容:最初は必ず実行される /
I = I + 1;
END;

ここが重要です。`DO UNTIL`は「条件が真(TRUE)になったら止まる」というロジックです。つまり、`I`が11になった瞬間にループを抜けます。

3. レジスタとストレージ:なぜこの違いが重要なのか

メインフレームの現場では、CPUのレジスタ効率やメモリ消費を意識することがあります。

`DO-WHILE`は、コンパイラにとって「ループの先頭で分岐条件を評価する」という最適化が効きやすい構造です。一方、`DO-UNTIL`はループの最後に評価が残るため、処理の構造によってはジャンプ命令が多めに生成される傾向があります。

また、PL/Iの変数は`FIXED BIN(15)`のように宣言すると、内部的にはCPUの汎用レジスタに乗りやすい形式で保持されます。ループ内で変数を更新する際、コンパイラは可能な限りレジスタ上で計算を完結させようとしますが、複雑な条件式を`UNTIL`に詰め込みすぎると、その都度メインメモリ(ストレージ)へのアクセスが発生し、性能劣化を招くことがあります。

現場からのアドバイス

  • 読みやすさ優先なら `WHILE`: ほとんどのケースは`WHILE`で書けます。コードの意図が明確です。
  • 初期条件に関わらず「最低1回は処理したい」なら `UNTIL`: ファイルの読み込み処理などで「とりあえず1行読んでから判定」というケースには`UNTIL`が非常に便利です。

まとめ:怖がらなくて大丈夫です

PL/Iのループは、COBOLのように`PERFORM UNTIL`の後に条件を書く形式に慣れている方には少し新鮮かもしれません。でも、一つずつ「いつ判定されるか」を頭の中でシミュレーションすれば、決して難しいことはありません。

もしコードを書いていて「あれ、今どっちだっけ?」と迷ったら、「WHILEは入口の番人、UNTILは出口の門番」と唱えてみてください。

メインフレームのコードは、先人たちが何十年も守り抜いてきた大切な資産です。そこに皆さんの新しいコードが加わることで、さらに強固なシステムになっていくはずです。応援していますよ!

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