カスタムVMを設計していますが、使用するレジスタの数に興味があります。最初は255でしたが、関数を呼び出すたびに、ほとんどが使用されない場合に、255のポインター(KB全体)をスタックまたはヒープに戻すことについて少し心配しています。いくつのレジスタを使用する必要がありますか?
4 に答える
コア内に多数のレジスタを保持しながら、一度に使用できる「アクティブな」レジスタの数を減らす方法であるレジスタ ウィンドウを調べることをお勧めします。
そうは言っても、スタックベースのアーキテクチャを使用する方が便利であることに気付くかもしれません。ソフトウェア (JVM、CLR、Python など) での実装を目的とした一部の主要な仮想マシンは、スタック アーキテクチャを使用します。人為的に制限された一連のレジスターよりも、スタック用のコンパイラーを作成する方が確かに簡単です。
これは通常、必要と思われる数によって異なります。実際のアプリケーションでの255レジスタの有用性に疑問を持っています。
私が最後に構築したレジスターマシンは、小さなプログラミング言語をサポートすることを目的としており、マッピングする際に、アプリケーションの種類、ユーザーに使用をガイドしたい設計手法を検討し、レジスターを設計する際のパフォーマンスの問題とそれらすべてのバランスを取りました。ファイル。
詳細がなくても簡単に答えられるものではありませんが、やめて自分がやろうとしていることを考え、重要だと思う側面とすべてのバランスをとれば、できる結論に達するでしょう。一緒に暮らす、そしてそれはおそらく理にかなっています。
選択するレジスタの数に関係なく、ほとんどのサブルーチンには多すぎ、少数のサブルーチンには少なすぎるでしょう。(これは単なる推測です。しかし、べき乗則分布に従うプログラミングの数を考慮すると、オブジェクト、モジュール、クラスへの着信参照、オブジェクト、モジュール、クラスからの発信参照、サブルーチンのサイクロマティック複雑度、サブルーチンの NPath 複雑度、SLOC など)。サブルーチンの長さ、オブジェクトの存続期間、オブジェクトのサイズ - サブルーチンのレジスタ数についても同じことが当てはまると仮定するのが妥当です。特に、複雑さ/長さとレジスタ数の間に相関関係があると考える場合は特にそうです。 .)
Parrot VM は、この難問から抜け出す非常に簡単な方法を見つけました。無限の数のレジスタを持っているのです。明らかに、これらのレジスターは無限配列に格納されるのではなく、単一のサブルーチンに必要なだけのレジスターを遅延実体化します。そうすれば、レジスタが不足することはなく、スペースを無駄にすることもありません。
申し訳ありません。私はこれでばかを作りました。スタックへのアクセスを最適化するためのレジスターのベクトルが既にあることがわかりましたが、それを完全に忘れていました。それらを複製する代わりに、状態のレジスタをスタックのレジスタへの参照に設定するだけです。今私がする必要があるのは、プッシュをレジスタに直接プッシュするように特化し、問題を効率的な方法で解決することだけです。これらのレジスタは、機能に依存するものがないため、バッキングも必要なく、私のスタックに完全に従って成長します。同等の値をスタックにプッシュせずに値をプッシュできるとは思いもしませんでした。
これが単純なデザインコンセプトに変わっているという絶対に恐ろしいテンプレートの混乱は、私を非常に不幸にしています. 購入したい: 静的 if および可変個引数テンプレート。