SICP 読み (303) 5.5 翻訳系
最終節に突入。この節、最後まで目を通してないんですがいつもの通りにイメージに苦しんでおります。とりあえず、p.340 で書いてあるナニは (f 84 96) の演算子 f を手続きに解決する ev-application の以下の手順のうち
(save env) (assign unev (op operands) (reg exp)) (save unev) (assign exp (op operator) (reg exp)) (assign continue (label ev-appl-did-operator)) (goto (label eval-dispatch))
で eval した後に
(restore unev) (restore env) (assign argl (op empty-arglist)) (assign proc (reg val))
までのソレを
(assign proc (op lookup-variable-value) (const f) (reg env))
一発で置き換える事ができるのでは、という最適化と見て良いのか。ちなみに上記手続きの unev を操作している部分は範疇外か。おそらく上記の手続きの後に unev と argl をセットしてあげれば手続き的には整合するはず。確かに話は早くなっていますが、ケースによっては単純に何でもこうすりゃ良い、という話ではないはずで、このあたりが問題 5.31 なソレなのかどうなのか。
問題 5.31
preserving が何をするのか、という事が未だ見えん。ちょっとだけ理解している部分を整理して検討してみる事に。ぢつは今日晩ちょっとだけ復活気味だったりしますが、明日以降ばたばたな予定なのでどうなる事やら。
一つめ
(preserving (list <reg1> <reg2>) <seq1> <seq2>)
が
<seq1> <seq2>
を戻すのは seq1 が reg1 および reg2 に影響しないケイス、と言えば良いのか。seq1 が reg1 を操作するのであれば save restore しないと駄目だろうし、reg2 を操作するのであれば reg2 を、両方であれば両方を、という事か。
これを踏まえて (f 'x 'y) を評価するナニを save, restore に着目して手動トレイスしてみる。
- contine が save
- env が save
- unev が save
- f を eval
- unev が resotre
- env が restore
- proc が save
- argl が save
- env が save
- unev が save
- 'x を eval
- unev が restore
- env が restore
- argl が resotre
- argl と unev を操作
- argl が save
- 'y を eval
- argl が restore
- argl を操作
- proc が restore
- apply-dispatch に jmp
が一連の流れな模様。演算子の評価に無駄があるのは分かりますが quoted な引数の評価な部分はもう少し見てみないとナニ。