gpt4 book ai didi

javascript - ES6 尾递归优化堆栈溢出

转载 作者:IT王子 更新时间:2023-10-29 03:18:48 25 4
gpt4 key购买 nike

已阅读Dr Rauschmayer's description关于 es6 中的递归尾调用优化,我一直在尝试重新创建他详细介绍的递归阶乘函数的“零堆栈”执行。

使用 Chrome 调试器在堆栈帧之间步进,我看到尾部优化没有发生,并且正在为每个递归创建堆栈帧。

我还尝试通过在没有调试器的情况下调用函数来测试优化,而是将 100000 传递给阶乘函数。这会引发“最大堆栈”错误,这意味着它实际上并未优化。

这是我的代码:

const factorial = (n, acc = 1) => n <= 1 ? acc : factorial(n - 1, n * acc)
console.log( factorial(100000) )

结果:

Uncaught RangeError: Maximum call stack size exceeded

最佳答案

V8 是 Chrome 中的 JavaScript 引擎,有一段时间支持 TCO,但截至此更新的答案(2017 年 11 月),它不再支持,并且在撰写本文时,V8 中没有针对 TCO 的积极开发,也没有计划中。您可以在 the V8 tracking bug for it 中阅读详细信息.

TCO 支持似乎在 V8 中一度达到了不错的水平,但由于多种原因(调试问题、错误)仍然落后于一个标志。但随后发生了几件事,尤其是 the V8 team raised significant issues with TCO并强烈支持名为 syntactic tail calls (STCs) 的规范更改这将需要在源代码中有意标记尾调用(例如,return continue doThat();)。该提议变成了inactive不过,在 2017 年 7 月。同样在 7 月,在没有完成 TCO 工作的情况下,V8 团队从 TurboFan* 的源代码中删除了支持 TCO 的代码,否则它会受到 bitrot 的影响。 (例如,成为维护难题和错误来源。)

因此目前(2017 年 11 月)尚不清楚“隐形”TCO 是否会出现在 V8 中,是否会出现某种 STC,或者什么。 Chrome Platform Status page因为这表明来自 Mozilla (Firefox/SpiderMonkey) 和 Microsoft (Edge/Chakra) 关于支持 TCO 的“混合”公共(public)信号,即 Safari 随 TCO 一起发布,并且 Web 开发人员对该功能“持积极态度”。我们将看看我们从这里去哪里。如果有的话。

*(TurboFan = V8 中当前最先进的 JIT 编译器,现在他们有 switched 从 Full-Codegen [JIT] + Crankshaft [积极优化 JIT] 到 Ignition [interpreter+] 和 TurboFan [积极优化 JIT] )

关于javascript - ES6 尾递归优化堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com