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のおかげで理解できたので。