[SICP] make-register
(make-register 'r0) とかでレジスタを設定するのだが、その構造はどうなっているか?それが仕様になる。初期値は '*unassigned* で例によって dispatch がかえる。メソッド(関数だけど)は get と set。これが register-table に name とペアーで格納されている。r0 をアロケートした直後はこんな感じになる。
((R0 #<FUNCTION DISPATCH (MSG) (BLOCK DISPATCH (COND ((EQ MSG 'GET) CONTENTS) ((EQ MSG 'SET) #'(LAMBDA (VALUE) (SETF CONTENTS VALUE))) (T (MACHINE-ERROR Unkown request - REGISTER MSG))))>) (PC #<FUNCTION DISPATCH (MSG) (BLOCK DISPATCH (COND ((EQ MSG 'GET) CONTENTS) ((EQ MSG 'SET) #'(LAMBDA (VALUE) (SETF CONTENTS VALUE))) (T (MACHINE-ERROR Unkown request - REGISTER MSG))))>) (FLAG #<FUNCTION DISPATCH (MSG) (BLOCK DISPATCH (COND ((EQ MSG 'GET) CONTENTS) ((EQ MSG 'SET) #'(LAMBDA (VALUE) (SETF CONTENTS VALUE))) (T (MACHINE-ERROR Unkown request - REGISTER MSG))))>))
assemble
ここの肝は assemble 。ここでなにをするか、そして結果が何になるのかという明確な仕様が提示されるとわかりやすくなる。基本的には次の処理がどうなされるかを検証すればよい。
- assign
- test
- branch
- goto
- save
- restore
- perform
そしてラベル。perform が何でもこなせてしまうので、なんでもありの VM ということになる。なんでもありの意味は物理的制約はほとんどない。例えばレジスタの数は制約がないし、演算にも基本的に制約はない。データを抽象的にすることも可能だ。