RULES サブオプションのほとんどは、特定のコーディング方法 (変数を宣言 しないことなど) にフラグを立てる基準となる重大度だけに影響し、 パフォーマンスには影響しません。 ただし、次のサブオプションはパフォーマンスに影響します。
RULES(IBM) オプションを使うと、コンパイラーはスケールされた FIXED BINARY をサポートします。 パフォーマンスについてより重大なことは、 いくつかの操作により、コンパイラーは、スケールされた FIXED BINARY の結果を生成します。RULES(ANS) を指定すると、スケールされた FIXED BINARY はサポートされず、 スケールされた FIXED BINARY の結果は生成されません。 つまり、RULES(ANS) を指定して生成されたコードは、 常に RULES(IBM) を指定して生成されたコードと少なくとも同じ速さで実行され、 場合によっては実行速度が速くなります。
例えば、次のような部分コードがあるとします。
dcl (i,j,k) fixed bin(15); . . . i = j / k;
RULES(IBM) を指定した場合は、割り算の結果に属性 FIXED BIN(31,16) が含まれます。 つまり、割り算の前にはシフト命令が必要で、 割り当てを実行するためにさらにいくつかの命令が必要になります。
RULES(ANS) のもとでは、割り算の結果は属性 FIXED BIN(15,0) を持ちます。 つまり、割り算の前にシフトは必要なく、割り当てを実行するために追加の命令は必要ありません。
RULES(LAXCTL) のもとでは、CONTROLLED 変数を固定エクステントによって 宣言しても、異なるエクステントに割り振ることができます。
例えば、RULES(LAXCTL) を指定すると、次のような構造体を宣言できます。
dcl
1 a controlled,
2 b char(17),
2 c char(29);
しかし、その後でこの構造体を次のように割り振ることが可能です。
allocate
1 a,
2 b char(170),
2 c char(290);
このことは、パフォーマンスに非常に悪い結果をもたらします。 その原因は、コンパイラーが構造体 A への参照やその 構造体のメンバーへの参照を見つけたときに、構造体内のフィールドの長さ、 次元、またはオフセットに関して何の情報もないと 想定しなければならないからです。
一方、RULES(NOLAXCTL) オプションはこのようなコーディング方法を 禁止します。RULES(NOLAXCTL) を指定した場合に、CONTROLLED 変数を 可変エクステントに割り振るには、そのエクステントを アスタリスクまたは非定数式によって宣言する必要があります。 したがって、RULES(NOLAXCTL) を指定し、固定エクステントを 使用して CONTROLLED 変数を宣言すれば、コンパイラーは その変数を参照するためのコードをはるかに適切に生成できます。