このメッセージは、options リストの作成に使用される。
このメッセージが発行されたステートメントの次のステートメントが、 そのステートメントとマージされた。
このメッセージが発行されたステートメントの後に続く、指定された数のステートメントが、 そのステートメントとマージされた。
このメッセージは、バックエンド通知メッセージを報告 するために使用される。
組み込み関数 SYSPRINT および SYSIN のコンテキスト宣言の場合を 除き、すべての変数を宣言する必要がある。
このメッセージは、%NOTE ステートメントで 戻りコード 0 と共に使用される。
コメントが開始行とは別の行で終わっている。 これは、コメント終了を表す区切り文字が欠落している可能性を示す。
ストリングが開始行とは別の行で終わっている。 これは、右引用符が欠落している可能性を示す。
示されている変数には宣言ステートメントがないが、 その使用法に基づいて、示されている属性が与えられた。 例えば、変数がロケーターとして使用されていると、POINTER 属性が与えられることになる。
OS/370 PL/I および PL/I for MVS コンパイラーでは、これは 2 バイトにマップされる。
REFER オブジェクトに他の属性がある場合は、 ライブラリー・コールにより、REAL FIXED BIN(31,0) に、 または REAL FIXED BIN(31,0) から変換される。
OS/370 PL/I および PL/I for MVS コンパイラーでは、配列に適用された UNSPEC はスカラーの配列として取り扱われる。
ORDER オプションをブロックに適用した場合は、最適化が 禁止される可能性がある。特に、ON ユニットの外部で宣言された 変数を参照する ON ユニットがブロックに含まれている場合は、 最適化は禁止される可能性が高い。
GET DATA ステートメントは、ほとんどすべての変数を 変更する可能性があり、PUT DATA ステートメントでは、 PUT DATA ステートメントの実行時点でほとんどの変数はホームに保管され ている必要がある。 どちらの要件の場合も最適化が禁止される。
属性 RESERVED STATIC を持つ変数に、INITIAL 属性が 指定されている。 このような変数は、PACKAGE ステートメントの EXPORTS 文節に 指定されていない限り、初期化されない。
このメッセージは ADDR、CURRENTSTORAGE/SIZE、 および STORAGE/SIZE 組み込み関数に適用される。これらの組み込み関数のいずれかを、位置合わせされていない ビット変数に適用すると、予想どおりの結果が生成されないことが ある。
* エクステントを持っているストリング、 または * エクステントを持っている配列が渡された場合、PL/I では、通常、 記述子を渡すことによって、渡された引数の実際のサイズを 呼び出されたルーチンが認識できるようにする。 NODESCRIPTOR 属性は、記述子が渡されないことを示す。 呼び出されるルーチンが PL/I プロシージャーである場合は、この属性は無効である。
dcl x entry( char(*), fixed bin(31) ) options( nodescriptor );
組み込み関数 ADD、DIVIDE、MULTIPLY、 または SUBTRACT の 1 つが、FIXED 型の引数で 呼び出された場合、どちらかのオペランドのスケール因数 がゼロ以外のときは、結果の型は FIXED DEC になる。
このメッセージは、ループの一部として実行すると非常に コストが高くなる可能性があるコードを見つけたり、異種の型の 変換を含むコードを見つけるために役立つ。
条件が満たされる WHEN 文節がまったくない場合は、 ERROR 条件が発生する。
意外なことに、PL/I 言語規則ではこれが必 要である。 例えば、次の部分コードでは、display ステートメントに より x.y の値が表示される。
a: proc; dcl y fixed bin init(3); call b; b: proc; dcl 1 x, 2 y fixed bin init(5), 2 z fixed bin init(7); display( y ); end; end a;
定数 365、1900、または ’19’ のいずれかを使用すると、日付の計算を示すことがある。 これに該当する場合は、計算を調べて 1999 年が過ぎたあとも有効か どうかを判別する必要がある。
例えば変数に DATE 組み込み関数が割り当てられていたために、 指示された変数には、2 桁の年が含まれているものと推測される。
DO ループ内の制御変数が 1 バイトの整数、2 バイトの整数、固定 10 進数、または固定ピクチャーであるため、 このループ用に生成されたコードは最適ではない。
OPT(2) のもとでは、TEST(BLOCK) より強くフックする TEST 指定はサポートされない。
指定された短精度の浮動小数点定数は正確に表すことができない。 長精度の浮動小数点定数として指定された場合は、もっと正確に表すことができる。 例えば、1.3E0 は正確に表すことができないが、1.3D0 の場合は適切に表すことができる。
DO の指定にループの繰り返しを生じさせる TO、BY、REPEAT などの文節がないために、UNTIL 文節はループに影響を及ぼさず無視される。
do x = y until ( z > 0 ); ... end;
プロシージャーに RETURN ステートメントが含まれている場合 は、PROCEDURE ステートメントに RETURNS 属性を指定する必要がある。
a: proc; return( 0 ); end;
ブロック内の AUTOMATIC 変数は、含まれている任意の ブロックの宣言ステートメントおよび実行可能ステートメントの中で使 用できるが、その変数を宣言するブロックの中では、 実行可能ステートメントの中でしか使用できない。
dcl x fixed bin(15) init(5); dcl y(x) fixed bin(15);
示されているプロシージャーは、外部プロシージャーではな く、コンパイル単位内で参照されることはない。 これはエラー (このプロシージャーを呼び出すことにな っている場合) またはなんらかの非活動コードを除去する機会 を示す。
RULES(IBM) を指定すると、算術演算に FIXED BIN のオペランドと 非ゼロのスケール因数を指定した FIXED DEC のオペランドがある場合、FIXED DEC オペランドは FIXED BIN に変換される。
このメッセージは、ループの一部として実行すると非常に コストが高くなる可能性があるコードを見つけるために役立つ。 例えば、コードが REFER を使用する構造体のエレメントを参照している場合に、 このメッセージが生成されることがある。 構造体で複数の REFER を使用しており、最後の REFER の後にエレメントがある場合、 そのエレメントに対する単一の参照で、このメッセージの複数のコピーが生成されることがある (複数のライブラリー呼び出しが行われるため)。
PUT または GET STRING EDIT ステートメントがコンパイラーによって最適化され、 そのほとんどがインラインで実行されるようになる場合に、このメッセージが出される。
このメッセージは、以下に示すようにステートメントにフラグを立てる。 ここで、"true" は BIT(1) STATIC INIT(’1’b) である。 "true" になるのが名前付き定数であれば (つまり、STATIC INIT ではなく、VALUE 属性を指定して宣言されていれば) 問題は発生しない。
if ( a < b ) = true then
このメッセージは、ループの一部として実行すると非常に コストが高くなる可能性があるコードを見つけたり、異種の型の 変換を含むコードを見つけるために役立つ。
一般に、ラベルを別のルーチンに渡すことは賢明ではない。 このことを行うコードがあれば、再設計を考える方が良いと思われる。
LIMITS オプションが 31 を超える最大 FIXED 精度を指定する場合、FIXED DEC および FIXED BIN オペランドが関わる操作は、たとえ両方のオペランドが "small" であっても、8 バイト整数の結果を生成する可能性がある。 例えば、FIXED DEC(13) と FIXED BIN(31) を加算する場合、結果は 8 バイト整数になる可能性がある (なぜなら、FIXED DEC(13) 値は 4 バイト整数に収めるには大きすぎるからである)。 これを避けるためには、DECIMAL 組み込み関数を FIXED BIN オペランドに適用することができる。
FIXED BIN(p,q) から FIXED DEC への特定の変換では、q が正の場合に古いコンパイラーで結果がいくらか丸められていた。
DO ループ内の制御変数が PICTURE 変数である場合、制御変数が FIXED BIN 変数である場合よりも多くのコードがループに対して生成される。 さらに、そのようなループは、無限にループするような、間違ったコードになりやすい。
VERIFY(x,y) などの関数で y が定数である場合は、INITIAL 属性ではなく VALUE 属性を使用して y を宣言する方がパフォーマンスが向上する。
このメッセージを使用して、何度も呼び出されるとコストが高くなる可能性があるコードを見つけることができる。 このメッセージは、非定数エクステントを持っている BASED および CONTROLLED 変数に対する ALLOCATE ステートメントで生成されることがあり、 非定数エクステントを持っている AUTOMATIC 変数を使用する PROCEDURE のプロローグでも生成されることがある。