コンピュータサイエンスにおいて、3アドレスコード[ 1 ](多くの場合、TACまたは3ACと略される)は、最適化コンパイラがコード改善変換の実装を支援するために使用する中間コードです。各TAC命令は最大3つのオペランドを持ち、通常は代入と二項演算子の組み合わせです。たとえば、この名前は、これらのステートメントで3つのオペランドを使用することに由来し、オペランド数が少ない命令も存在します t1 := t2 + t3
3アドレスコードはコンパイラ内で中間言語として使用されるため、オペランドは具体的なメモリアドレスやプロセッサレジスタではなく、レジスタ割り当て時に実際のアドレスに変換されるシンボリックアドレスとなる可能性が高くなります。また、3アドレスコードは通常コンパイラによって生成されるため、オペランド名に連番が付けられることも珍しくありません。
3 アドレス コードの改良版がA 正規形(ANF) です。
例
3アドレスのコードでは、これは複数の個別の命令に分割されます。これらの命令はアセンブリ言語に簡単に変換できます。また、コードを短縮するための共通の部分式を検出することも容易です。次の例では、1つの計算が複数の小さな計算で構成されています
# [[二次方程式]] の解を 1 つ計算します。 x = (-b + sqrt(b^2 - 4*a*c)) / (2*a) | t1 := b * b t2 := 4 * a t3 := t2 * c t4 := t1 - t3 t5 := sqrt(t4) t6 := 0 - b t7 := t5 + t6 t8 := 2 * a t9 := t7 / t8 x := t9 |
3アドレスコードには、条件付きジャンプと無条件ジャンプ、そしてメモリアクセスメソッドが含まれる場合があります。また、関数呼び出しメソッドが含まれる場合や、関数呼び出しをジャンプに簡略化する場合があります。このように、3アドレスコードは制御フロー解析に役立つ場合があります。次のC言語のような例では、ループは0から9までの数の2乗を格納します
…( i = 0 ; i < 10 ; ++ i )の場合{ b [ i ] = i * i ; }… | t1 := 0 ; iを初期化する L1: t1 >= 10 の場合 L2 へ移動; 条件ジャンプ t2 := t1 * t1 ; iの2乗 t3 := t1 * 4 ; ワードアラインアドレス t4 := b + t3 ; i*i を格納するアドレス *t4 := t2 ; ポインタを介して格納 t1 := t1 + 1 ; iを増やす L1へ移動; ループを繰り返す L2: |
参照
参考文献
- ^ V., Aho, Alfred (1986).コンパイラ、原理、テクニック、ツール. Sethi, Ravi., Ullman, Jeffrey D., 1942-. Reading, Mass.: Addison-Wesley Pub. Co. pp. 466 . ISBN 0201100886 OCLC 12285707
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク)