SSA形式を用いたコンパイラ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/05/08 08:22 UTC 版)
「静的単一代入」の記事における「SSA形式を用いたコンパイラ」の解説
前述のように理論的には1980年代にはその基本は確立されている。しかし、実際のコンパイラ(特に、プロプライエタリでないもの)への導入は比較的近年であり、従って、古いコンパイラは SSA 形式をコンパイルや最適化の一部でのみ使用し、ほとんどのものは全面的に SSA に依存することはない。SSA に大きく依存するコンパイラの例として、下記のものがある。 日本で開発された「COINSコンパイラ・インフラストラクチャ」は、SSAの全面的な導入を図っている。 ETH Oberon-2 コンパイラは SSA の変種である "GSA" を導入した最初期のプロジェクトの一つである。 LLVM Compiler Infrastructure では、コード表現において全てのスカラーレジスタの値にSSA 形式を用いている。SSA 形式は、コンパイル時(通例リンク時)にレジスタの割り当てが発生するまで破棄されない。 SGI のPro64コンパイラをベースにしたオープンソースのコンパイラORC(Open Research Compiler) は SSA 形式を大域的なスカラー最適処理に用いているが、コードは SSA 形式に変換され、後で SSA 形式から変換される。ORC はスカラーの値に加えてメモリを表現するよう SSA 形式を拡張している。 GCC、GNUコンパイラコレクションのバージョン 4 (2005年4月リリース) では SSA が多用されている。フロントエンドがGENERICコードを生成し、次に "gimplifier" が SSA に変換し、"ミドルエンド"が最適化を行う。バックエンドが最適化された中間コードを RTL に変換して低レベルな最適化を行い、最終的に RTL がassembly languageに変換される。 IBM のオープンソース適合の Java仮想マシン "Jikes RVM" は、Extended Array SSA という SSA の拡張を用いている。これはスカラー、配列、オブジェクトのフィールドを統一されたフレームワークで解析することが可能である。Extended Array SSA の解析は、コードの最も頻繁に実行される部分に対して適用される最適化レベル最大時のみ有効になる。 2002年に、研究者が IBM の JikesRVM を標準の Javaバイトコード と型安全の SSA (SafeTSA) バイトコードのJavaクラスファイルを動作できるよう改変し(当時 Jalapeno と命名された) 、SSA バイトコードを用いて大幅なパフォーマンス向上が得られることを示した。 サン・マイクロシステムズの Java HotSpot Virtual Machine は、JIT コンパイラで SSA ベースの中間言語を用いている。 Mono は Mini と呼ばれる JIT コンパイラで SSA を用いている。 jackcc は学術用の命令セット Jackal 3.0 のためのオープンソースコンパイラである。jackcc は中間表現で、SSA の単純な 3 オペランドコードを用いている。興味深い派生物として、 Φ 関数をいわゆる SAME 命令、すなわちレジスタ割り当ての際、同じ物理レジスタに二つの値を配するよう指示する。 コンパイラではないが、 Boomerang 逆コンパイラは、内部表現に SSA 形式を用いている。SSA は式の伝播や、パラメータや戻り値の特定、保存の解析(preservation analysis) などを簡略化するために用いられている。 Portable.NET は JIT コンパイラで SSA を用いている。 libFirm は、コンパイラのための完全なグラフベースの SSA 中間表現である。
※この「SSA形式を用いたコンパイラ」の解説は、「静的単一代入」の解説の一部です。
「SSA形式を用いたコンパイラ」を含む「静的単一代入」の記事については、「静的単一代入」の概要を参照ください。
- SSA形式を用いたコンパイラのページへのリンク