Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否对JavaScript引擎尾部调用(TCO)进行了优化?_Javascript_Functional Programming_Tail Recursion - Fatal编程技术网

是否对JavaScript引擎尾部调用(TCO)进行了优化?

是否对JavaScript引擎尾部调用(TCO)进行了优化?,javascript,functional-programming,tail-recursion,Javascript,Functional Programming,Tail Recursion,我有一个用JavaScript实现的尾部递归寻路算法,我想知道是否有(所有?)浏览器可能会出现堆栈溢出异常。几乎所有遇到的浏览器都会对“太多递归”感到厌烦。这是一本可能会很有趣的书 如果是简单的自递归,那么使用显式迭代可能是值得的,而不是希望消除尾部调用。ECMAScript 4规范最初打算增加对TCO的支持,但后来被放弃了: 据我所知,目前还没有广泛使用的JavaScript实现能够自动实现TCO。不过,这可能对您有用: 本质上,使用累加器模式也可以达到同样的效果。暂时没有什么乐趣,但谢天

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

几乎所有遇到的浏览器都会对“太多递归”感到厌烦。这是一本可能会很有趣的书


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

ECMAScript 4规范最初打算增加对TCO的支持,但后来被放弃了:


据我所知,目前还没有广泛使用的JavaScript实现能够自动实现TCO。不过,这可能对您有用:


本质上,使用累加器模式也可以达到同样的效果。

暂时没有什么乐趣,但谢天谢地,为Harmony(ECMAScript版本6)安排了适当的尾部调用

尾部调用优化现在可以在其中编译为JavaScript。您可以阅读更多有关它的信息。

目前没有JavaScript实现识别尾部递归。改革正在进行中,正如其他人所说,这是一个开放的门票

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

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


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

将来ECMAScript 6严格模式将支持尾部调用优化。查看详细信息

检查当前的发动机支架

目前(2019年7月18日),以下发动机支持尾部呼叫优化:

  • 狩猎>=10
  • iOS>=10
  • 基诺马XS6
  • Duktape 2.3
如果“实验JavaScript功能”-标志已打开,则支持:

  • 节点6.5
  • Chrome 54/Opera 41当前版本的compat表不再列出它

它实际上是一种递归算法,还是用递归实现的迭代算法?我的理解是,TCO只能帮助后者。我只想补充一点,TCO不仅仅是一种优化。支持它应该是语言规范的一部分,而不是编译器/解释器,因为针对一个具有TCO的解释器/编译器编写的代码在没有TCO的解释器/编译器上可能无法工作。在Kangax的ES6兼容性表中,您可以看到当前的支持,并可以看到它在不同引擎之间的发展(尾部调用优化)是关于任何尾部调用,而不仅仅是递归尾部调用。仅供参考,Rhino在“解释”模式(opt=-1)下具有自动TCO和连续性(抱歉拖拉)ECMAScript 6包含了TCO,在规范中称为正确的尾部调用。@sclv:蹦床引用是什么?累加器模式没有达到与TCO相同的效果。它只是将递归算法转换为尾部递归形式。这是TCO成为可能的先决条件,但不能替代它。您仍然可以用一种不优化尾部调用的语言来描述堆栈。“目前没有广泛使用的JS实现实现自动TCO”如果您通过了正确的测试,那么从Node 6.2.0开始,这是不正确的flag@MarkWilbur这个问题是关于浏览器的,而不是关于ECMAScript的所有现有实现。@UselessCode不,这个问题是关于“Javascript引擎”所以…不仅仅是browsers@BT确实有许多非浏览器JS环境,标题使用了更通用的“Javascript引擎”,但问题的主体指定“…想知道是否有(所有?)浏览器可能会出现堆栈溢出异常。”我必须反击“,但标题说。。。".我想因为他提到了这两个,所以问题是关于这两个方面的。但如果你说这并没有使答案过时,那你是对的。@MarkWilbur据我所知,node使用了与chrome相同版本的v8——目前不支持do TCO——我对JS有一个要点,而当前v8产生的优化汇编程序——这个bug有finally已被接受。它在epic“Feature Request Harmony”下。希望这意味着他们计划将其添加到V8中的ES6支持中。您可以在Internet Explorer中投票支持TCO:相互递归如何?“目前没有JS实现识别尾部递归。”这在Node 6.2.0中是不正确的,但您必须通过一个标志