コンパイラは、スタックベースまたは無限レジスタのいずれかである中間表現(IR)を選択することがよくあります。これらの式ツリーに対する利点は何ですか?
1 に答える
式ツリーは式には機能しますが、プログラム全体のモデリングには効果的ではありません。特に、プログラムの適切な表現は、実際には、制御フローとデータ フローによって接続された (操作とアクションの) グラフです。通常、人々はまさにそのようなグラフを形成する「トリプル」の使用について話します。
スタック マシン コードは、フロント エンドで生成するのは簡単ですが、実際のコードを生成するために必要な最終的なレジスタ割り当てプロセスは困難です。これは、ターゲット アーキテクチャとは明確に関係のない一連の一時的な場所 (「スタック」) があるためです。 、データフローの処理が不便になります。(「この追加の結果を使用するコードはどれですか?」)。
レジスタ マシンは、コードを生成するのが少し難しくなりますが、これらの無限レジスタを本質的にデータ フロー ワイヤとして使用することで、データ フローを維持する傾向があります。そのデータフローと、それを実際のレジスタに簡単に割り当てる機能 (「グラフの色付けによる」標準的なレジスタ割り当てがあります) により、適切なコードを比較的簡単に生成できます。
これらから仮想マシン コードを直接生成すると、異なるパフォーマンス特性が得られます。基本的に、スタック マシンはコードのフットプリントが小さくなる傾向があります。無限レジスタ マシンは、解釈実行が高速になる傾向があります。まさにこの理由で、Google の Dalvik は JVM とは異なります。(おそらく、彼らは、クラス ファイル形式に関しても、Sun/Oracle から訴えられたくなかったのでしょう。)
次のドキュメントをお勧めします: Virtual Machine Showdown: Stack Versus Registers。(追伸: Anton Ertl を著者とするものは、興味深い読み物になる傾向があります)。