記憶域クラス

PL/I 記憶域クラスを理解することが重要です。それぞれに、メリットとデメリットがあります。

STATIC

静的ストレージは、(INITIAL 属性が適用される場合) コンパイル時に割り当ておよび初期化されます。大量の静的ストレージによって、実行ファイルのサイズが大きくなり、実行時のロード時間が長くなる可能性があります。静的ストレージを変更すると、プログラムの状態がオリジナルとは変わってしまい、以降の呼び出しにおいて結果が正しくなくなる可能性があります。

静的ストレージを変更した場合、プログラム実行開始前と同じ状態になっていることを確認してください。これは連続再利用可能状態として知られ、システム パフォーマンスの改善のためプログラムは通常 (リロードされていない) 記憶域に置かれるため、Enterprise Server (CICS、IMS、およびJCL バッチ) で動作するプログラムには特に重要です。通常、この記憶域クラスは、すべての「読み取り専用」記憶域に使用する必要があります。次の例を参照してください。

Dcl report_name char(132) static
init('Year to date Performance Report');

静的ストレージは、それを含む実行可能ファイルが物理的に削除された場合にのみ解放されます。オペレーティング システムによっては、論理的に削除された実行ファイルが最後に使用された状態で静的ストレージとともに再利用される場合があります。

AUTOMATIC

自動ストレージは、それが宣言されたブロック (PROCEDURE または BEGIN) へのエントリ後、(INITIAL 属性が適用される場合) 実行時に割り当ておよび初期化されます。この割り当てスキームは、すべての動的に割り当てされた記憶域の設定の中で最も効率的であり、コストはほぼゼロです。初期化は、対象変数への同等割り当てと同じです。ブロックへの次のエントリの後、この記憶域は再割り当ておよび再初期化されるため、そのような記憶域の変更はそのままになる場合があります。

自動ストレージは、ブロック終了時に自動的に解放されます。解放された記憶域 (全体または一部) は、既存または別のブロックの次の呼び出し時に自動ストレージの割り当てによって再利用されます。

この記憶域クラスは、すべての一時記憶域に使用する必要があります。この記憶域クラスは本質的に、再エントリ コードに適しています。

BASED

ベース ストレージは、(INITIAL 属性が適用される場合) 実行時に ALLOCATE 文を使用して割り当ておよび初期化され、プログラマによって完全に制御されます。ALLOCATE 文は、呼び出しを介してヒープ上の記憶域をライブラリ ルーチンに割り当て、初期化値の割り当てを効果的に生成します。割り当てスキームはコストが高いですが、記憶域を割り当てるタイミングとそれが解放されるまでの時間をプログラマが完全に制御できます。この記憶域は通常、プログラム ロジックが保証している場合に存在する必要がある、またはサイズが大きいまたは可変のオブジェクトの割り当てに適しています。そのような記憶域の変更は、そのままになる場合があります。

ベース ストレージは、FREE 文を使用して解放され、ロケーター変数 (通常 POINTER ですが、OFFSET の場合もあります) に保持されるアドレスによって管理されます。各割り当てのユニーク ロケーターを使用して複数回割り当てられる可能性があります。記憶域は、ユニーク ロケーターが使用されている限り命令なしで割り当てまたは解放される場合があります。この記憶域クラスは、動的に拡大および縮小するデータのリストの維持に使用されます。

この記憶域クラスは、記憶域の存在と寿命が実行中のアプリケーション処理に依存する場合に使用する必要があります。また、この記憶域クラスは本質的に、再エントリ コードに適しています。

注: ベース ストレージは、ADDR または ADDRDATA BUILTIN を使用して他のオブジェクトのアドレスにロケーターを設定することで割り当てることも可能です。このメカニズムが使用される場合、記憶域は ALLOCATE されないため FREE されることはありません。
制御

制御ストレージは、ベース ストレージに似ています。それは、ALLOCATE 文で割り当てられ、FREE 文を使用して解放されますが、以下に示す通り重要な違いがあります。

  • あなたがロケーターを管理することはありません。代わりに PL/I がロケーターを管理します。
  • ALLOCATE 文は、新しい世代を割り当てる前に現在の世代 (もしあれば) を「プッシュダウン」します。
  • FREE 文は、現在の世代を解放し、以前の世代 (もしあれば) を「ポップアップ」します。
  • 変数へのアクセスでは、常に現在の世代にアクセスします。現在の世代のみ表示されます。プッシュされた世代はすべて非表示になります。
  • この割り当てスキームはベースよりもコストが高いですが、有効に活用できる可能性があります。

この記憶域クラスは、最後に割り当てられた世代を最初に解放するプッシュダウン スタックとして管理する必要があるすべての記憶域に使用する必要があります。また、この記憶域クラスは本質的に、再エントリ コードに適しています。

パラメーター
完全を期すためのパラメーター 記憶域は、パラメーターを含む手順の呼び出しにおいて対応する引数にパラメーターをマッピングする方法にすぎません。