質問

レジスタベースの仮想マシンを使用する場合とスタックベースの仮想マシンを使用する場合の利点と欠点は、正確には何ですか?

私にとっては、レジスタベースのマシンの方がプログラムが簡単で効率的だと思われます。では、なぜJVM、CLR、Python VMはすべてスタックベースであるのですか?

役に立ちましたか?

解決

これは、Parrot VMのFAQと関連文書で、ある程度まで回答済みです。 Parrotの概要 そのドキュメントの関連テキストは次のとおりです。

  

Parrot VMには、スタックアーキテクチャではなく、レジスタアーキテクチャがあります。また、PerlやPythonなどの中レベルの操作よりもJavaに似た、非常に低レベルの操作があります。

     

この決定の理由は、主に、基盤となるハードウェアをある程度似ていることにより、Parrotバイトコードを効率的なネイティブマシン言語にコンパイルできることです。

     

さらに、高水準言語のプログラムの多くは、ネストされた関数とメソッドの呼び出しで構成され、場合によっては中間結果を保持するための字句変数が使用されます。 JIT以外の設定では、スタックベースのVMがポップしてから同じオペランドを何度もプッシュしますが、レジスタベースのVMは適切な量のレジスタを割り当てて操作するだけで、操作量を大幅に削減できますおよびCPU時間。

これもお読みください:インタープリターデザインのレジスタとスタック 少し引用してください:

  

本当の疑いはありません。スタックマシンのコードを生成する方が簡単です。ほとんどの新入生のコンパイラの学生はそれを行うことができます。レジスタマシンのコードを生成するのは、アキュムレータを備えたスタックマシンとして扱わない限り、少し難しくなります。 (パフォーマンスの観点からは多少劣っていますが、実行可能です)ターゲティングの単純さはそれほど重要ではありません。少なくとも私にとってはそうではありません。さあ、実際に誰も気にしない何かのためにコンパイラを書いてみようとする人を何人知っていますか?数は少ないです。もう1つの問題は、コンパイラーの知識を持つ人の多くが、レジスタマシンをターゲットにするのに慣れていることです。これは、一般的に使用されているすべてのハードウェアCPUです。

他のヒント

ハードウェアに実装されたレジスタベースのマシンは、低速なRAMへのアクセスが少ないため、より効率的になります。ただし、ソフトウェアでは、レジスタベースのアーキテクチャでさえ、「レジスタ」を持っている可能性が高いです。 RAMに。その場合、スタックベースのマシンも同じくらい効率的になります。

さらに、スタックベースのVMを使用すると、コンパイラの記述がはるかに簡単になります。レジスタ割り当て戦略を扱う必要はありません。基本的に、使用するレジスタの数に制限はありません。

更新:解釈されたVMを想定してこの回答を書きました。 JITでコンパイルされたVMには当てはまらない場合があります。 JITがコンパイルされたことを示すこの論文に出会いました。レジスタアーキテクチャを使用すると、VMがより効率的になる場合があります。

従来、仮想マシンの実装者は、「VM実装のシンプルさ」によりコンパイラベースの記述が簡単であるため、レジスタベースよりスタックベースのアーキテクチャを好んでいました-ほとんどのVMは元々単一の言語とコード密度および実行可能ファイルをホストするように設計されていますスタックアーキテクチャの場合、レジスタアーキテクチャの実行可能ファイルよりも常に小さくなります。シンプルさとコード密度は、パフォーマンスを犠牲にします。

研究によると、登録ベースのアーキテクチャでは、スタックベースのアーキテクチャよりも実行されるVM命令の平均が47%少なく、レジスタコードは対応するスタックコードより25%大きくなりますが、より多くのVM命令をフェッチするコストが増加するため、コードサイズを大きくするために必要なVM命令あたりの実マシン負荷はわずか1.07%であり、無視できます。レジスタベースのVMの全体的なパフォーマンスは、標準ベンチマークの実行に要する時間が平均して32.3%少ないことです。

スタックベースのVMを構築する理由の1つは、実際のVMオペコードをより小さく簡単にできることです(オペランドをエンコード/デコードする必要はありません)。これにより、生成されるコードが小さくなり、VMコードも簡単になります。

いくつのレジスタが必要ですか?

おそらくそれより少なくとも1つは必要になるでしょう。

「登録ベース」の仮想マシンは「プログラムがより簡単」になります。または「より効率的」。おそらく、JITコンパイルフェーズ中に仮想レジスタがショートカットを提供すると考えているのでしょうか?実際のプロセッサにはVMよりも多いまたは少ないレジスタがあり、それらのレジスタはさまざまな方法で使用される可能性があるため、これは確かに当てはまりません。 (例:デクリメントされる値は、x86プロセッサのECXレジスタに配置するのが最適です。)実マシンがVMよりも多くのレジスタを持っている場合、リソースを浪費しており、"を使用しても何も得られません。レジスタベース"プログラミング。

スタックベースのVMはよりシンプルで、コードははるかにコンパクトです。実世界の例として、友人は(約30年前)Cosmac上に自作のForth VMを使用してデータロギングシステムを構築しました。 Forth VMは、2kのROMと256バイトのRAMを搭載したマシンで30 バイトのコードでした。

スタックベースのVMは、コードの生成が簡単です。

登録ベースのVMは、高速実装の作成が容易であり、高度に最適化されたコードの生成が容易です。

最初の試行では、スタックベースのVMから始めることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top