我有一个用JavaScript实现的尾部递归寻路算法,想知道是否有(全部?)浏览器可能会出现堆栈溢出异常。
only
一种优化。支持它应该是语言规范的一部分,而不是编译器/解释器,因为使用TCO针对一个解释器/编译器编写的代码可能无法在没有TCO的解释器/编译器上工作。
我有一个用JavaScript实现的尾部递归寻路算法,想知道是否有(全部?)浏览器可能会出现堆栈溢出异常。
only
一种优化。支持它应该是语言规范的一部分,而不是编译器/解释器,因为使用TCO针对一个解释器/编译器编写的代码可能无法在没有TCO的解释器/编译器上工作。
Answers:
ECMAScript 4规范最初是要添加对TCO的支持,但已被删除:
据我所知,目前还没有广泛使用的JavaScript实现自动TCO。不过,这可能对您有用:
本质上,使用累加器模式可以达到相同的效果。
暂时没有喜悦,但值得庆幸的是,Harmony(ECMAScript版本6)计划正确的尾声 http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
将来,ECMAScript 6严格模式将支持尾部调用优化。检查http://www.2ality.com/2015/06/tail-call-optimization.html有关详细信息,。
检查http://kangax.github.io/compat-table/es6/以获取当前引擎支持。
目前(18-07-2019)以下引擎支持尾部调用优化:
如果“实验性JavaScript功能”标志已打开,则支持:
当前,没有JavaScript实现能够识别尾部递归。ECMAScript 6正在进行更改,正如其他人所说的,V8上有一张公开票。
在这里,您可以看到V8生成的用于尾递归函数的汇编器:
比较一下Clang在C语言中如何编译相同的函数
V8保留了递归调用,而C编译器已识别出尾递归并将其更改为循环。