任何Javascript引擎尾部调用优化?
我有一个我已经在Javascript中实现的尾recursion寻路algorithm,并想知道是否有任何(所有?)浏览器可能会得到堆栈溢出exception。
ECMAScript 4规范最初是为了增加对TCO的支持,但是却被放弃了。
http://lambda-the-ultimate.org/node/3047
据我所知,目前没有广泛使用的JS实现自动TCO。 但这可能对您有用:
http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization
本质上,使用累加器模式可以达到相同的效果。
没有喜悦的一刻,但谢天谢地,正确的尾调用是和谐(ECMAScript版本6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
几乎所有你遇到的浏览器都会“太多recursion”。 这是V8 bug追踪器中的一个入口,可能是有趣的阅读。
如果它是简单的自recursion,则可能值得使用显式迭代而不是希望消除尾部消息。
尾部调用优化将被支持在未来的ECMAScript 6严格模式中。 详情请查阅http://www.2ality.com/2015/06/tail-call-optimization.html 。
检查http://kangax.github.io/compat-table/es6/获取当前的引擎支持。;
目前(26-01-2017)以下引擎支持尾部呼叫优化:
- Safari 10
- iOS 10
- Kinoma XS6
支持如果“实验JavaScriptfunction” – 标志打开:
- Chrome 54
- 歌剧41
- 节点6.5
尾巴调用优化现在在编译为JavaScript的LispyScript中可用。 你可以在这里阅读更多。
目前没有JS实现可以识别尾recursion。 正如其他人所说,ECMAScript 6中正在进行更改,V8上有一个打开的票据
在这里你可以看到V8生成的尾部recursion函数的汇编程序
https://gist.github.com/mcfedr/832e3553964a014621d5
比较一下,如何铿锵编译相同的function在C中
https://gist.github.com/mcfedr/63ad08370d856bad3694
V8保留了recursion调用,而C编译器已经识别了尾recursion,并将其改为循环