Javascript引擎中尾部调用优化的实现

Javascript引擎中尾部调用优化的实现,javascript,firefox,chromium,v8,Javascript,Firefox,Chromium,V8,截至2019年2月,Mac上的Chrome版本71.0.3578.98 ,以下程序抛出uncaughtrangeerror:超过最大调用堆栈大小错误。计数为16516 const a = x => { console.log(x) a(x + 1) } a(1) 我在谷歌上搜索了很多次,但没有找到任何讨论Chrome或其他浏览器对尾部呼叫优化(TCO)支持的文章,也没有找到任何未来实现它的计划 我的两个问题是: Chrome或任何其他浏览器或Javascript引擎当前是否支持

截至2019年2月,Mac上的Chrome版本
71.0.3578.98
,以下程序抛出
uncaughtrangeerror:超过最大调用堆栈大小错误。
计数为
16516

const a = x => {
  console.log(x)
  a(x + 1)
}

a(1)
我在谷歌上搜索了很多次,但没有找到任何讨论Chrome或其他浏览器对尾部呼叫优化(TCO)支持的文章,也没有找到任何未来实现它的计划

我的两个问题是:

  • Chrome或任何其他浏览器或Javascript引擎当前是否支持TCO
  • 是否有计划在不久的将来在任何Javascript引擎中实现TCO

  • 我发现的帖子大多是旧的(2016年或更早),或者只是令人困惑。e、 g.

    即使TCO对我们所有人来说似乎都是一个白日梦,通过使用
    蹦床
    技术,您可以轻松地将代码转换为运行,就好像它正在进行尾部优化一样

    const a=x=>{
    如果(x>500000){
    控制台日志(x);
    返回;
    }
    return()=>a(x+1);//如果返回一个函数,它还没有被调用
    }
    常量蹦床=fn=>(…args)=>{
    让结果=fn(…args)
    //反复调用函数,直到达到基本情况
    while(typeof result==='function'){
    结果=结果();
    }
    返回结果;
    }
    var t=蹦床(a);
    t(1)TCO,或者更确切地说,JavaScript中的尾部调用消除——在讨论中通常也称为适当的尾部调用(PTC)——是一个漫长而悲伤的故事

    2011年前后,TC39(JavaScript标准委员会)决定对即将发布的ES6标准采用强制性的TCE,这得到了所有主要浏览器供应商的一致同意

    2015年,新标准正式采用,名称为EcmaScript 2015。在这一点上,没有浏览器真正实现了TCE,主要是因为ES2015中有太多被认为更重要的新功能。(今天的JS特性建议及其采用过程,包括在生产引擎中实现两个功能的要求,对于ES6还不存在。)

    2016年初,Safari和Chrome都实施了TCE。Safari宣布将推出这款手机,而Chrome则将其保留在一个实验性的功能标志后面。其他浏览器(Firefox和InternetExplorer/Edge)也开始研究它,并重新考虑。关于这到底是不是一个可行的特性的讨论也在不断发展。Edge在为Windows ABI高效实现时遇到问题,Firefox担心开发人员在堆栈跟踪中“丢失”调用的体验(这一问题在2011年已经详细讨论过)

    为了在拯救尾部调用功能的同时解决其中一些问题,包括Chrome和Edge团队在内的一些成员建议将尾部调用显式化,即要求使用附加关键字对返回语句进行注释,以选择尾部调用语义。这些所谓的“STC”是在Chrome中实现的,作为概念证明

    在2016年5月的TC39会议上,尾声问题被广泛讨论了几乎一整天,但没有得到解决。Firefox和Edge明确表示,他们不会按照标准的规定实现TCE。Firefox成员提议将其删除。Safari和Chrome不同意这一点,Safari团队明确表示,他们无意取消TCE。语法尾部调用的提议也遭到了拒绝,特别是Safari。委员会陷入僵局。你可以看报纸

    就我所知,从技术上讲,这种僵局今天仍然存在。不过,实际上,对JavaScript的尾部调用几乎已经死了,现在还不清楚它们是否还会回来。至少这是Chrome团队在灾难性的会议后得出的结论,会议决定从Chrome中删除尾部调用的实现,以简化引擎并防止比特腐烂。它们在Safari中仍然可用


    披露:我在2017年之前一直是TC39和Chrome/V8团队的成员,所以我的观点可能有偏见。

    回答得好!你可能想把它重新贴上,或者我把它当作复制品,然后谢谢你的精彩回答。非常感谢!(悲哀地)非常说明性的回答。仅供将来参考,值得一提的是,有一个经过彻底测试的库,它可能是类似trampoline@Tom,我不会说是蓄意破坏,但最终是微软和Mozilla明确表示,正如我在回答中提到的那样,他们不想实施它们。“语法尾部调用”这将是一个很好的补充——任何支持PTC的语言都将受益于使用一些语法方法来标记开发人员使用尾部调用递归的意图,以帮助未来的维护人员避免意外地重构优化。