Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.9, 言語解説書

外部プロシージャーの動的ロード

モジュールは、FETCH および RELEASE ステートメントを使用して PL/I プログラムによって動的に取り出されたり、(ロードされたり)、解放されたり (削除されたり) します。

プロシージャー参照によって呼び出されたプロシージャーは、通常、プログラムの実行中ずっと主記憶域に常駐します。 ただし、必要とされるときにのみ、 プロシージャーを主記憶域にロードしておくこともできます。 つまり、呼び出しプロシージャーの実行中に、呼び出されたプロシージャーを 主記憶域に動的にロードし、あとで主記憶域から動的に削除します。

プロシージャーの動的ロードと動的削除が特に効果的なのは、呼び出しプロシージャーが実行されるつど、呼び出されたプロシージャーが必ず呼び出されるとは限らないときや、実行時間の短縮よりも主記憶域の節減のほうが重要であるときです。

FETCH ステートメントで入り口定数を指定すると、その入り口定数を含んでいる プロシージャーのコピーがすでに主記憶域に存在しているのでない限り、 そのプロシージャーをまず主記憶域にロードしなければ実行できないことを表します。 FETCH ステートメントで名前が参照されれば、 以下によってディスクからプロシージャーをロードすることも可能です。

CALL または関数参照の実行前にも実行後にも、FETCH ステートメントまたは RELEASE ステートメントに制御を渡す必要はありません。

どちらのステートメントがプロシージャーをロードした場合も、CALL ステートメント、CALL オプション、または関数参照が実行されると、普通の方法でプロシージャーが呼び出されます。

プロシージャーがすでに主記憶域にロードされていても、 エラーにはなりません。 取り出されたプロシージャーは、プログラム全体の実行が完了するまで 主記憶域に残しておくことができます。 RELEASE ステートメントを使用すれば、そのプロシージャーが占有していたストレージをいつでも解放することができ、別の目的で使用することができます。

規則と機能

FETCH と RELEASE は以下の規則と機能を備えています。

FETCH ステートメント

FETCH ステートメントは、指定されたプロシージャーが主記憶域に存在しているかを調べます。 主記憶域内に存在していないプロシージャーは、ディスクからロードされます。

構文図を読む構文図をスキップする>>-FETCH-------------------------------------------------------->
 
   .-,----------------------------------------------------------.
   V                                                            |
>----entry-constant-+-----------------+-+---------------------+-+-->
                    '-SET-(-ptr-ref-)-' '-TITLE-(-char-expr-)-'
 
>--;-----------------------------------------------------------><
 
entry-constant
取り出されるプロシージャーの名前で、オペレーティング・システムに 知られているものを指定します。 取り出し可能なプロシージャーに関連する考慮事項の詳細については、 「プログラミング・ガイド」を参照してください。

entry-constant (入り口定数) は、対応する CALL ステートメント、 CALL オプション、または関数参照内で使用する入り口定数と同じでなければなりません。

SET
ロードしたモジュールのエントリー・ポイントのアドレスにセットされるポインター参照 (ptr-ref) を指定します。 このオプションは、テーブル (実行できないロード・モジュール) を ロードするために使用することができます。 また、非 PL/I プロシージャーへ渡さなければならないアドレスを持つ、 取り出された項目に対しても使用することができます。

ロード・モジュールを後に RELEASE ステートメントによって解放して、さらにそのロード・モジュールに (ポインターを使用して) アクセスすると、予期しない結果が生じます。

TITLE
TITLE の場合、char-expr は任意の文字式、または文字式に変換可能な任意の式です。 TITLE が指定されると、指定されたロード・モジュール名が探索され、ロードされます。 指定されていない場合には、使用されるロード・モジュール名は、(表示されて いれば) 変数の EXTERNAL 属性で指定された環境名、または入り口定数名自体になります。

以下に例を示します。

  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 ステートメント

RELEASE ステートメントは、指定した entry constant (入り口定数) が識別する プロシージャーによって占められた主記憶域を解放します。

構文図を読む構文図をスキップする              .-,--------------.
              V                |
>>-RELEASE--+---entry-constant-+-+--;--------------------------><
            '-*------------------'
 
entry constant
対応する CALL ステートメント、CALL オプション、関数参照、 および FETCH ステートメントに使用する入り口定数と同じでなければなりません。 RELEASE * は、それ以前にフェッチされた すべての PL/I モジュールを解放します。 RELEASE ステートメントは、フェッチされた モジュール内部から実行してはなりません。

以下の例を考えてください。ProgAProgB は、 ディスクに常駐しているプロシージャーの入り口名です。

         Prog:  procedure;
 
 1          fetch ProgA;
 2          call ProgA;
 3          release ProgA;
 
 4          call ProgB;
            go to Fin;
 
            fetch ProgB;
         Fin:  end Prog;

 1 
ProgA は、最初の FETCH ステートメントによって主記憶域にロードされます。
 2 
ProgA は、最初の CALL ステートメントに達したときに実行されます。
 3 
ProgA のストレージは、RELEASE ステートメントが実行されると解放されます。
 4 
ProgB は、このプロシージャーを参照する FETCH ステートメントが 実行されなくても、2 番目の CALL ステートメントに達すると、ロードされ、 実行されます。

FETCH ProgA ステートメントが省略された場合でも同じ結果になります。 RELEASE ステートメント内に ProgA を指定すると、 それを呼び出したときと同様に、CALL ProgA ステートメントが プロシージャーをロードします。

取り出されたプロシージャーは、 呼び出しプロシージャーとは別々にコンパイルされ、リンクされます。 FETCH ステートメント、RELEASE ステートメント、CALL ステートメント、 CALL オプション、および関数参照で指定される入り口定数は、ディスク上で 認識される名前でなければなりません。 これは「プログラミング・ガイド」に説明されています。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)