呼び出しのプログラム名の解析

プログラム名は、CALL 命令の演算項目 2 またはプロトタイプの EXTPGM キーワ ードのパラメーターとして指定します。ライブラリー名を指定する場合には、直後に スラッシュを付けてプログラム名を 続けなければなりません (例えば、'LIB/PROG')。 ライブラリーを指定しない場合には、プログラムを見付けるためにライブラリ ー・リストが使用されます。*CURLIB はサポートされません。

次の規則に注意してください。

プログラム名は、リテラル、フィールド、名前のついた定数、または配列 要素に指定されたとおりに正確に使用する、呼び出すプログラムが判別 されます。 特に、次のことに注意してください。

プログラム参照は、目的プログラムへの分析解決のオーバーヘッドを避けるた めに、グループ化されます。 名前のついた定数またはリテラルを使用する特定のプログラムに対する参 照は、すべてそのプログラムが 1 回だけ分析解決されて、 そのプログラムに対する (名前のついた定数またはリテラルのみによる) 以後のすべての参照で分析解決が行われないようにグループ化されます。

プログラム参照は、 プログラムとライブラリー名の両方が同じ場合には、グループ化されます。 変数名によるプログラム参照はすべて変数名によってグループ化されます。 プログラム参照が変数で行われる場合には、その現在の値がその変数を使用 した前のプログラム参照で使用された値と比較されます。 値が変わっていない 場合には、分析解決は行われません。値が変わっている場合には、指定された新しいプログラムに対して分析解決が 行われます。 この規則が適用されるのは、変数名を使用する参照だけであることに注意して ください。 名前のついた定数またはリテラルを使用する参照は分析解決されず、変数 によるプログラム参照が再分析解決されるかどうかに影響を与えません。 図 155 に、プログラム参照のグループ化を示します。

プログラム CALL の例

図 155. プログラム参照のグループ化の例
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D Pgm_Ex_A        C                   'LIB1/PGM1'
D Pgm_Ex_B        C                   'PGM1'
D PGM_Ex_C        C                   'LIB/PGM2'
 *
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
C                   CALL      Pgm_Ex_A
 *
 * The following two calls will be grouped together because both
 * have the same program name (PGM1) and the same library name
 * (none). Note that these will not be grouped with the call using
 * Pgm_Ex_A above because Pgm_Ex_A has a different library
 * name specified (LIB1).
 *
C                   CALL      'PGM1'
C                   CALL      Pgm_Ex_B
 *
 * The following two program references will be grouped together
 * because both have the same program name (PGM2) and the same
 * library name (LIB).
 *
C                   CALL      'LIB/PGM2'
C                   CALL      Pgm_Ex_C
 *
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * The first call in the program using CALLV below will result in
 * a resolve being done for the variable CALLV to the program PGM1.
 * This is independent of any calls by a literal or named constant
 * to PGM1 that may have already been done in the program.  The
 * second call using CALLV will not result in a resolve to PGM1
 * because the value of CALLV has not changed.
 *
C                   MOVE     'PGM1'         CALLV         21
C                   CALL     CALLV
C                   CALL     CALLV