是否优化了任何 JavaScript 引擎尾调用 (TCO)? [重复]

问题描述 投票:0回答:6

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

javascript functional-programming tail-recursion
6个回答
48
投票

ECMAScript 4 规范原本打算加入对 TCO 的支持,但被放弃了:

JavaScript 中不再有尾调用了吗?

截至 2010 年,目前没有广泛可用的 JavaScript 实现自动执行 TCO。


查看最新更新的评论。


26
投票

暂时不高兴,但值得庆幸的是,为 Harmony(ECMAScript 版本 6)准备了适当的尾调用 http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls


13
投票

未来ECMAScript 6严格模式将支持尾调用优化。查看http://www.2ality.com/2015/06/tail-call-optimization.html了解详情。

检查 http://kangax.github.io/compat-table/es6/ 当前引擎支持。

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

  • 野生动物园 >= 10
  • iOS >= 10
  • 基诺玛 XS6
  • 杜克胶带 2.3

如果打开“实验性 JavaScript 功能”-flag 则支持:

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

12
投票

几乎所有你遇到的浏览器都会厌恶“过多的递归”。这是 V8 错误跟踪器中的条目,阅读起来可能会很有趣。

如果它是简单的自递归,那么使用显式迭代而不是希望消除尾调用可能是值得的。


3
投票

尾调用优化现在可用于编译为 JavaScript 的 LispyScript。你可以阅读更多关于它这里.


2
投票

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

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

V8如何编译递归的例子

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

C编译器尾递归的例子

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

© www.soinside.com 2019 - 2024. All rights reserved.