Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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引擎支持尾部调用优化?_Javascript_Recursion_Tail Recursion_Tail Call Optimization - Fatal编程技术网

为什么没有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

我最近在Haskell学习了尾部调用优化。我从以下帖子中了解到,这不是javascript的一个功能:


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是的,潜在的尾部调用也同样快。