在阅读了es6中递归尾部调用优化的Dr Rauschmayer's description之后,我一直在尝试重新创建他详细描述的递归阶乘函数的“零堆栈”执行。
使用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发布于 2017-03-14 22:10:47
V8,Chrome中的JavaScript引擎,有一段时间支持总拥有成本,但截至2017年11月的更新答案,它不再支持,在撰写本文时,在V8中没有关于总拥有成本的积极开发,也没有计划。您可以在the V8 tracking bug for it中阅读详细信息。
在V8中,总体拥有成本支持似乎一度达到了一个像样的水平,但由于几个原因(调试问题,错误),仍然落后于旗帜。但随后发生了几件事,尤其是the V8 team raised significant issues with TCO和强烈支持名为syntactic tail calls (STCs)的规范更改,这将要求在源代码中故意标记尾部调用(例如,return continue doThat();)。不过,该提案在2017年7月成为了inactive。同样在7月份,在没有完成总拥有成本工作的情况下,V8团队从TurboFan的源代码中删除了支持总拥有成本的代码*,否则它将受到比特率的影响。(例如,成为维护的痛苦和bug的来源。)
因此,目前(2017年11月)还不清楚“隐形”总拥有成本是否会出现在V8中,是否会出现某种类型的STC,或者其他什么。这方面的Chrome Platform Status page表明,Mozilla (火狐/SpiderMonkey)和微软(Edge/Chakra)在支持总体拥有成本方面发出了“混合”的公开信号,Safari附带了总拥有成本,web开发人员对该功能持“积极”态度。我们将看到我们将从这里走向何方。如果在任何地方。
* (TurboFan =当前V8中的尖端即时编译器,现在他们已经从完整的Codegen即时编译+曲轴积极优化即时编译到点火interpreter+和TurboFan积极优化即时编译)
发布于 2017-11-10 00:56:02
V8 (Chrome的JS引擎)团队暂时没有实施总拥有成本。它是从最新版本(see this thread)中剥离出来的。
在主要的浏览器中,only Safari has actually implemented the feature。
在Node.JS版本8和更高版本中,TCO is not available。
总拥有成本的实施可能有一些希望:在2017 WebAssembly meeting中,谷歌和所有其他团队对进一步探索总拥有成本的实施持中立或积极的态度。
https://stackoverflow.com/questions/42788139
复制相似问题