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)。