呼び出しプロトタイプ

呼び出しプロトタイプは、比較的新しい 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 ビットのシステムに移行する際に、データ項目と型が正しいことを確実にしたい場合に、特に有用です。