【COBOL学習|実務向け】モダンCOBOLの作法:インラインPERFORMのEXIT拡張で「脱・GO TO」を実現する

導入:なぜ今、EXIT PERFORMが必要なのか

現場でCOBOLのソースコードを保守していると、多重ループの途中で特定の条件を満たした際に「ループを一気に抜けて後続処理へ移りたい」という場面に遭遇します。かつてのCOBOLでは、こうした制御には苦肉の策として「GO TO」文を使用してラベルへ飛ぶのが一般的でした。しかし、GO TOの多用はプログラムの構造を複雑化させ、保守性を著しく低下させます。COBOL 2002以降で導入された「EXIT PERFORM」を活用すれば、構造化を保ったままクリーンにループを脱出することが可能です。

基礎知識:インラインPERFORMとEXITの仕組み

インラインPERFORMは、PERFORM … END-PERFORMの間に直接処理を記述する方式です。これまでのCOBOLでは、インラインPERFORMから抜け出すにはループ条件(UNTILなど)を偽にするしかありませんでした。
「EXIT PERFORM」は、その名の通り実行中のインラインPERFORMから即座に抜けるためのキーワードです。また、「EXIT PERFORM CYCLE」と記述すれば、現在の反復のみをスキップして次の反復へ進むという「continue」のような挙動も実現できます。

実装:論理的な制御の流れ

多重ループ内での制御を例に挙げます。外側のループと内側のループがあり、内側の特定の条件で「外側のループも含めて完全に終了したい」場合、従来のコードではフラグ変数を用意してループを回す必要がありました。EXIT PERFORMを使えば、フラグ管理の煩雑さから解放されます。

サンプルプログラム:EXIT PERFORMによるループ脱出

以下は、2重ループから特定の条件で脱出するサンプルコードです。

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-EXIT-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(2).
01 J PIC 9(2).

PROCEDURE DIVISION.
    > 外側のループ
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        DISPLAY "外側ループ: " I
        
        > 内側のループ
        PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
            IF I = 2 AND J = 3 THEN
                DISPLAY "条件合致:内側ループを抜けて外側も終了します"
                > ここでインラインPERFORMを終了させる
                EXIT PERFORM 
            END-IF
            DISPLAY "  内側ループ: " J
        END-PERFORM
        
    END-PERFORM.
    
    DISPLAY "正常にループを脱出しました。"
    STOP RUN.

応用・注意点:現場での活用と落とし穴

1. 階層の意識
EXIT PERFORMは、直近の(最も内側の)PERFORMを抜けることになります。ネストが深い場合、どのレベルのループを抜けているのかコードの可読性に注意してください。

2. 互換性の確認
この機能はCOBOL 2002規格以降で正式化されています。利用しているコンパイラがモダンな規格に対応しているか、事前にマニュアルを確認してください。古いホスト系コンパイラなどではコンパイルエラーになる可能性があります。

3. 乱用は厳禁
「構造化を維持できる」といっても、あまりに多くのEXIT PERFORMを散りばめると、処理の出口が不明確になり、かえってデバッグが困難になります。基本はループ条件(UNTIL)で制御し、例外的なケースのみEXIT PERFORMを使用するという「設計思想」をチーム内で共有することが、長く読み継がれるコードを書く秘訣です。

コメント

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