okuの日記: 適切な末尾再帰呼出 4
日記 by
oku
Proper Tail Calls in ECMAScript 4 経由、proposals:proper_tail_calls [ES4 Wiki] より:
まだ斜め読みでしかないので的外れなことを書いているかも知れませんが、これってわざわざ「仕樣」に書かないような話なんでしょうか?
Proper Tail Calls in ECMAScript 4 経由、proposals:proper_tail_calls [ES4 Wiki] より:
まだ斜め読みでしかないので的外れなことを書いているかも知れませんが、これってわざわざ「仕樣」に書かないような話なんでしょうか?
アレゲは一日にしてならず -- アレゲ研究家
む? (スコア:1)
「書かなければいけないような話」かどうか疑問ってことですか?
末尾呼び出しを最適化するかどうかは結構重要な仕様上の決断だと思いますが...Schemeでは末尾呼び出しの最適化は標準仕様上の要求ですが、Common Lispではそうではありませんし。
Re:む? (スコア:1)
私は Scheme は知らないのですが (Common LISP は少し齧った)、言語仕様と最適化は分けた方がいいんじゃないかなあという考えです。 「こうこう書けば最適化される」という決まりがあるのは、まあ、あればあったで便利かも知れないけれど、それは対人インタフェース的な仕様ではないので、長い目で見るとプログラミング言語にとって負担になるのではないかと (まあ、末尾再帰の最適化が言語仕様に与える負荷はないに等しいでしょうが)。
C/C++ みたいに、吐き出されるアセンブリコードを意識する言語なら register みたいなのがあっても構わないという見方もあるでしょうが、今となっては C/C++ の register の意味が殆どなくなっていることを教訓として考えると、最適化は言語仕様側に含めない方が良いのではないか、という辺りでしょうか。
# 今ふと気づいたけれど「ヒント文」をコメントの中に入れるという
# SQL のやり方は、意外と悪くないアイディアなのかも知れない...
Re:む? (スコア:1)
Schemeは末尾呼び出しを最適化することを言語仕様として要求するために、仕様を工夫しています。
Common Lispは主としてダイナミックバインドの関係で、末尾呼び出しを自動的に最適化することを諦めています(解説はこのあたり [lispuser.net])。Common Lispでは、末尾呼び出しを最適化する場合にはプログラマーが明示的に最適化を指示しなければいけません。
末尾呼び出しを最適化することを言語仕様として要求すると決めると、それと衝突するような仕様を言語仕様に組み込めないことを意味します。
Schemeの場合、末尾呼び出しを最適化することにより、繰り返し構文を言語仕様から排除しています。Schemeは可能なかぎり言語仕様をコンパクトにすることを指向しているので、このような決断があったわけです。
ECMAscriptの場合は関数プログラミングのサポートを強化していく方向性なので、末尾呼び出しの最適化を言語仕様に含めることにしたのではないか、と見るのですが、どうでしょうか。
Re:む? (スコア:1)
なるほど、この提案だけを読むのでは不十分だと言うことですね。 他に何か「適切な末尾再帰」を使う仕樣が考えられていて、それと抱き合わせ... みたいな理解をしないといけないということですか。
# まあ、考えてみれば JavaScript はインタプリタ言語だから
# 「コンパイラはいくらでも時間をかけて最適化できる」
# という発想は無茶ですねえ。