呼び出しプロトタイプ

呼び出しプロトタイプは、比較的新しい COBOL 言語の機能です。 プロトタイプにより、プログラムのコンパイル時に、各 CALL 文の正確性を確認することができます。

また、プロトタイプは、複数のプログラムから構成されるアプリケーションに意図した機能を正しく実装する上で役立ちます。

COBOL プログラムが他のプログラムを呼び出す場合、CALL 文で指定されているパラメーターの型や数は検証されません。 CALL 文の USING 句で指定したパラメーターの型と、呼び出し先のプログラムの連絡節のパラメーター (手続き部の USING 句で参照される) の型が異なる場合、アプリケーション エラーまたはランタイム システム エラーが発生する可能性が高くなります。

たとえば、次のようなプログラム Mymain があるとします。

program-id. MYMAIN.
 working-storage section.
  01  .
     05 myhandle         pic x(4).
     05 othervalue       pic x(4) value "6x3b".
 procedure division.
     call 'MYROUTINE'   using myhandle
     display "Othervalue is " othervalue.

また、次のサブプログラム Myroutine があります。

program-id. MYROUTINE.
  linkage section.
  01  myhandle            usage pointer.
  procedure division using myhandle.
      set myhandle        to null
      exit program.

上記のプログラムとサブプログラムは、32 ビットのシステム (ポインターの長さが 4 バイト) でコンパイルし実行すると問題なく動作しますが、64 ビットのシステム (ポインターの長さが 8 バイト) では、othervalue の値が壊れます。

コンパイラが、プログラム Mymain のコンパイル時に、呼び出し先のプログラム Myroutine の期待するデータ型にアクセスすれば、このような問題は、プログラムのコンパイル時に通知させることができます。 呼び出しプロトタイプは、呼び出し先のプログラムに関するこのような情報を提供し、コンパイラが、呼び出し元のプログラム、および呼ばれるサブプログラムのパラメーター間のセマンティクスの整合性を確認できるようにします。

呼び出しプロトタイプは、呼び出し先のプログラムのコードの縮小版と考えることもできます。 プロトタイプは、次の情報を含みます。

手続き部には、コードは必要ありません。

呼び出しプロトタイプの識別には、Program-ID 段落に IS EXTERNAL 句を使用します。

たとえば、上記の呼び出し元のプログラム (Mymain) を次のようにコーディングするとします。

  program-id. MYROUTINE is EXTERNAL.
  linkage section.
  01  myhandle            usage pointer.
  procedure division using myhandle.
  end program MYROUTINE.
  ******************************************************
  * Prototypes are usually defined in a copyfile, but  *
  * here it is placed in-line                          *
  ******************************************************

  program-id. MYMAIN.
  working-storage section.
  01  .
      05 myhandle         pic x(4).
      05 othervalue       pic x(4) value "6x3b".
  procedure division.
      call 'MYROUTINE'   using myhandle
      display "Othervalue is " othervalue.
  end program MYMAIN.

このプログラムをコンパイルすると、次の警告メッセージを受け取ります。

    14      call 'MYROUTINE'   using myhandle
*1059-E****************************************
**    パラメーターはプロトタイプで定義されたパラメーターと
      一致しません。

このようにプログラムをコーディングすると、ランタイムテストを行わずにプログラミングエラーを見つけることができます。

COBOL から呼び出し先のプログラムすべてにプロトタイプを作成することが理想的ですが、既存の COBOL コードが大量であること、および COBOL プログラマはプログラムの型チェックに慣れていないため、この方法は現実的ではありません。 プログラムが行うすべての呼び出しにプロトタイプを作成する努力を行ったとしても、厳密な型チェックを行うと、有効な COBOL 呼び出しについて大量のコンパイラエラーが発生すると考えられます。 このため、この COBOL システムは、緩やかな型チェックや USING 文に ANY キーワードを使用して、呼び出し先のプログラムをプロトタイプ化することができます。

呼び出しプロトタイプの詳しい使用例については、 このセクションの呼び出しプロトタイプ 言語リファレンス を参照してください。

COBOL システムのライブラリ ルーチンはプロトタイプ化されており、プログラムに定義されているデータ項目が、ライブラリ ルーチンで使用されるデータ項目と一致することを確認することができます。 これは、32 ビットのアプリケーションを 64 ビットのシステムに移行する際に、データ項目と型が正しいことを確実にしたい場合に、特に有用です。