![](/img/trans.png)
[英]Is continuation style implementation of factorial tail call optimized (TCO)?
[英]Are any JavaScript engines tail call (TCO) optimized?
我有一个用 JavaScript 实现的尾递归寻路算法,想知道是否有任何(所有?)浏览器可能会出现堆栈溢出异常。
ECMAScript 4 规范原本打算添加对 TCO 的支持,但它被删除了:
据我所知,目前还没有广泛使用的 JavaScript 实现可以实现自动 TCO。 不过,这可能对您有用:
本质上,使用累加器模式可以实现相同的效果。
暂时没有快乐,但幸运的是,Harmony(ECMAScript 版本 6)有适当的尾调用http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
未来将在 ECMAScript 6 严格模式中支持尾调用优化。 查看http://www.2ality.com/2015/06/tail-call-optimization.html了解详情。
检查http://kangax.github.io/compat-table/es6/以获得当前的引擎支持。
目前(18-07-2019)以下引擎支持尾调用优化:
如果打开“实验性 JavaScript 功能”标志,则支持:
现在可以在编译为 JavaScript 的LispyScript中使用尾调用优化。 您可以在此处阅读更多相关信息。
目前没有 JavaScript 实现识别尾递归。 ECMAScript 6正在发生变化,正如其他人所说, V8上有一张公开票。
在这里你可以看到 V8 为尾递归函数生成的汇编程序:
将其与Clang如何在 C 中编译相同的函数进行比较
V8 保留递归调用,而 C 编译器已识别尾递归并将其更改为循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.