【问题标题】:Why can't compilers automatically optimize regular recursion?为什么编译器不能自动优化正则递归?
【发布时间】:2019-08-11 07:22:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这是一个非常广泛的问题,但肯定还有很多可用的学习资源(尽管围绕两三年前的开创性论文建立付费墙的趋势令人痛苦)。这是 Henry Baker 在archive.org 上的论文,例如:web.archive.org/web/20190202232914/http://home.pipeline.com/…
  • 底线:是的,他们可以,但要付出一定的代价。只有当你确信结果的价值时,你才会付出代价。一些语言设计者(和用户)有这种信念;其他人没有。
  • 是的,性能。虽然它也让运行时支持更加复杂(例如垃圾收集),但这也是一种成本。
  • 没有什么可以说服委员会相信它的实用性的详细提案。 (换句话说,不要屏住呼吸。)请注意,有讨论 C++ 标准的开放论坛,但不包括 StackOverflow 上的 cmets 线程。见isocpp.org
  • c++ 肯定有运行时。除其他外,它需要它在引发异常时展开堆栈(并调用析构函数)。还有其他 C++ 特性(甚至 C 特性)需要运行时支持,包括独立实现所需的标准库部分,其中许多不能用可移植 C++ 编写。我会考虑转换 cmets。

标签: compiler-construction programming-languages theory compiler-theory


【解决方案1】:

首先,cannot 和 current do not 之间是有区别的

由于您的建议在技术上不是所谓的困难,即不会完成,或者在您的有生之年不会完成,看来他们实际上可以

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

我不会错过优化级别的巨大不确定性导致错误的日子,所以我很高兴等待它完善

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

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 2015-09-15
    • 2018-11-14
    • 2012-04-07
    • 2015-05-13
    • 2019-02-18
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多