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

阿斯洛安

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

javascript的设计中是否存在固有的某些特性,这些特性使尾部调用优化特别困难?为什么这是haskell这样的语言的主要功能,但是现在才作为某些JavaScript引擎的功能进行讨论?

本杰明·格伦鲍姆(Benjamin Gruenbaum)

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

那就是-一会儿循环。

至于为什么只有新的支持,社区并没有太大的要求尽快这样做,因为这是一种带有循环的命令式语言,因此在大多数情况下,您可以自己编写此优化程序(不同于需要此功能的MLs) ,如Bergi所指出)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么尾部调用优化需要操作码?

来自分类Dev

为什么Scala中的这个函数调用没有被优化?

来自分类Dev

Java是否支持并优化尾部递归调用?

来自分类Dev

为什么Emacs Lisp中没有尾部递归优化,而不是像其他方案一样?

来自分类Dev

为什么Emacs Lisp中没有尾部递归优化,而不是像其他方案一样?

来自分类Dev

纯功能,为什么没有优化?

来自分类Dev

为什么在我的onload中没有调用我的javascript?

来自分类Dev

为什么我的JavaScript函数显然没有被调用?

来自分类Dev

像Babel这样的编译器如何在固有地不受支持的情况下实现尾部调用优化?

来自分类Dev

当我在OnClientClick中调用Javascript函数时,为什么我的Javascript函数没有被调用

来自分类常见问题

JavaScript尾部调用中的函数是否已优化?

来自分类Dev

Java 8是否具有尾部调用优化功能?

来自分类Dev

.NET JIT编译器为什么会决定不内联或优化对没有副作用的空静态方法的调用?

来自分类Dev

为什么没有自动调用TestInitialize?

来自分类Dev

为什么我的函数没有被调用?

来自分类Dev

为什么我的方法没有调用?

来自分类Dev

为什么 webViewDidStartLoad 没有调用?

来自分类Dev

为什么方法没有被调用

来自分类Dev

为什么没有调用 locationManager (:didUpdateLocations)

来自分类Dev

为什么在python中阅读文本时尾部都没有?

来自分类Dev

为什么没有优化该无操作循环?

来自分类Dev

为什么编译器没有优化此负载

来自分类Dev

为什么在Erlang中没有多行注释支持?

来自分类Dev

为什么 HttpClient 中没有对 PATCH 的开箱即用支持?

来自分类Dev

为什么setTimeout调用的函数没有调用栈限制?

来自分类Dev

有没有一种方法可以显式地编写一个长生不老药的函数以优化尾部调用?

来自分类Dev

为什么Collections.sort()为LinkedList的优化,但对于ArrayList的是没有优化?

来自分类Dev

为什么函数包装没有在JavaScript中未调用的函数对象

来自分类Dev

为什么我的div中没有调用我的javascript函数?

Related 相关文章

  1. 1

    为什么尾部调用优化需要操作码?

  2. 2

    为什么Scala中的这个函数调用没有被优化?

  3. 3

    Java是否支持并优化尾部递归调用?

  4. 4

    为什么Emacs Lisp中没有尾部递归优化,而不是像其他方案一样?

  5. 5

    为什么Emacs Lisp中没有尾部递归优化,而不是像其他方案一样?

  6. 6

    纯功能,为什么没有优化?

  7. 7

    为什么在我的onload中没有调用我的javascript?

  8. 8

    为什么我的JavaScript函数显然没有被调用?

  9. 9

    像Babel这样的编译器如何在固有地不受支持的情况下实现尾部调用优化?

  10. 10

    当我在OnClientClick中调用Javascript函数时,为什么我的Javascript函数没有被调用

  11. 11

    JavaScript尾部调用中的函数是否已优化?

  12. 12

    Java 8是否具有尾部调用优化功能?

  13. 13

    .NET JIT编译器为什么会决定不内联或优化对没有副作用的空静态方法的调用?

  14. 14

    为什么没有自动调用TestInitialize?

  15. 15

    为什么我的函数没有被调用?

  16. 16

    为什么我的方法没有调用?

  17. 17

    为什么 webViewDidStartLoad 没有调用?

  18. 18

    为什么方法没有被调用

  19. 19

    为什么没有调用 locationManager (:didUpdateLocations)

  20. 20

    为什么在python中阅读文本时尾部都没有?

  21. 21

    为什么没有优化该无操作循环?

  22. 22

    为什么编译器没有优化此负载

  23. 23

    为什么在Erlang中没有多行注释支持?

  24. 24

    为什么 HttpClient 中没有对 PATCH 的开箱即用支持?

  25. 25

    为什么setTimeout调用的函数没有调用栈限制?

  26. 26

    有没有一种方法可以显式地编写一个长生不老药的函数以优化尾部调用?

  27. 27

    为什么Collections.sort()为LinkedList的优化,但对于ArrayList的是没有优化?

  28. 28

    为什么函数包装没有在JavaScript中未调用的函数对象

  29. 29

    为什么我的div中没有调用我的javascript函数?

热门标签

归档