以下の説明は、個別にコンパイルされたサブプログラムにだけ適用されます。 ネストされたプログラムには適用されません。 ネストされたプログラム構造内での呼び出しの詳細については ネストされたプログラムの呼び出しを参照してください。
ILE COBOL プログラムで静的プロシージャー呼び出しを使用したか、 動的プログラム呼び出しを使用したかにより、バインディングの処理方法は異なります。 静的プロシージャー呼び出しを使用して ILE COBOL サブプログラムを呼び出した場合、 まずコンパイルしてモジュール・オブジェクトにしてから、 コピーまたは参照によって、呼び出し ILE COBOL プログラムと同じプログラム・オブジェクトにバインドします。 動的プログラム呼び出しを使用して ILE COBOL サブプログラムを呼び出す場合、ILE COBOL サブプログラムは別個のプログラム・オブジェクトとしてコンパイルおよびバインドする必要があります。 バインディング・プロセスの詳細については、「ILE 概念」を参照してください。
静的プロシージャー呼び出しを使うと、動的プログラム呼び出しを使う場合よりパフォーマンスが向上します。
静的プロシージャー呼び出しを使って、ILE COBOL サブプログラムを呼び出す場合、そのサブプログラムはすでに活動化されています。 それは、呼び出し側プログラムと同じプログラム・オブジェクトとしてバインドされており、 呼び出し側 ILE COBOL プログラムから制御を受け取ってすぐに実行されるからです。
動的プログラム呼び出しを使用して ILE COBOL サブプログラムを呼び出す場合、それ以外の多くのことを実行してからでないと、 呼び出し先 ILE COBOL プログラムを実行することができない場合があります。 それには、以下のことが含まれます。
したがって、動的プログラム呼び出しは、最初に活動化グループで実行する前にまず活動化しなければならないので、 静的プロシージャー呼び出しよりも遅くなります。
さらに、動的プログラム呼び出しと静的プロシージャー呼び出しでは、 呼び出し側 ILE COBOL プログラムから呼び出し先 ILE COBOL プログラムに渡せるオペランドの数も異なります。 動的プログラム呼び出しを使用する場合、最高 255 個のオペランドを渡すことができます。 静的プロシージャー呼び出しを使用する場合、最高 400 個のオペランドを渡すことができます。
OMITTED として指定された引き数または操作記述子と関連していると指定された引き数は、 静的プロシージャー呼び出しを使用することによってしか渡すことができません。 それらの引き数は、動的プログラム呼び出しを使用して渡すことはできません。
CALL リテラル のステートメントを使用して、 静的プロシージャー呼び出しを実行することができます (リテラル はサブプログラムの名前)。 呼び出しを静的プロシージャー呼び出しとして指定するには、 次の 3 とおりの方法があります。 優先度の高いもの順になっています。
PROCEDURE DIVISION.
·
·
·
CALL LINKAGE TYPE IS PROCEDURE literal-1
ENVIRONMENT DIVISION. CONFIGURATION SECTION.
·
·
·
SPECIAL-NAMES. LINKAGE TYPE IS PROCEDURE FOR literal-1.
·
·
·
PROCEDURE DIVISION.
·
·
·
CALL literal-1.
CRTCBLMOD MODULE(MYLIB/XMPLE1) SRCFILE(MYLIB/QCBLLESRC) SRCMBR(XMPLE1) LINKLIT(*PRC)
PROCEDURE DIVISION.
·
·
·
CALL literal-1.
CALL リテラル のステートメント (リテラル はサブプログラムの名前) または CALL id のステートメントを使用して動的プログラム呼び出しを実行することができます。 CALL id の詳細については CALL id の使用を参照してください。 CALL リテラル を使って、呼び出しを動的プログラム呼び出しとして指定するには、 次の 3 とおりの方法があります。 優先度の高いもの順になっています。
PROCEDURE DIVISION.
·
·
·
CALL LINKAGE TYPE IS PROGRAM literal-1
ENVIRONMENT DIVISION. CONFIGURATION SECTION.
·
·
·
SPECIAL-NAMES. LINKAGE TYPE IS PROGRAM FOR literal-1.
·
·
·
PROCEDURE DIVISION.
·
·
·
CALL literal-1.
CRTCBLMOD MODULE(MYLIB/XMPLE1) SRCFILE(MYLIB/QCBLLESRC) SRCMBR(XMPLE1) LINKLIT(*PGM)
PROCEDURE DIVISION.
·
·
·
CALL literal-1.
動的プログラム呼び出しは、サブプログラムを実行時に活動化します。 次の場合には、動的呼び出しステートメントを使用してください。
サブプログラムの変更時には、静的に呼び出され、 コピーを使ってバインドされているすべてのモジュール・オブジェクト (サービス・プログラムを除く) を、再度バインドしなければなりません。 参照によってバインドされている場合は、 サブプログラムとモジュール・オブジェクト間のインターフェースが変更されていなければ、 再度バインドする必要はありません。 変更されたサブプログラムが動的に呼び出される場合、 再バインドの必要があるのはその変更されたサブプログラムだけです。 したがって、動的呼び出しを使用すると、バインディングの量を最小にすることができるので、サブプログラムのコピーが保守しやすくなります。
いくつかの条件においてのみサブプログラムが呼び出される場合、 動的呼び出しによって必要な時だけサブプログラムを活動化することができます。
サブプログラムが大規模かまたは数が多い場合、 静的呼び出しを使うと、主記憶域で必要な作業セットのサイズが大きくなってしまう可能性があります。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.