2004-01-20 [長年日記]
λ. YARVでの末尾再帰
YARVにsendとendを融合した新しい命令(tailsend)を導入することで、スタックを消費しない末尾呼び出しを実現してみる(yarv000c-tail.diff)。ただし、クロージャのこととかは全然考えてない。
それと、余計なスタック操作が加わるので当然遅くなるはず。簡単なプログラムで試してみると1.7%ほど遅くなった。場合によってはもっと遅くなることも考えられるけど、これくらいならなんとか許容範囲?
インタプリタ | 実行時間(秒) |
---|---|
ruby | 47.14 |
yarv | 10.18 |
yarv(tailsend) | 10.35 |
評価プログラム:
def test(n) if 0==n 0 else test(n-1) end end i = 0 while i < 10000 test(1000) i += 1 end
楽しそうだなぁ・・・。
何他人事みたいな事言ってるんですか (^^;<br><br>でも、ホント楽しいです。<br>これまで自分でも弄れるような手頃なVMってなかなか無かったですし、これまでよく理解していなかった Threaded Code とかも YARVのおかげで理解できたので。