Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

DEFAULT

DEFAULT オプションを使うと、属性のデフォルトを選択できます。 PREFIX オプションの場合と同様に、DEFAULT のサブオプションは、PL/I 言語定義に 適合するように設定されます。 デフォルトを変更すると、パフォーマンスに影響が及ぶ場合があります。

IBM/ANS および ASSIGNABLE/NONASSIGNABLE など、サブオプションのいくつかは プログラムのパフォーマンスに影響しません。 ただし、ほかのすべてのサブオプションは、多かれ少なかれパフォーマンス に影響を与えることがあり、不適切に適用された場合は、プログラムが無効 になることもあります。 これらのサブオプションの中でも重要なものを次に説明します。

BYADDR または BYVALUE

DEFAULT(BYADDR) オプションが有効な場合は、 入り口宣言の属性でほかのものが指定されていない限り、 参照によって (PL/I の必要性に応じて) 引数が渡されます。 参照によって引数が渡されると、変数そのものが渡されるときに、 引数のアドレスが、あるルーチン (呼び出しルーチン) から別 のルーチン (呼び出されたルーチン) に渡されます。 呼び出されたルーチン側に制御があるときに引数が変更されると、 呼び出しルーチンの実行が再開されたときに呼び出しルーチンにそれが反映されます。

多くの場合、プログラム・ロジックは、参照によって渡される変数に応じて異なります。 しかし、参照によって変数を渡すと、 次の 2 つのようなパフォーマンスの低下が起きる場合があります。

  1. そのパラメーターに対するすべての参照に、追加の命令が必要になる。
  2. 変数のアドレスが別のルーチンに渡されると、 コンパイラーは、その変数が変更されるときを想定して、 その変数の参照用のコードとして非常に保守的なコードを生成することを強制される。

したがって、プログラム・ロジック上で認められるときは いつでも、BYVALUE サブオプションを使い、 値によってパラメーターを渡す必要があります。 BYADDR 属性を使って、1 つのパラメーターが参照によって 渡されるように指示するときでも、DEFAULT(BYVALUE) オプションを使って、 ほかのすべてのパラメーターが値によって渡されるように設定できます。

プロシージャーが BYADDR によって渡される 1 つのパラメーターだけを受け取り、 それを変更する場合は、値によってそのパラメーターを受け取る関数 にプロシージャーを変換することを考慮してください。 その関数は、パラメーターの更新値が含まれた RETURN ステートメントで終了します。

BYADDR パラメーターが指定されたプロシージャー
a: proc( parm1, parm2, ..., parmN );

  dcl parm1 byaddr  ...;
  dcl parm2 byvalue ...;
   .
   .
   .
  dcl parmN byvalue ...;

  /* program logic */

end;
BYVALUE パラメーターが指定された、より高速の同等な関数
a: proc( parm1, parm2, ..., parmN )
   returns( ... /* attributes of parm1 */ );

  dcl parm1 byvalue  ...;
  dcl parm2 byvalue ...;
   .
   .
   .
  dcl parmN byvalue ...;

  /* program logic */

  return( parm1 );

end;

(NON)CONNECTED

DEFAULT(NONCONNECTED) オプションは、コンパイラーが 集合体パラメーターをすべて NONCONNECTED と想定していることを示します。NONCONNECTED 集合体パラメーターのエレメントに対する参照では、 コンパイラーがパラメーターの記述子にアクセスするためのコードを生成する必要があります。 これは、集合体が固定エクステントを使って宣言されている場合にも同様です。

集合体パラメーターに固定エクステントが指定 されており、CONNECTED が指定されている場合、コンパイラーはこれらの命令を生成しません。 したがって、アプリケーションが NONCONNECTED パラメーターを渡さない 場合は、DEFAULT(CONNECTED) オプションを使うとコードがより最適化されます。

(NO)DESCRIPTOR

