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 条评论
登录 后参与评论

相关文章

是否对JavaScript引擎尾部调用(TCO)进行了优化?

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

Node.js:异步函数中是否对尾部调用进行了优化?

Java编译器是否针对不同的语言环境进行了翻译?

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

将int乘以30、31、32-编译器是否真的对它们进行了优化?(有效的Java这样说)

IEnumerable <T>,Task <T>和IDisposable是否在C#编译器中进行了硬编码?

Rust编译器使用“ loop”和“ while true”进行了哪些优化?

是否对克隆语句进行了优化?

Rust优化器为什么不删除那些无用的指令(在Godbolt编译器资源管理器上进行了测试)?

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

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

在3种主要的C ++编译器中,程序进行了不同的编译。哪一个是对的?

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

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

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

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

编译器是否可以优化递归调用?

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

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

C ++编译器是否优化重复的函数调用?

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

如何知道jtextarea中是否进行了任何更改?

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

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

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

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

虚函数调用的编译器优化

针对循环python进行了优化