为什么编译器无法自动优化常规递归?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么编译器无法自动优化常规递归?相关的知识,希望对你有一定的参考价值。

在几乎所有函数式编程教程中,大部分专门用于教您如何将算法转换为尾递归格式,因为这可以优化为循环。

这很好,但它让我想知道为什么编译器不能使用“常规”递归自动转换算法以使用单独的堆栈对象(在堆上分配),然后将算法转换为迭代的算法。

我不完全理解CHICKEN Scheme或Haskell编译器是如何工作的(我听说它可能不受堆栈溢出的影响),但也许它们正在做这样的事情?如果是这样,为什么不能在大多数语言中完成?

我不是这样对badmouth编译工程师说的,我只是真的不知道这些东西是如何运作的,但是我很乐意学习。

答案

首先,不能和目前没有区别

由于你的建议不是技术上难以理解的,那不会完成,或者在你的一生中不会完成,看来它们实际上可能是

他们为什么不这样做的隐含问题是猜测,但可能是基于在有或没有优化的情况下保证相同结果需要多少资源

我不会错过导致错误的优化级别存在很大不确定性的日子,所以我很乐意等待它直到完美

据我所知,标准中没有任何内容可以排除这种优化

以上是关于为什么编译器无法自动优化常规递归?的主要内容,如果未能解决你的问题,请参考以下文章

尾递归

为啥无法编译递归 PromiseKit 函数?

递归类型转换

Swift 编程中的尾递归和蹦床译

尾递归优化

软件工程每个程序员都应当知道的编译器优化知识