私は学部の研究でコンパイラのコースを受講し、おもちゃのJavaのような言語でソースプログラムをおもちゃのアセンブリ言語(インタプリタがありました)にコンパイルするコンパイラを書きました。プロジェクトでは、「実際の」ネイティブ実行可能ファイルに密接に関連するターゲットマシンについて、次のようないくつかの仮定を行いました。
- 専用スタックポインタ( "SP")レジスタによって追跡されるランタイムスタック
- 専用ヒープポインター( "HP")レジスターによって追跡される動的オブジェクト割り当て用のヒープ
- 専用のプログラムカウンタレジスタ(「PC」)
- ターゲットマシンには16個のレジスタがあります
- データの操作(ジャンプなどとは対照的)はレジスタ間操作です
レジスター割り当てを最適化として使用することについてユニットにたどり着いたとき、それは私に不思議に思いました:そのようなマシンのレジスターの理論上の最小数はいくつですか?コンパイラーで5つのレジスター(SP、HP、PC、および2進演算のストレージとして使用するための2つ)を使用したことを前提にしています。レジスター割り当てのような最適化は確かにより多くのレジスターを利用することができますが、スタックやヒープのような構造を維持しながら、より少ないレジスターでうまくいく方法はありますか?レジスタアドレス指定(レジスタ間操作)では少なくとも2つのレジスタが必要だと思いますが、3つ以上必要ですか?