エイリアス解析エイリアス解析(エイリアスかいせき、英: alias analysis)は、コンパイラ理論における手法の1つで、ある記憶域が複数の箇所からアクセスされるかどうかを判定する方法である。2つのポインタ(あるいは参照)が同じ記憶域を参照している場合、「エイリアスされている」(aliased) とみなされる。日本語では「(同じ実体に対する)別名となっている」とも訳せる。 エイリアス解析は通例制御フロー認識とコンテキスト認識に分類される。 エイリアスする可能性があるものと、確実にエイリアスしているものを特定することができる。 エイリアス解析という用語はポインタ解析と同義で用いられることもある。 エイリアス解析の行うこと一般的には、エイリアス解析はあるメモリ参照が同じメモリ領域を示すかどうかを判定する。
これによって、コンパイラは、ある文によりプログラム中のどの変数が影響を受けるかを知ることができる。たとえば、以下のような int* p;
int* q;
int i;
/* この時点でポインタ p と q は NULL でも不定値でもなく、何か有効なアドレスを指しているものとする */
*p = 1;
*q = 2;
i = *p + 3;
ここで、エイリアスに3つの場合がありうる。
エイリアス解析を行うエイリアス解析では、プログラムのメモリ領域を「エイリアスクラス」(alias class) に分割する。 エイリアスクラスは互いに交わらない位置の集合であり、互いを指し示すことはない。議論のため、最適化をプログラムの低レベルな中間表現上で行うものとする。すなわち、プログラムはバイナリ操作、ジャンプ、レジスタ間のデータ転送、レジスタとメモリ間のデータ転送、分岐、サブルーチンの呼び出しと復帰の命令にコンパイルされるものとする。[独自研究?] 型に基づくエイリアス解析もしコンパイルされる言語が型安全であり、コンパイラの型チェックが正しく、さらにローカル変数を参照するポインタを生成する能力を持たない言語(ML、Haskell、Javaなど)だとすると、有益な最適化を行うことが可能である。2つのメモリ位置が確実に異なるエイリアスクラス内にあることが既知である状況は多数ある。
コードに対してエイリアス解析を行う際、メモリへのロードとストアごとにクラスでラベル付けされる必要がある。すると、エイリアスクラス を持つ、与えられたメモリ位置 と に対して、 であれば は のエイリアスとなる可能性があり、 であればエイリアスとならない、という有用な特性を得ることができる。 フローに基づくエイリアス解析フローに基づく解析は、型に基づいた解析とは異なり、参照や型のキャストがある言語でも適用することができる。フローに基づく解析は、型に基づいた解析を代替したり、補ったりする形で用いることができる。フローに基づく解析では、新たなエイリアスクラスがメモリの割り当てごとに作成されたり、アドレスが使用されているグローバル変数およびグローバル変数ごとに作成されたりする。参照は時間が経過すると別の領域を指す可能性もあり、複数のエイリアスクラスにまたがる可能性がある。これは、各メモリ位置が単一のエイリアスクラスではなく複数のエイリアスクラスの集合を持つことを意味する。 参考文献Appel, Andrew W. (1998). Modern Compiler Implementation in ML. Cambridge, UK: Cambridge University Press. ISBN 0 521 60764 7 関連項目 |