エスケープ解析
エスケープ解析(エスケープかいせき、英: Escape analysis)とは、コンパイラ最適化理論において、ポインタの動的なスコープを特定するための方法である。エスケープ解析は、ポインタ解析やシェープ解析と関連している。
サブルーチンにおいて変数やオブジェクトが割り当てられるとき、変数へのポインタが、別の実行スレッドや呼び出し元のルーチンに「エスケープ」してしまうことがある。サブルーチンがオブジェクトを割り当て、これに対するポインタを返却すると、オブジェクトはプログラム内の不定の場所からアクセスすることができる。ポインタがグローバル変数やその他のデータ構造に格納された場合にも、現在の処理からエスケープしたと考えることができる。
エスケープ解析は、ポインタが格納されうるすべての場所を特定し、ポインタの生存区間を現在の関数やスレッド内のみに限定してよいかどうかを判断する。
最適化
[編集]コンパイラはエスケープ解析の結果を、最適化のための土台として用いる。
- ヒープの割り当てのスタックの割り当てへの置き換え: オブジェクトがサブルーチン内で割り当てられ、オブジェクトへのポインタがエスケープしなければ、そのオブジェクトはヒープの代わりにスタックに割り当てる候補になる。
- 同期処理の省略: オブジェクトが1スレッド内でのみアクセスされることがわかれば、オブジェクトに対する処理は同期処理を実施せずに行うことができる。
- オブジェクトの分割あるいはスカラー変数への置換: オブジェクトへのアクセス方法により、オブジェクトがメモリ構造上連続して存在する必要がないことが判明した場合、オブジェクトの一部をメモリではなく CPU のレジスタに格納できる場合がある。
実用上の考慮点
[編集]オブジェクト指向プログラム言語では、動的コンパイラがエスケープ解析を行いうる特に有力な候補である。伝統的な静的コンパイルによるメソッドのオーバーライドでは、エスケープ解析が不可能な場合がある。あるメソッドが、ポインタをエスケープする別のバージョンのメソッドによりオーバーライドされる可能性があるためである。動的コンパイラはオーバーロードについての情報を元にエスケープ解析を行い、動的ローディングによってメソッドがオーバーライドされた場合には再度解析を実施することができる。
エスケープ解析は Java 言語により特に興味の対象となってきた。Java のヒープに限定したオブジェクトの割り当て、スレッドのサポート、Sun の HotSpot 動的コンパイラ、という組み合わせが、エスケープ解析に関連した最適化の有望なプラットフォームを作り出している。(Escape analysis in Java参照)。エスケープ解析は、Java Standard Edition 6 で実装されている。