【发布时间】: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