本文へスキップ
BecomeCoder

COBOLコース · 第9章 プログラムを分割する ― COPY句とサブプログラム · レッスン46

CALL文 ― サブプログラムを呼び出す

ローカル実施

導入

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-IDCALC-TAX のプログラムを呼び出す。文字列""で囲む)でプログラム名を指定するのが基本形です。
  • GOBACK. … サブプログラムの実行を終え、呼び出し元へ戻る命令。メインプログラムの STOP RUN. に相当しますが、サブプログラムでは「実行終了」ではなく「呼び出し元に戻る」という意味になります(サブプログラムでは STOP RUN の代わりに GOBACK または EXIT PROGRAM を使います)。

実行結果は次のようになります。

メイン処理を開始
税額計算処理を実行
メイン処理を終了

第5章で学んだ「PERFORM で段落を呼び出す」ととてもよく似ていますが、決定的な違いがあります。PERFORMは同じプログラムファイルの中の段落を呼ぶのに対し、CALLは別のコンパイル単位(別ファイル)のプログラム全体を呼び出します。大規模なシステムを複数の担当者・複数のチームで分担して開発するとき、この「独立したファイルとして分割できる」性質が重要になります。

試すには

"HELLO" という名前のメッセージを表示するだけの簡単なサブプログラムと、それを CALL "HELLO". で呼び出すメインプログラムの2つを、それぞれ書いてみましょう。