ML系列编译器是否对尾部调用进行了任何复杂的优化?

扎克·霍尔

我(相信)以下函数定义是尾递归的:

fun is_sorted [] = true
  | is_sorted [x] = true
  | is_sorted (x::(y::xs)) =
    if x > y
       then false
       else is_sorted (y::xs)

简单来说,它等效于以下声明

fun is_sorted [] = true
  | is_sorted [x] = true
  | is_sorted (x::(y::xs)) = 
    (x <= y) andalso (is_sorted (y::xs))

但是在此版本中,最后一步是应用“ andalso”,因此它不是尾递归的。或看起来如此,除了(由于NJ的)ML(至少是标准)使用短路评估外,andand实际上是/ not /的最后一步。那么此功能是否可以进行尾部调用优化?还是在其他有趣的情况下,实际上显然不使用尾递归的ML函数得到了优化?

杰弗里·斯科菲尔德

如果我将您的第二个功能转换为OCaml,则会得到以下信息:

let rec is_sorted : int list -> bool = function
| [] -> true
| [_] -> true
| x :: y :: xs -> x < y && is_sorted xs

ocamlopt将其编译为尾递归函数。生成的代码(x86_64)的本质是这样的:

        .globl      _camlAndalso__is_sorted_1008
_camlAndalso__is_sorted_1008:
        .cfi_startproc
.L103:
        cmpq        $1, %rax
        je  .L100
        movq        8(%rax), %rbx
        cmpq        $1, %rbx
        je  .L101
        movq        (%rbx), %rdi
        movq        (%rax), %rax
        cmpq        %rdi, %rax
        jge .L102
        movq        8(%rbx), %rax
        jmp .L103
        .align      2
.L102:
        movq        $1, %rax
        ret
        .align      2
.L101:
        movq        $3, %rax
        ret
        .align      2
.L100:
        movq        $3, %rax
        ret
        .cfi_endproc

如您所见,此代码中没有递归调用,只是一个循环。

(但是其他张贴者说的对,OCaml在复杂分析方面所做的工作并不多。这种特殊结果似乎非常简单。)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否对不使用模板参数的模板化类的方法进行了编译器优化?

来自分类Dev

如何确定Swift是否使用优化进行了编译

来自分类Dev

微观优化,是否已通过现代浏览器进行了优化?

来自分类Dev

Visual Studio是否针对超线程微处理器进行了优化?

来自分类Dev

选择的StringProperty是否针对枚举值进行了优化?

来自分类Dev

是否对if(0)和if(1)语句进行了优化?

来自分类Dev

Ubuntu是否针对多核CPU进行了优化?

来自分类Dev

OpenCV是否在调试模式下进行了优化?

来自分类Dev

数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

来自分类Dev

编译器是否优化了虚拟调用?

来自分类Dev

编译器是否优化(关闭)相同的FieldByName调用?

来自分类Dev

是否允许编译器进行这种优化?

来自分类Dev

如何使用JavaScript检查是否对服务器进行了调用

来自分类Dev

如何检查是否在DataGridView中进行了任何更改

来自分类Dev

如何检查rsync是否对bash进行了任何更改?

来自分类Dev

Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

来自分类Dev

是否在运行时对没有变量的C函数调用进行了预编译或评估?

来自分类Dev

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

来自分类Dev

针对循环python进行了优化

来自分类Dev

节点的http服务器是否对ReadableStream请求进行了任何Content-Length验证

来自分类Dev

节点的http服务器是否对ReadableStream请求进行了任何Content-Length验证

来自分类Dev

使用C ++,有没有一种方法可以检测编译器/系统是否对浮点数/双精度数异常进行了“规范化”?

来自分类Dev

编译器是否优化String文字?

来自分类Dev

C#语言编译器是否自行执行任何实际的优化?

来自分类Dev

scala编译器是否会做任何事情来优化隐式类?

来自分类Dev

箭头函数是否像命名函数一样进行了优化?

来自分类Dev

通过值在堆栈上返回变量是否针对移动进行了优化?

来自分类Dev

如何确定给定的表是否对内存进行了优化?

来自分类Dev

是否仅对Azure表存储分区键查询进行了优化?

Related 相关文章

  1. 1

    是否对不使用模板参数的模板化类的方法进行了编译器优化?

  2. 2

    如何确定Swift是否使用优化进行了编译

  3. 3

    微观优化,是否已通过现代浏览器进行了优化?

  4. 4

    Visual Studio是否针对超线程微处理器进行了优化?

  5. 5

    选择的StringProperty是否针对枚举值进行了优化?

  6. 6

    是否对if(0)和if(1)语句进行了优化?

  7. 7

    Ubuntu是否针对多核CPU进行了优化?

  8. 8

    OpenCV是否在调试模式下进行了优化?

  9. 9

    数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

  10. 10

    编译器是否优化了虚拟调用?

  11. 11

    编译器是否优化(关闭)相同的FieldByName调用?

  12. 12

    是否允许编译器进行这种优化?

  13. 13

    如何使用JavaScript检查是否对服务器进行了调用

  14. 14

    如何检查是否在DataGridView中进行了任何更改

  15. 15

    如何检查rsync是否对bash进行了任何更改?

  16. 16

    Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

  17. 17

    是否在运行时对没有变量的C函数调用进行了预编译或评估?

  18. 18

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

  19. 19

    针对循环python进行了优化

  20. 20

    节点的http服务器是否对ReadableStream请求进行了任何Content-Length验证

  21. 21

    节点的http服务器是否对ReadableStream请求进行了任何Content-Length验证

  22. 22

    使用C ++,有没有一种方法可以检测编译器/系统是否对浮点数/双精度数异常进行了“规范化”?

  23. 23

    编译器是否优化String文字?

  24. 24

    C#语言编译器是否自行执行任何实际的优化?

  25. 25

    scala编译器是否会做任何事情来优化隐式类?

  26. 26

    箭头函数是否像命名函数一样进行了优化?

  27. 27

    通过值在堆栈上返回变量是否针对移动进行了优化?

  28. 28

    如何确定给定的表是否对内存进行了优化?

  29. 29

    是否仅对Azure表存储分区键查询进行了优化?

热门标签

归档