display 実装の前に - Scheme VM を書く

display 実装の前に不明瞭な点を1つずつ解決しよう。

1. free variables の探索

(lambda (y)
  y
  outer1
  (let1 z 1
    y
    outer2
    z))

lambda のコンパイル時の free variables は outer1 と outer 2。let1の中も探さないといけない。
let のコンパイル時の free variables は y と outer2 。
処理を少しでも速くしたいので union は収集の最後で行うこと。

2. set! の探索

ローカル変数が set! されるかどうかを調べ、set! されるようであれば box のコードを出力する。
free variables との関係は良く考えれば分かる。free variable が参照される時点で外側の let/lambda で box コードになっているので free variables に対する set! はこの処理だけでカバーできている。

3. display frame

display frame の生成/破棄タイミング。


lambda の場合は


let の場合は

  • ENTER時に生成/ポインタ格納
  • LEAVE時に復帰


どちらの場合も一つ前の display frame はスタックに格納。