为什么没有javascript引擎支持尾调优化?

时间:2015-07-07 15:41:30

标签: javascript recursion tail-recursion tail-call-optimization

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

javascript设计中是否存在固有的尾部调用优化特别困难的东西?为什么这是像haskell这样的语言的主要特征,但现在才被讨论为某些javascript引擎的特性?

1 个答案:

答案 0 :(得分:6)

JavaScript支持尾调用优化。没有任何浏览器实现它,但它随着规范(ES2015)的最终确定而来,所有环境都将来实现它。像BabelJS这样将新JavaScript转换为旧JavaScript的运营商已经支持它,您今天就可以使用它。

Babel的翻译非常简单:

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;
    }
}

那是 - 到一个循环。

至于为什么它只支持,社区中没有一个很大的需要来更快地这样做,因为它是一个带有循环的命令式语言,所以对于广大大多数情况下你可以自己编写这个优化(不像需要这样的ML,正如Bergi指出的那样)。