パフォーマンスチューニング - いろいろやろうぜ

pass3/find-free を速くするには can-frees と locals などの引数をうまくまとめないといけない。
コンパイラ中一番複雑で実装した自分もすぐにコードが追えなくなるので整理。
複雑さを改善する方向で進めたいが良い方法が思いつかない。

初期値

locals: '()
frees: *free-lvars*
can-frees: '()

locals

値がかわるタイミング:
pass3/$lambda から呼び出される pass3/rec で vars に上書き
pass3/$let から呼び出される pass3/rec で vars に上書き
pass3/$receiveから呼び出される pass3/rec で vars に上書き

使われるタイミング:
pass3/find-free: lvar が locals に存在する=>「freeではない」の判定に使われる。
$LAMBDA, $LET などの find-free に入る時点で $lambda.lvars などに上書きされる
pass3/symbol-lookup: locals の中に lvar を探し見つかれば REFER_LOCAL index となる
pass3/$call: pass3/find-free body の引数として can-frees に足される。
pass3/$lambda: pass3/find-free body の引数として can-frees に足される。
pass3/$receive: pass3/find-free body の引数として can-frees に足される。
pass3/$let: pass3/find-free body の引数として can-frees に足される。

注意事項:
順序に意味あり。重複はない。

frees

値がかわるタイミング:
pass3/$call: pass3/find-free body の結果が body のコンパイルの frees として使われる。
pass3/$lambda: pass3/find-free body の結果が body のコンパイルの frees として使われる。
pass3/$let: pass3/find-free body の結果が body のコンパイルの frees として使われる。
pass3/$receive: pass3/find-free body の結果が body のコンパイルの frees として使われる。

使われるタイミング:
pass3/symbol-lookup: frees の中に lvar を探し見つかれば REFER_FREE index となる
pass3/$global-ref: frees に sym があれば REFER_FREE n
pass3/$global-assign: frees に sym があれば REFER_FREE n

注意事項:
順序に意味あり。

can-frees

値がかわるタイミング:
pass3/find-free: can-frees に lvar が

書きかけ。