DEFAULT(DESCRIPTOR) オプションは、デフォルトでは、 ストリング、領域、または集合体パラメーター用に記述子が渡されることを示します。 しかし、記述子は、パラメーターに非固定エクステントが指定されている場合、 またはパラメーターが NONCONNECTED 属性を持つ配列である場合にだけ、使われます。 この場合は、記述子を渡すのに必要な命令とスペースは利益を与えず、 かなりの負担になります (構造化記述子のサイズは、 構造体そのもののサイズよりも大きいことが多いためです)。 したがって、PROCEDURE ステートメントと ENTRY 宣言で 必要なときにだけ DEFAULT(NODESCRIPTOR) を指定し、OPTIONS(DESCRIPTOR) を使うと、 コードの実行がより最適化されます。

(NO)INLINE

サブオプション NOINLINE は、 プロシージャーと開始ブロックがインライン化されないように指示します。

インライン化は、最適化を指定するときにだけ発生します。

ユーザー・コードをインライン化すると、関数呼び出しとリンケージのオーバーヘッドが除去され、 関数のコードが最適化プログラムに公開されて、結果としてコード・パフォーマンスが向上します。インライン化は、関数のオーバーヘッドが無視できるようなものではないとき、 例えば、関数がネストされたループ内で呼び出されるときなどに、最高の結果をもたらします。 また、インライン化は、インライン化された関数によってさらに最適化の機会が与えられるとき、 例えば、定数引数が使われるときなどにも、有益です。

ネストされていない多くのプロシージャーが含まれたプログラムの場合は、次のようになります。

インライン化を使う場合は、スタック・スペースを拡大する必要があります。 関数が呼び出されると、そのローカル・ストレージが呼び出し時に割り振られ、 呼び出し関数に戻るときに解放されます。 その関数がインライン化されると、そのストレージは、それを呼び出す関数に入ったときに 割り振られ、呼び出し関数が終了するまで解放されません。 インライン化した関数のローカル・ストレージ用に、 十分なスタック・スペースがあることを確認してください。

LINKAGE

このサブオプションにより、コンパイラーには、OPTIONS 属性 の LINKAGE サブオプションまたは入り口のオプションが指定 されなかったときに使用するデフォルト・リンケージが通知されます。

コンパイラーは、それぞれが固有のパフォーマンス特性を 持つ各種のリンケージをサポートします。 外部エンティティー (例えば、オペレーティング・システムなど) に よって提供された ENTRY を呼び出すときには、 その ENTRY 用に事前に定義されたリンケージを使う必要があります。

ただし、独自のアプリケーションを作成するときには、リンケージ規則を選択できます。 OPTLINK リンケージは、ほかのリンケージ規則よりも 大幅にパフォーマンスを向上させるので、これを選択することをお勧めします。

(RE)ORDER

DEFAULT(ORDER) オプションは、ORDER オプションが すべてのブロックに適用されることを示します。 つまり、ON ユニットで参照されるそのブロック (または ON ユニットから 動的に派生するブロック) 内の変数に最新の値が適用されることを示します。 これにより、そのような変数でのほとんどすべての最適化が実際上禁止されます。 したがって、プログラム・ロジックによって認められる 場合は、DEFAULT(REORDER) を使って、上位コードを生成してください。

NOOVERLAP

DEFAULT(NOOVERALP) オプションを指定すると、コンパイラーは 割り当て時にソースとターゲットがオーバーラップしていないと想定するため、 より小さく速いコードを生成することができます。

しかし、このオプションを使用する場合は、 割り当て時にソースとターゲットがオーバーラップしていないことを確認してください。 例えば、 DEFAULT( NOOVERLAP ) オプションの下では、この例での割り当ては 無効になります。

  dcl c char(20);
  substr(c,2,5) = substr(c,1,5);

RETURNS(BYVALUE) または RETURNS(BYADDR)

DEFAULT(RETURNS(BYVALUE)) オプションが有効なときには、BYADDR を 指定しないすべての RETURNS 記述リストに、BYVALUE 属性が適用されます。 つまり、これらの関数は、最適なコードを生成するために、 可能なときにはレジスターに値を戻します。


Terms of use | Feedback

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