-
Notifications
You must be signed in to change notification settings - Fork 0
VM Design
命令を取り出す処理をfetchという. 一般にVMにおいてfetchの回数は少なければ少ないほど速い. つまり同じ処理をするために必要な命令の数を減らすべきである。
RISCでは同じような命令を統合し、固定長の命令を使うことが多い
CISCでは同じような命令を区別し、可変長の命令を使うことが多い
スタックマシンではPUSHやPOPのようなより一般的な命令が必然的に多いので、性質上RISCはスタックマシンとCISCはレジスタマシンと相性がいいようである.
CISCの特徴である、複数の命令と同等の機能を持つ特殊な命令を作る命令融合や、型などの属性ごとに特化した命令は、fetch回数を減らしVMの高速化に向く、と思いRCWTではCISCを目指すことにしたが、シンプルさを重視して固定長命令を選択した. 可変長命令については検討中である.
スタックマシンで1 byteの命令を使うとき32 bit alignmentに適合せず、fetchのコストが大きくなる可能性がある.またその場合、即値を格納することが事実上不可能であり、別にフェッチする必要がありコストはさらに大きくなりうる.
スタックマシンにおける任意の二項演算binはレジスタマシンにおける以下の処理と同等である
POP r1
POP r2
BIN r3 r1 r2
PUSH r3
レジスタマシンでは一般に2つまたは3つのレジスタを指定するが、スタックマシンではレジスタを指定しないので、命令長が短くてすみメモリを節約できる.しかし、RCWTでは組み込みを視野に入れていないので、fetchでの考察も合わせて、レジスタマシンとして設計している.
3番地コードは最適化を得意としており、コンパイラでよく使われる中間表現だが、レジスタマシンと相性が良い. また、3つのoperandを指定することはCISCらしいように思う.