導入
COPY句は「コードそのもの」を共有する仕組みでした。一方、「処理(ロジック)」を別のプログラムとして切り出し、必要なときに呼び出す仕組みが CALL文 です。これは他の多くの言語での「関数呼び出し」「モジュールのインポートと呼び出し」にとても近い考え方です。
説明
COBOLでは、1つの完結したプログラム(DIVISIONをひととおり持つ)を、別のプログラムから呼び出せます。呼び出される側を サブプログラム、呼び出す側を メインプログラム と呼びます。
graph TD
MAIN["MAIN-PROGRAM<br/>(呼び出し元)"] -- "CALL 'CALC-TAX'" --> CALC["CALC-TAX<br/>(サブプログラム)"]
CALC -- "GOBACK で戻る" --> MAIN
MAIN -- "CALL 'PRINT-REPORT'" --> PRINT["PRINT-REPORT<br/>(サブプログラム)"]
PRINT -- "GOBACK で戻る" --> MAIN
呼び出し側(メインプログラム)は次のように書きます。
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROGRAM.
PROCEDURE DIVISION.
DISPLAY "メイン処理を開始".
CALL "CALC-TAX".
DISPLAY "メイン処理を終了".
STOP RUN.
呼び出される側(サブプログラム)は、独立したファイル・独立したプログラムとして用意します。
IDENTIFICATION DIVISION.
PROGRAM-ID. CALC-TAX.
PROCEDURE DIVISION.
DISPLAY "税額計算処理を実行".
GOBACK.
CALL "CALC-TAX".…PROGRAM-IDがCALC-TAXのプログラムを呼び出す。文字列(""で囲む)でプログラム名を指定するのが基本形です。GOBACK.… サブプログラムの実行を終え、呼び出し元へ戻る命令。メインプログラムのSTOP RUN.に相当しますが、サブプログラムでは「実行終了」ではなく「呼び出し元に戻る」という意味になります(サブプログラムではSTOP RUNの代わりにGOBACKまたはEXIT PROGRAMを使います)。
実行結果は次のようになります。
メイン処理を開始
税額計算処理を実行
メイン処理を終了
第5章で学んだ「PERFORM で段落を呼び出す」ととてもよく似ていますが、決定的な違いがあります。PERFORMは同じプログラムファイルの中の段落を呼ぶのに対し、CALLは別のコンパイル単位(別ファイル)のプログラム全体を呼び出します。大規模なシステムを複数の担当者・複数のチームで分担して開発するとき、この「独立したファイルとして分割できる」性質が重要になります。
試すには
"HELLO" という名前のメッセージを表示するだけの簡単なサブプログラムと、それを CALL "HELLO". で呼び出すメインプログラムの2つを、それぞれ書いてみましょう。