DEFAULT オプションを使うと、属性のデフォルトを選択できます。PREFIX オプションの場合と同様に、DEFAULT のサブオプションは、PL/I 言語定義に 適合するように設定されます。デフォルトを変更すると、パフォーマンスに影響が及ぶ場合があります。デフォルトのサブオプションは次のとおりです。
IBM/ANS、ASSIGNABLE/NONASSIGNABLE、および DIRECTED/NODIRECTED サブオプションは、プログラムのパフォーマンスに影響しません。ただし、ほかのすべてのサブオプションは、多かれ少なかれパフォーマンス に影響を与えることがあり、不適切に適用された場合は、プログラムが無効 になることもあります。
DEFAULT(BYADDR) オプションが有効な場合は、入り口宣言の属性でほかのものが指定されていない限り、参照によって (PL/I の必要性に応じて) 引数が渡されます。参照によって引数が渡されると、変数そのものが渡されるときに、引数のアドレスが、あるルーチン (呼び出しルーチン) から別 のルーチン (呼び出されたルーチン) に渡されます。呼び出されたルーチン側に制御があるときに引数が変更されると、呼び出しルーチンの実行が再開されたときに呼び出しルーチンにそれが反映されます。
多くの場合、プログラム・ロジックは、参照によって渡される変数に応じて異なります。しかし、参照によって変数を渡すと、次の 2 つのパターンでパフォーマンスの低下が起きる場合があります。
したがって、プログラム・ロジック上で認められるときは いつでも、BYVALUE サブオプションを使い、値によってパラメーターを渡す必要があります。BYADDR 属性を使って、1 つのパラメーターが参照によって 渡されるように指示するときでも、DEFAULT(BYVALUE) オプションを使って、ほかのすべてのパラメーターが値によって渡されるように設定できます。
プロシージャーが BYADDR によって渡される 1 つのパラメーターだけを受け取り、それを変更する場合は、値によってそのパラメーターを受け取る関数 にプロシージャーを変換することを考慮してください。その関数は、パラメーターの更新値が含まれた RETURN ステートメントで終了します。
a: proc( parm1, parm2, ..., parmN );
dcl parm1 byaddr ...;
dcl parm2 byvalue ...;
.
.
.
dcl parmN byvalue ...;
/* program logic */
end;
a: proc( parm1, parm2, ..., parmN )
returns( ... /* attributes of parm1 */ );
dcl parm1 byvalue ...;
dcl parm2 byvalue ...;
.
.
.
dcl parmN byvalue ...;
/* program logic */
return( parm1 );
end;
DEFAULT(NONCONNECTED) オプションは、コンパイラーが 集合体パラメーターをすべて NONCONNECTED と想定していることを示します。NONCONNECTED 集合体パラメーターのエレメントに対する参照では、コンパイラーがパラメーターの記述子にアクセスするためのコードを生成する必要があります。これは、集合体が固定エクステントを使って宣言されている場合にも同様です。
集合体パラメーターに固定エクステントが指定 されており、CONNECTED が指定されている場合、コンパイラーはこれらの命令を生成しません。したがって、アプリケーションが NONCONNECTED パラメーターを渡さない 場合は、DEFAULT(CONNECTED) オプションを使うとコードがより最適化されます。
DEFAULT(RETURNS(BYVALUE)) オプションが有効なときには、BYADDR を 指定しないすべての RETURNS 記述リストに、BYVALUE 属性が適用されます。つまり、これらの関数は、最適なコードを生成するために、可能なときにはレジスターに値を戻します。
DEFAULT(DESCRIPTOR) オプションは、デフォルトでは、ストリング、領域、または集合体パラメーター用に記述子が渡されることを示します。ただし、記述子は、パラメーターに非固定エクステントが指定されている場合、またはパラメーターが NONCONNECTED 属性を持つ配列である場合にのみ、使用されます。
この場合は、記述子を渡すのに必要な命令とスペースは利益を与えず、かなりの負担になります (構造化記述子のサイズは、構造体そのもののサイズよりも大きいことが多いためです)。したがって、PROCEDURE ステートメントと ENTRY 宣言で 必要なときにだけ DEFAULT(NODESCRIPTOR) を指定し、OPTIONS(DESCRIPTOR) を使うと、コードの実行がより最適化されます。
DEFAULT(ORDER) オプションは、ORDER オプションが すべてのブロックに適用されることを示します。つまり、ON ユニットで参照されるそのブロック (または ON ユニットから 動的に降下するブロック) 内の変数に最新の値が適用されることを示します。これにより、そのような変数でのほとんどすべての最適化が実際上禁止されます。したがって、プログラム・ロジックによって認められる 場合は、DEFAULT(REORDER) を使って、上位コードを生成してください。
このサブオプションにより、コンパイラーには、OPTIONS 属性 の LINKAGE サブオプションまたは入り口のオプションが指定 されなかったときに使用するデフォルト・リンケージが通知されます。
コンパイラーは、それぞれが固有のパフォーマンス特性を 持つ各種のリンケージをサポートします。外部エンティティー (例えば、オペレーティング・システムなど) に よって提供された ENTRY を呼び出すときには、その ENTRY 用に事前に定義されたリンケージを使う必要があります。
ただし、独自のアプリケーションを作成するときには、リンケージ規則を選択できます。OPTLINK リンケージは、ほかのリンケージ規則よりも 大幅にパフォーマンスを向上させるので、これを選択することをお勧めします。
DEFAULT(ASCII) オプションは、デフォルトでは、文字データがネイティブの Intel スタイルで保持されることを示します。EBCDIC サブオプションを指定すると、コンパイラーは、文字変数の入出力を伴うほとんどの操作用に、追加の命令を生成する必要があります。
DEFAULT(IEEE) オプションは、デフォルトでは、浮動小数点データがネイティブの Intel スタイルで保持されることを示します。HEXADEC サブオプションを指定すると、浮動小数点変数が関わるほとんどの操作用に、コンパイラーが実行しなければならない命令が大幅に増えます。
DEFAULT(NATIVE) オプションは、デフォルトでは、固定バイナリー・データ、オフセット・データ、序数データ、および可変ストリングの長さ接頭部がネイティブの Intel スタイルで保持されることを示します。NONNATIVE を指定すると、これまでにリストされたデータ型が関わる操作用に、追加の命令が生成されます。