エイリアス解析

エイリアス解析（エイリアスかいせき、英: Alias analysis）は、コンパイラ理論における手法の一つで、ある記憶域が複数の箇所からアクセスされるかどうかを判定する方法である。二つのポインタが同じ記憶域を参照している場合、「している」とみなされる。
エイリアス解析は通例制御フローとコンテキストを意識した手法である。
エイリアスする可能性があるものと、確実にエイリアスしているものを特定することができる。
"エイリアス解析"という用語はポインタ解析と同義で用いられることもある。
エイリアス解析の行うこと.
一般的には、エイリアス解析はあるメモリ参照が同じメモリ領域を示すかどうかを判定する。
これによって、コンパイラは、ある文によりプログラム中のどの変数が影響を受けるかを知ることができる。たとえば、下のような構造体のメンバーにアクセスするコードを考える。
codice_1
ここで、エイリアスに3つの場合がありうる。
p と q がエイリアスしないのであれば、codice_2 は　codice_3 に置き換えることができる。p と q が確実にエイリアスするのであれば、codice_2 は　codice_5 に置き換えることができる。いずれの場合も、エイリアスによる情報を元に最適化を施すことができる。一方、p と q がエイリアスするかどうか判断できない場合には、最適化を施すことができず、結果はコード全体を実行するまで得ることができない。二つのメモリ参照のエイリアスが不明の場合、「エイリアスする可能性がある」関係と呼ぶことができる。
エイリアス解析を行う.
エイリアス解析では、プログラムのメモリ領域を"エイリアス領域(alias class)"に分割する。
エイリアス領域は互いに交わらないメモリ領域であり、互いを指し示すことはない。議論のため、最適化をプログラムの低レベルな中間言語による表現で行うものとする。すなわち、プログラムはバイナリ操作、ジャンプ、レジスタ間のデータ転送、レジスタとメモリ間のデータ転送、分岐、サブルーチンの呼び出しと復帰の命令にコンパイルされるものとする。
型に基づくエイリアス解析.
プログラミング言語が型安全にコンパイルされ、コンパイラの型チェックが正しく、さらにローカル変数を参照することができない(MLや Haskell, Java など)とすると、有益な最適化を行うことが可能である。二つのメモリ位置が異なるエイリアス領域内にあることが既知である状況は多数ある。
コードに対してエイリアス解析を行う際、メモリへの各ロードとストアは領域ごとにラベル付けされる必要がある。すると、与えられたメモリ領域に対して重要な特性 formula_1 formula_2 すなわちエイリアス領域 formula_3 を得る。formula_4 ならば、formula_1 は formula_2 にエイリアスする可能性があり、formula_7 であればエイリアスしない。
フローに基づくエイリアス解析.
フローに基づく解析は、型に基づいた解析とは異なり、参照や型のキャストがある言語でも適用することができる。フローに基づく解析は、型に基づいた解析を代替したり、補う形で用いることができる。フローに基づく解析では、新たなエイリアス領域がメモリの割り当てごとに作成され、参照は時間が経過すると別の領域を指す可能性もあり、複数のエイリアス領域にまたがる可能性がある。これは、各メモリ位置が単一ではなく複数のエイリアス領域を持つことを意味する。