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 な引数の評価な部分はもう少し見てみないとナニ。