2008-10-18
関数間の型推論を作りました
|関数の呼び出し情報を使って型推論をする機能を入れてみました。あまり、使いどころは無いような気がしますが(必要なら+ 0.0とか入れて型を指定すればいいから)、面白いかなと思います。
def fact(n) n end def llvmfib(n) fact(3.9) if n < 2 then 1 else llvmfib(n - 1) + llvmfib(n - 2) end end
例えば、こんな感じのプログラムでfactは型が不明ですが、llvmfibで3.9を引数で呼び出しているので、factはDouble -> Doubleと型推論できます。
define double @fact(double) { bb: %1 = alloca double ; <double*> [#uses=2] store double %0, double* %1 br label %bb1 bb1: ; preds = %bb %2 = load double* %1 ; <double> [#uses=1] ret double %2 }
トラックバック - http://d.hatena.ne.jp/miura1729/20081018/1224321895
リンク元
- 6 http://llvmruby.org/wordpress-llvmruby/
- 5 http://www.infoq.com/news/2008/10/llvmruby-roundup-yarv2llvm
- 4 http://www.rubyist.net/~kazu/samidare/
- 2 http://a.hatena.ne.jp/asip/
- 2 http://github.com/miura1729/yarv2llvm/tree/master
- 2 http://www.google.co.jp/search?hl=ja&lr=lang_ja&safe=off&client=firefox&rls=org.mozilla:ja:official&hs=zj4&pwst=1&q=ypsilon+scheme&revid=467765037&sa=X&oi=revisions_inline&resnum=0&ct=top-revision&cd=2
- 1 http://d.hatena.ne.jp/kwatch/20080304/1204646782
- 1 http://d.hatena.ne.jp/mitsu_chie/20081015/1224068215
- 1 http://github.com/miura1729/regexpllvm/tree/master
- 1 http://llvmruby.org/wordpress-llvmruby/?p=27
factを呼び出し側で、fact(1),fact(1.0)などと二種類以上の型で呼び出した
場合、どういう風に推論されるんでしょうか?共通のスーパークラスに
推論される?
2種類以上の型で呼び出した場合、エラーになります。とりあえず、多相型のことは全然考えていないです。現状のアルゴリズムは論文を元にしたものじゃなく、適当なので多相型まで対応できるかわからないです。対応できたとしてもRubyのフルセットを実現しようとするとどうしても動的な型チェックが必要な場合が出てきて、動的な型チェックが入る場合LLVMでは効率的な実現は難しいなと感じています。
そういうことで、yarv2llvmは多相型については実現せず、llvmじゃないライブラリ(今のところV8にパッチを当てたものが有力かなと思っています)を使ってもっとRubyの言語仕様に忠実なコンパイラを実現したいなと考えています。