3

私はこのトピックについていくつかの調査を行ってきましたが、適切な具体的な答えは見つかりませんでした. コードに次の式があるとします。

B = 2
…
B = B + 5
…
B = J + B
…

(これらは非常に単純な例であり、現実的ではないことはわかっています)

Bには、これらの行全体でさまざまな値があります。1 行目では で2、後で になり7、さらに後で になり7 + Jます。コンパイラは のこれらの異なる値を追跡する必要があるためB、1 つの方法はそれらの名前を変更することです。たとえば、Bが として再定義されるとB = B+5、 に変更される可能性がありますB1 = B+5。最後の再定義は次のようになりますB2 = J+B1

このアイデアの背後にある動機は、私が構築している最適化プログラムに関係しています。変数を関連する式に置き換える必要があります。ただし、変数が再定義された場合、文字「B」は一度に複数のことを意味する可能性があります。物事を追跡するために私が使用している方法は、変数名を再定義して、上で説明したものです。

これはコンパイラの仕組みですか?これに名前はありますか?

変数を再定義する場合にコンパイラが変数を再定義するこのプロセスについて、できる限り多くのことを見つけようとしています。

それが役立つ場合、これはコンパイルの前処理段階で行われると思います。マクロ展開と同様の概念だと思います。

編集:質問にもう少しコンテキストを追加しました。

4

2 に答える 2

3

あなたが説明するものは、静的単一割り当て (SSA) フォームとして形式化されています。「割り当て時に変数の名前を変更する」よりも少し侵襲的です。たとえば、これを書き換える場合など、制御フローに直面して読み取る「現在の」変数も知っている必要があるためです。

if (a) x = 0;
else x = 1;
print(x);

これに、いわゆる phi ノードを挿入して、 で正しい値を選択する必要がありますprint

if (a) x0 = 0;
else x1 = 1;
print(<which x?>)

通常、IR には SSA が組み込まれているため、コードは IR に変換される間 (またはその直後) に SSA に変換されます。マクロの展開は、マクロの強力さに応じて、通常はトークン ストリームまたは AST で行われます。

ただし、これは決して必須ではないことに注意してください。一部の最適化には役立ちますが、必須ではありません (一部の最適化ではまったくメリットがありません)。変更可能な変数を使用して同じ最適化を実行できます (そして、SSA を備えた多くのコンパイラ IR は、少なくともヒープを非 SSA のままにします)。たとえば、定数を伝播するときは、定数と置き換える使用の間に他の代入がないことを確認する必要がありますが、SSA がなくても簡単に確認できます。

于 2013-07-31T21:24:27.843 に答える