compiler-construction - 在设计编译器时,处理递归是否需要特殊处理?

标签 compiler-construction recursion stack language-design language-implementation

函数调用是通过堆栈数据结构处理的。这足以支持递归吗?

最佳答案

拥有堆栈编译器在支持递归时必须进行的特殊处理。

在早期版本的 FORTRAN 等较旧的编程语言中,运行时环境没有函数堆栈,并且每个函数在内存中的某处都为其保留了一条激活记录。这意味着递归根本不可能,因为如果您递归地调用一个函数,您将覆盖其唯一的激活记录,从而无法跟踪您如何到达那里的上下文。

函数堆栈的引入首先使得递归能够真正用编程语言表达。在此之前,程序员会使用递归作为抽象解决问题的工具,但由于缺乏调用堆栈,必须将代码转换为迭代逻辑。

为了让编程语言支持递归,它需要有一些动态维护调用堆栈的机制。这不必通过显式堆栈;理论上,您可以动态分配所有堆栈帧并将它们作为链表链接在一起。例如,如果您想要支持协程或闭包,并且实际上需要在函数返回后保留旧的激活记录,以便稍后存储数据,这可能很有用。

希望这有帮助!

关于compiler-construction - 在设计编译器时,处理递归是否需要特殊处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342543/

相关文章:

compiler-construction - 创建没有编译器的可执行文件

c - 为什么即使我反转了两个参数,这个函数调用仍然有效?

Javascript:递归、jQuery 错误

java - 从单词中删除字符的算法,使得减少的单词仍然是字典中的单词

java - 从用户输入读取堆栈的整数

c - 编写C编译器时遇到的问题

compiler-construction - 使用openjdk 1.6或sun jdk1.6编译代码

c - 如何使用递归在链表中添加整数?

c++ - 对依赖基类成员的非限定访问导致 "A declaration of [x] must be available"

java - 反转数组中的元素,并使用单个 for 循环将反转后的元素压入堆栈