呼び出しプロトタイプ

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

プロトタイプは、期待通りに機能するマルチプログラム アプリケーションを作成するのに役立ちます。CALL 文の構文の詳細については、「COBOL 言語リファレンス」を参照してください。

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 ビット システムでコンパイルして実行した場合は期待通りに機能しますが、64 ビット システムでは othervalue の値が破損します。これは、ポインターの長さが前者では 4 バイトであるのに対し、後者では 8 バイトであるためです。

プログラム Mymain のコンパイル時に、コンパイラが呼び出し先のプログラム Myroutine が想定するデータ型にアクセスすれば、プログラムのコンパイル時にこのような問題を通知できます。呼び出しプロトタイプを使用すると、呼び出し先のサブプログラムの情報をコンパイラに渡し、プログラムとサブプログラム間のパラメーターの整合性をチェックさせることができます。

呼び出しプロトタイプは、呼び出し先のプログラムのコードの簡略版またはモデルと見なされます。プロトタイプには以下の情報が含まれます。

手続き部のコードは不要です。

呼び出しプロトタイプを識別するには、プログラム名段落で 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 copybook, 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****************************************
**    Parameter is not consistent with that defined
      in prototype

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

理想的には、COBOL から呼び出すすべてのプログラムはプロトタイプ化されるべきですが、これは現実的ではありません。なぜなら、COBOL コードの本体がすでにかなりあり、COBOL プログラマーはプログラムの型チェックに慣れていないためです。たとえプログラムのすべての呼び出しをプロトタイプ化したとしても、厳密な型チェックを行うと、有効な COBOL 呼び出しに対して膨大なコンパイラ エラーが生成されることが予想されます。このため、この COBOL システムでは、緩やかな型チェックまたは USING 文での ANY キーワードの使用 (あるいはその両方) により、呼び出し先のプログラムをプロトタイプ化できます。

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

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