導入:なぜ今、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を使用するという「設計思想」をチーム内で共有することが、長く読み継がれるコードを書く秘訣です。

コメント