JavaScriptで実装した末尾再帰パスファインディングアルゴリズムがあり、(すべての)ブラウザーでスタックオーバーフロー例外が発生する可能性があるかどうかを知りたいです。
only
最適化ではないことを付け加えておきます。TCOを備えた1つのインタープリター/コンパイラーに対して作成されたコードは、TCOがないインタープリター/コンパイラーではおそらく機能しないため、それをサポートすることは、コンパイラー/インタープリターではなく、言語仕様の一部である必要があります。
JavaScriptで実装した末尾再帰パスファインディングアルゴリズムがあり、(すべての)ブラウザーでスタックオーバーフロー例外が発生する可能性があるかどうかを知りたいです。
only
最適化ではないことを付け加えておきます。TCOを備えた1つのインタープリター/コンパイラーに対して作成されたコードは、TCOがないインタープリター/コンパイラーではおそらく機能しないため、それをサポートすることは、コンパイラー/インタープリターではなく、言語仕様の一部である必要があります。
回答:
ECMAScript 4仕様はもともとTCOのサポートを追加する予定でしたが、削除されました。
私の知る限り、JavaScriptの広く利用可能な実装では、現在、自動TCOを実行していません。ただし、これは役立つかもしれません。
基本的に、アキュムレータパターンを使用しても同じ効果が得られます。
現時点では喜びはありませんが、ありがたいことに適切な末尾呼び出しがHarmony(ECMAScriptバージョン6)で予定されてい ますhttp://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
あなたが遭遇するほとんどすべてのブラウザは、「あまりにも多くの再帰」に行き詰まります。ここだV8のバグトラッカーのエントリおそらく興味深い読書になります。
それが単純な自己再帰であれば、末尾呼び出しの排除を期待するよりも、明示的な反復を使用する努力に値するでしょう。
末尾呼び出しの最適化は、ECMAScript 6の厳密モードで将来サポートされる予定です。詳細については、http://www.2ality.com/2015/06/tail-call-optimization.htmlを確認してください。
現在のエンジンサポートについては、http://kangax.github.io/compat-table/es6/を確認してください。
現在(2019年7月18日)、次のエンジンがテールコールの最適化をサポートしています。
「実験的なJavaScript機能」フラグがオンになっている場合のサポート:
現在、JavaScript実装は末尾再帰を認識していません。ECMAScript 6では変更が加えられており、他の人が言ったように、V8にはオープンチケットがあります。
V8で生成された末尾再帰関数用のアセンブラーを次に示します。
ClangがCで同じ関数をコンパイルした方法と比較してください。
V8は再帰呼び出しを保持しますが、Cコンパイラは末尾再帰を認識し、ループに変更しました。