1. ホーム
  2. language-agnostic

レジスタとスタック

2023-11-25 09:31:20

疑問点

レジスタ ベースの仮想マシンを使用することと、スタック ベースの仮想マシンを使用することの利点と欠点は、具体的にどのようなものでしょうか。

私には、レジスタ ベースのマシンはプログラムするのがより簡単で、より効率的であるように思えます。 では、なぜ JVM、CLR、および Python VM はすべてスタックベースなのでしょうか?

どのように解決するのか?

これは、Parrot VMのFAQや関連ドキュメントで、すでにある程度の回答がなされています。 Parrot の概要 その文書から関連するテキストは次のとおりです。

Parrot VM はスタックアーキテクチャではなく、レジスタアーキテクチャを採用しています。また、Perl や Python などの中レベル オペレーションよりも Java に近い、非常に低レベルのオペレーションを行います。

この決定の理由は、主に、基礎となるハードウェアにある程度似ていることによって、Parrot バイトコードを効率的なネイティブ機械語にコンパイルダウンすることが可能であるためです。

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

こちらも合わせてお読みください。 インタプリタ設計のためのレジスタとスタック 少し引用します。

<ブロッククオート

スタックマシン用のコードを生成するのが簡単なのは本当に間違いないです。1 年生のコンパイラーの学生のほとんどは、それができます。レジスタ マシンをアキュムレータ付きのスタック マシンとして扱わない限り、レジスタ マシンのコードを生成するのは少し困難です。(ターゲットの単純さは、少なくともわたしにとってはそれほど大きな問題ではありません。その数は少ない。もうひとつの問題は、コンパイラーの知識を持つ人々の多くが、一般に使用されているハードウェア CPU がすべてそうであるように、すでにレジスタ マシンをターゲットにすることに満足しているということです。