[#30743] 大きな数の大まかな割り算 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

17 messages 2007/05/01

[#30827] Supporting Fiber — SASADA Koichi <ko1@...>

 ささだです。

22 messages 2007/05/27

[ruby-dev:30800] tail call optimization

From: SASADA Koichi <ko1@...>
Date: 2007-05-21 05:23:38 UTC
List: ruby-dev #30800
 ささだです.

 末尾呼び出しの最適化機能を,きちんと考えて使えるようにしてみました.前
から処理自体は入ってたんですが,少し真面目に考え直して使えるようにしただ
けです.


def rec n
  rec n-1 if n > 0
end

rec 100000

 こんなプログラムも動きます.


 ただし,デフォルトでは使えないようになっています(実行時に切り替え可
能).これは,挙動がいろいろと変わるからです.具体的には,

・スタックトレースが変わる(callerの返り値も)
・スタックオーバーフローエラーが出なくなる場合がある

というのが顕著だと思います.他にもあるかもしれませんが,とりあえず思いつ
きません.


 この機能どうしましょう.

(1) これでRubyでも関数型プログラミングが出来るぞ,とふれまわる
(2) Rubyに合わないから機能をなかった事にする(消す)
(3) 知っている人しか使わないような,隠し機能にする
  例えば ObjC 拡張や python like ブロックとかと同じ
(3') とりあえず入れておくが,もうちょっと,仕様を検討する


 ちなみに,いわゆる末尾再起の最適化(自分自身への jump に変換)ではな
く,末尾呼び出しの最適化で,スタックがあふれないように細工したものです.
なので,高速化にはあんまり寄与していません.

-- 
// SASADA Koichi at atdot dot net


In This Thread

Prev Next