Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-10-18

関数間の型推論を作りました

18:24 |  関数間の型推論を作りましたを含むブックマーク  関数間の型推論を作りましたのブックマークコメント

関数の呼び出し情報を使って型推論をする機能を入れてみました。あまり、使いどころは無いような気がしますが(必要なら+ 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
}

kmizushimakmizushima 2008/10/21 09:00 はじめまして。
factを呼び出し側で、fact(1),fact(1.0)などと二種類以上の型で呼び出した
場合、どういう風に推論されるんでしょうか?共通のスーパークラスに
推論される?

miura1729miura1729 2008/10/21 12:56 質問ありがとうございます。反応があるとうれしいです。
2種類以上の型で呼び出した場合、エラーになります。とりあえず、多相型のことは全然考えていないです。現状のアルゴリズムは論文を元にしたものじゃなく、適当なので多相型まで対応できるかわからないです。対応できたとしてもRubyのフルセットを実現しようとするとどうしても動的な型チェックが必要な場合が出てきて、動的な型チェックが入る場合LLVMでは効率的な実現は難しいなと感じています。
そういうことで、yarv2llvmは多相型については実現せず、llvmじゃないライブラリ(今のところV8にパッチを当てたものが有力かなと思っています)を使ってもっとRubyの言語仕様に忠実なコンパイラを実現したいなと考えています。

トラックバック - http://d.hatena.ne.jp/miura1729/20081018/1224321895