モジュールは、FETCH および RELEASE ステートメントを使用して PL/I プログラムによって動的に取り出されたり、(ロードされたり)、解放されたり (削除されたり) します。
プロシージャー参照によって呼び出されたプロシージャーは、通常、プログラムの実行中ずっと主記憶域に常駐します。 ただし、必要とされるときにのみ、 プロシージャーを主記憶域にロードしておくこともできます。 つまり、呼び出しプロシージャーの実行中に、呼び出されたプロシージャーを 主記憶域に動的にロードし、あとで主記憶域から動的に削除します。
プロシージャーの動的ロードと動的削除が特に効果的なのは、呼び出しプロシージャーが実行されるつど、呼び出されたプロシージャーが必ず呼び出されるとは限らないときや、実行時間の短縮よりも主記憶域の節減のほうが重要であるときです。
FETCH ステートメントで入り口定数を指定すると、その入り口定数を含んでいる プロシージャーのコピーがすでに主記憶域に存在しているのでない限り、 そのプロシージャーをまず主記憶域にロードしなければ実行できないことを表します。 FETCH ステートメントで名前が参照されれば、 以下によってディスクからプロシージャーをロードすることも可能です。
CALL または関数参照の実行前にも実行後にも、FETCH ステートメントまたは RELEASE ステートメントに制御を渡す必要はありません。
どちらのステートメントがプロシージャーをロードした場合も、CALL ステートメント、CALL オプション、または関数参照が実行されると、普通の方法でプロシージャーが呼び出されます。
プロシージャーがすでに主記憶域にロードされていても、 エラーにはなりません。 取り出されたプロシージャーは、プログラム全体の実行が完了するまで 主記憶域に残しておくことができます。 RELEASE ステートメントを使用すれば、そのプロシージャーが占有していたストレージをいつでも解放することができ、別の目的で使用することができます。
FETCH と RELEASE は以下の規則と機能を備えています。
FETCH ステートメントは、指定されたプロシージャーが主記憶域に存在しているかを調べます。 主記憶域内に存在していないプロシージャーは、ディスクからロードされます。
entry-constant (入り口定数) は、対応する CALL ステートメント、 CALL オプション、または関数参照内で使用する入り口定数と同じでなければなりません。
ロード・モジュールを後に RELEASE ステートメントによって解放して、さらにそのロード・モジュールに (ポインターを使用して) アクセスすると、予期しない結果が生じます。
以下に例を示します。
dcl A entry;
dcl B entry ext('C');
dcl T char(20) varying;
T = 'Y';
fetch A title('X'); /* X is loaded */
fetch A; /* A is loaded */
fetch B title('Y'); /* Y is loaded */
fetch B; /* C is loaded */
fetch B title(T); /* Y is loaded */
タイトル・ストリングの詳細については、「プログラミング・ガイド」を参照してください。
RELEASE ステートメントは、指定した entry constant (入り口定数) が識別する プロシージャーによって占められた主記憶域を解放します。
|
以下の例を考えてください。ProgA と ProgB は、 ディスクに常駐しているプロシージャーの入り口名です。
Prog: procedure; 1 fetch ProgA; 2 call ProgA; 3 release ProgA; 4 call ProgB; go to Fin; fetch ProgB; Fin: end Prog;
FETCH ProgA ステートメントが省略された場合でも同じ結果になります。 RELEASE ステートメント内に ProgA を指定すると、 それを呼び出したときと同様に、CALL ProgA ステートメントが プロシージャーをロードします。
取り出されたプロシージャーは、 呼び出しプロシージャーとは別々にコンパイルされ、リンクされます。 FETCH ステートメント、RELEASE ステートメント、CALL ステートメント、 CALL オプション、および関数参照で指定される入り口定数は、ディスク上で 認識される名前でなければなりません。 これは「プログラミング・ガイド」に説明されています。