末尾再帰の実験
次のSchemeプログラムは停止しないが処理系はクラッシュしない。
クラッシュしないはずだ!(怖いので言い切って見る)
しかし停止しないんだから本当にクラッシュしないかどうかの確認はクラッシュしたとき以外できないような・・・。
Gauche on SL-C3000は7分実行しましたがクラッシュしませんでした。
自分が作ったBeautifulSchemer on WindowsXPもしばらく走らせましたがクラッシュしなかったです。
ほっ。
でもCPUは100%食っちゃいますね。あらら。
(define a-tail-recursive (lambda (n) (a-tail-recursive n))) (a-tail-recursive 0)
意味不明に引数を渡します。
さて、JavaScriptではどうかでしょうか?
<html> <head> <script type="text/javascript"> <!-- var aTailRecursive = function (n) { aTailRecursive(n); } aTailRecursive(0); //--> </script> </head> <body> aTailRecursive runs. </body> </html>
何で実験しようかな?
JavaScriptといえば、FireFoxかな?
ということで、FireFox2.0.0.2で実験しました。
10分くらい走行させましたがまったくクラッシュしません。
しかもCPU使用率100%になるかとおもいきや、CPUの負荷も上がりません。
すごい!
タスクマネージャをみてみると時々上に上がりますがぜんぜんCPUを食わない・・・
もしかしたら、CPUのアイドルを狙ってJavaScriptエンジンを走らせているんでしょうか。
だとしたらすごいですね。
・・・ていうか、これがスクリプト言語処理系のモダンな実装はこうでなきゃだめなんでしょうね・・・
わたしゃだめだな・・・
自作Scheme処理系Beautifule SchemerはCPUフルスロットルで突っ走るし、スレッドなんて使わないトランポリンなやつだからなぁ。
:
:
それとも、FireFoxのJavaScript処理系はプログラム解析して出力のない無駄なループと判断して実行しないのかな?
と思って、alert文かませてみたんですが、alert画面でまくりで停止しなかった・・・ちゃんとループしているようだな・・
:
:
:
:
とおもったら、エラーコンソールに
too much recursion
と出ていましたorz。
リロードすると、すぐ
too much recursion
って表示されますorz。
ああ、そういうわけですか・・
多段再帰のしきい値を越えてすぐ停止するっぽいですね・・・
停止するからCPUも食わない。そうですか・・・
JavaScriptは末尾再帰はサポートしてない雰囲気ですね。ザンネン。
・・・
末尾再帰をサポートするコストってやっぱり高いんでしょうかねぇ。