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

Why do no javascript engines support tail call optimization?

本文关键字:尾部 调用 优化 支持 引擎 javascript 为什么      更新时间:2023-09-26

我最近学习了Haskell中的尾部调用优化。我从下面的帖子中了解到这不是javascript的特性:

  • 尾部递归优化JavaScript?
  • 任何Javascript引擎尾部调用优化?

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

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

即- to一个while循环。

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