为什么没有javascript引擎支持尾部调用优化?
我最近在Haskell学习了尾部调用优化。我从以下帖子中了解到,这不是javascript的一个功能:为什么没有javascript引擎支持尾部调用优化?,javascript,recursion,tail-recursion,tail-call-optimization,Javascript,Recursion,Tail Recursion,Tail Call Optimization,我最近在Haskell学习了尾部调用优化。我从以下帖子中了解到,这不是javascript的一个功能: javascript的设计中是否有一些固有的东西使得尾部调用优化特别困难?为什么这是haskell这样的语言的一个主要功能,但现在只是作为某些javascript引擎的一个功能进行讨论?javascript支持尾部调用优化。目前还没有浏览器实现它,但随着规范(ES2015)的最终确定,所有环境都必须实现它。像BabelJS这样的将新JavaScript转换为旧JavaScript的Tr
javascript的设计中是否有一些固有的东西使得尾部调用优化特别困难?为什么这是haskell这样的语言的一个主要功能,但现在只是作为某些javascript引擎的一个功能进行讨论?javascript支持尾部调用优化。目前还没有浏览器实现它,但随着规范(ES2015)的最终确定,所有环境都必须实现它。像BabelJS这样的将新JavaScript转换为旧JavaScript的Transpiler已经支持它,您现在就可以使用它了 巴贝尔的翻译非常简单:
function tcoMe(x){
if(x === 0) return x;
return tcoMe(x-1)
}
转换为:
function tcoMe(_x) {
var _again = true;
_function: while (_again) {
var x = _x;
_again = false;
if (x === 0) return x;
_x = x - 1;
_again = true;
continue _function;
}
}
这是一个while循环
至于为什么它只是新支持的,社区没有太大的需要尽快这么做,因为它是一种带有循环的命令式语言,所以在绝大多数情况下,您可以自己编写此优化(不像Bergi指出的在MLs中需要这样做)。我认为ES6将提供它。是的,我相信您是正确的。我更想知道为什么现在才将其作为一项功能添加?请参阅解释尾部调用优化中的困难。是的,它肯定会在ES6中实现。最大的区别是,TCO在haskell中是必需的,而它只是其他语言中增加编译器复杂性的一个功能。此外,大规模递归也会遇到调用堆栈限制,这在默认情况下非常小。我认为JS(从ES5开始)在过去主要不是针对递归的。你不是指机器语言,对吗?@Bergi hehe,不,我是指[ML](,这是一个语言家族,像OCaml和F#(直接方言)以及Haskell(计算不严格但想法相同的ML),虽然该语句对scheme等其他函数式语言同样适用。是的,这是我所怀疑的,但复数形式让我困惑。我从未将ML称为语言家族:-)尾部调用可以重用其封闭函数的堆栈框架(相同的返回点)。只需初始化包含参数的内部变量。这是否意味着,对于JS引擎来说,尾部调用与命令式循环一样可以很好地优化?通常我不关心微观优化,但当涉及到迭代时…@IvenMarquardt是的,潜在的尾部调用也同样快。