導入:なぜCANCEL文が必要なのか?
COBOL開発において、サブプログラムをCALLする機会は非常に多いものです。しかし、呼び出した後の「後始末」を意識しているでしょうか?実は、一度CALLされたサブプログラムは、プログラムが終了するまでメモリ上に常駐し続けます。これが「メモリ不足」や「変数の値が前回呼び出し時のまま残っている」といった予期せぬ不具合の原因になります。CANCEL文を正しく使うことで、メモリを効率化し、プログラムの動作をクリーンに保つことができます。
基礎知識:CANCEL文の役割
CANCEL文は、動的にロードされたサブプログラムをメモリから解放(アンロード)する命令です。これには大きく分けて二つの効果があります。
1. メモリの解放: 使わなくなったプログラムをメモリから追い出し、リソースを確保します。
2. 状態のリセット: 次回CALLした際に、Working-Storageセクション(作業領域)が初期値(VALUE句で定義された値)に強制的にリセットされます。いわゆる「初期化漏れ」を防ぐ強力な手段です。
実装と解決策
CANCEL文を実行するタイミングは、サブプログラムが完了し、以降そのプログラムを呼び出す必要がなくなった直後です。注意点として、CANCEL文の引数には「プログラム名(リテラルまたはデータ項目)」を正確に指定する必要があります。プログラム名が正しくないとエラーになる可能性があるため、定数として定義しておくのが現場の定石です。
サンプルプログラム
以下に、メインプログラムからサブプログラムを呼び出し、処理後にCANCELで解放する一連の流れを記述します。
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
WORKING-STORAGE SECTION.
- サブプログラム名の定義
01 SUB-NAME PIC X(8) VALUE “SUBPROG”.
PROCEDURE DIVISION.
- 1. サブプログラムを呼び出す
CALL SUB-NAME.
- 2. 処理完了後、メモリから解放する
- これにより次回呼び出し時はWorking-Storageが初期化される
CANCEL SUB-NAME.
STOP RUN.
- — サブプログラム側 —
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
ADD 1 TO COUNTER.
DISPLAY “現在のカウント値: ” COUNTER.
EXIT PROGRAM.
応用・注意点:現場で陥りやすい罠
実務で最も注意すべき点は、「CANCELをやりすぎない」ということです。頻繁に呼び出されるサブプログラムに対して毎度CANCELを実行すると、ロードとアンロードのオーバーヘッド(処理負荷)が発生し、逆にシステム全体のパフォーマンスを低下させます。
また、「内部テーブルやファイルの状態」にも注意が必要です。CANCELはWorking-Storageを初期化しますが、開いたままのファイルや、外部リソースの状態まで完全に初期化されるとは限りません。プログラム終了時にCLOSE処理を忘れないことが、堅牢なシステム構築の第一歩です。
メモリ管理を制する者はCOBOLを制す。ぜひ明日のコーディングから意識してみてください。

コメント