導入:なぜEXIT PROGRAMの理解が重要なのか
COBOL開発において、メインプログラムとサブプログラムを分けた階層構造は基本中の基本です。しかし、サブプログラムの処理が終了した際、漫然とプログラムの最終行まで実行させていませんか?「処理の途中で条件を満たしたら即座に呼び出し元へ戻りたい」という状況において、EXIT PROGRAMは制御フローを制御するための強力かつ必須の武器となります。これを適切に使うことで、コードの可読性が向上し、意図しない処理の続行(バグ)を防ぐことができます。
基礎知識:EXIT PROGRAMの役割と仕組み
EXIT PROGRAMは、CALL文によって呼び出されたサブプログラム内でのみ有効な命令です。この命令が実行されると、呼び出し元のプログラムの「CALL文の次の行」へ直ちに制御が戻ります。
注意すべきは、これがプログラムの終了を意味するのではなく、あくまで「呼び出された単位としての終了」である点です。もしメインプログラム(呼び出し元)でこの命令を実行しようとすると、コンパイラや実行環境によって警告が出たり、無視されたりすることがあります。サブプログラムの「出口」を明示的に指定する、非常に重要な制御構文です。
実装・解決策:構造化プログラミングにおける活用
構造化プログラミングの観点では、1つの段落や節に1つの出口(Single Entry, Single Exit)が理想ですが、バリデーションチェックなどで早期にエラーを検知して戻りたいケースでは、EXIT PROGRAMによる早期リターンが有効です。これにより、ネストの深いIF文を回避し、コードをフラットに保つことができます。
サンプルプログラム:安全な制御復帰の例
以下のサンプルは、入力値が異常な場合に即座に呼び出し元へ戻る、実務でよく使うパターンです。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-CALC.
DATA DIVISION.
LINKAGE SECTION.
01 LS-INPUT PIC 9(05).
01 LS-STATUS PIC X(01).
PROCEDURE DIVISION USING LS-INPUT LS-STATUS.
MAIN-PROC.
- 入力チェック:異常値なら処理を中断して呼び出し元へ戻る
IF LS-INPUT = 0 THEN
MOVE ‘E’ TO LS-STATUS
- ここで呼び出し元へ制御を即時返却する
EXIT PROGRAM
END-IF.
- 正常時のメイン処理
PERFORM CALC-PROCESS.
MOVE ‘S’ TO LS-STATUS.
- 物理的な末尾到達時も自動的に制御が戻るが、
- 明示的に書くことで処理の終わりが分かりやすくなる
EXIT PROGRAM.
CALC-PROCESS.
DISPLAY ‘計算処理を実行中…’.
応用・注意点:現場での陥りやすい罠
ベテランとして一つアドバイスしておきたいのは、CANCEL文との併用についてです。もしサブプログラム内でファイルをOPENしている場合、EXIT PROGRAMで終了しても、そのファイル状態は保持されます。もし次回呼び出し時に初期状態から開始したい場合は、呼び出し元でCANCEL文を実行してプログラムを解放する必要があります。
また、EXIT PROGRAMを呼び出した際、呼び出し元のプログラムが持つ「状態」に影響を与えていないか、常に意識してください。特に、再入可能(リエンタラント)なプログラムを設計する際は、EXIT PROGRAMで戻る前のデータの整合性を確認することが、安定稼働への近道となります。

コメント