6.5 Register Machines

Vmgen を使用してスタック VM ではなくレジスター VM を実装する場合は、 直接実行する方法とスーパー命令を使用する方法の 2 つがあります。

直接的な方法を使用する場合は、 以下のように、 レジスタ番号を直接の引数として受け取る命令を定義します:

add3 ( #src1 #src2 #dest -- )
reg[dest] = reg[src1]+reg[src2];

この方法の欠点は、 トレース中にレジスター番号のみが表示され、 レジスタの内容は表示されないことです。 実際には、 printarg_src (see VM engine)を適切に定義すると、 開始時にソース・レジスターの値を出力できますが、 終了時に宛先レジスターの値を出力することはできません。

スーパー命令(superinstructions)を使用してレジスター VM を定義する場合は、 以下のように、 スタックを使用する単純な命令(simple instructions)を定義してから、 全体的なスタック効果のないスーパー命令を定義します:

loadreg ( #src -- n )
n = reg[src];

storereg ( n #dest -- )
reg[dest] = n;

adds ( n1 n2 -- n )
n = n1+n2;

add3 = loadreg loadreg adds storereg

この方法の利点は、 トレース中にレジスター番号だけでなく値も表示されることです。 この方法の欠点は、 現時点ではスーパー命令(superinstructions)を直接生成できず、 単純な命令(simple instructions)のシーケンスを生成することによってのみ生成できることです(需要があれば、 作者達は将来これを変更するかもしれません)。

上記の問題とは別に、 レジスター VM のサポートを改善可能でしょうか? VM インタープリターに関連して「レジスター・マシン」という用語を使用する場合、 人によって意味が異なるため、 一般的な方法でこれを行う方法を理解するのは困難です。 ただし、 その方向でアイデアや要望がある場合は、 著者にお知らせください(see Contact)。