Scheme コンパイラの勉強(48)
再度整理。
- rec -> gauche では定義しなくてよい。SRFI-31 として定義済み。
- recur -> named let を使えば不要。
- record-case -> match で書き換えできるので不要。
この 3imp 3.4 の VM + Compiler で、まずは普通の四則演算ができるようにしたい。さてどうしよう。
=> とりあえず、かなりどんくさい方法(environment に '(((+ - * < > =) . (+ - * < > =))) をつっこんでおいて、
VM 側で apply 時に accumrator のシンボルで場合分け)で動いた、様子。
同じ scheme コンパイラでも最初からネイティブコンパイラをインクリメンタルに作る、"An Incremental Approach to Compiler Construction"とは全く違う感覚だ。まだ何を作ったことになっているのか、正直よくわからない。
3imp で "42" をコンパイル。
(constant 42 (halt))
define fastcc i32 @scheme_entry () { entry: %ret = alloca i32 store i32 168, i32* %ret %retval = load i32* %ret ret i32 %retval }
どうみてもまったく違う。このギャップをうめるにはまだだいぶ掛かりそうだ。
TODO.
- ユニットテスト多数の追加とバグフィックス。どうも set! まわりはバグありっぽい。
- conti-nuate の理解
- let の導入(無いとテストも面倒)
- マクロ展開の導入
- VM のかわりに LLVM にするにはどうすればいいか考える
- http://mono.kmc.gr.jp/~yhara/biwascheme/ BiwaScheme. ブラウザで試せて3imp を学ぶのにとても参考になる。コンパイル済みコードも参照できる。