繁体   English   中英

是否有任何 JavaScript 引擎尾调用 (TCO) 优化?

[英]Are any JavaScript engines tail call (TCO) optimized?

我有一个用 JavaScript 实现的尾递归寻路算法,想知道是否有任何(所有?)浏览器可能会出现堆栈溢出异常。

ECMAScript 4 规范原本打算添加对 TCO 的支持,但它被删除了:

JavaScript 中不再有尾调用?

据我所知,目前还没有广泛使用的 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/以获得当前的引擎支持。

目前(18-07-2019)以下引擎支持尾调用优化:

  • Safari >= 10
  • iOS >= 10
  • 奇诺玛XS6
  • 杜克磁带 2.3

如果打开“实验性 JavaScript 功能”标志,则支持:

  • 节点 6.5
  • Chrome 54 / Opera 41当前版本的兼容性表不再列出

现在可以在编译为 JavaScript 的LispyScript中使用尾调用优化。 您可以在此处阅读更多相关信息。

目前没有 JavaScript 实现识别尾递归。 ECMAScript 6正在发生变化,正如其他人所说, V8上有一张公开票。

在这里你可以看到 V8 为尾递归函数生成的汇编程序:

V8 如何编译递归的例子

将其与Clang如何在 C 中编译相同的函数进行比较

C 编译器尾递归示例

V8 保留递归调用,而 C 编译器已识别尾递归并将其更改为循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM