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

Compiler construction 在设计编译器时,处理递归是否需要特殊处理?,compiler-construction,recursion,stack,language-design,language-implementation,Compiler Construction,Recursion,Stack,Language Design,Language Implementation,函数调用通过堆栈数据结构进行处理。这就足以支持递归了吗?拥有堆栈是编译器在支持递归时必须具备的特殊处理方式 在较旧的编程语言(如早期版本的FORTRAN)中,运行时环境没有函数堆栈,每个函数在内存中的某个位置都有一个保留的激活记录。这意味着递归根本不可能,因为如果你递归调用一个函数,你会覆盖它唯一的激活记录,失去你到达那里的背景 函数堆栈的引入首先使递归能够在编程语言中实际表达。在此之前,程序员将使用递归作为抽象解决问题的工具,但由于缺少调用堆栈,因此必须将代码转换为迭代逻辑 为了使编程语言支持

函数调用通过堆栈数据结构进行处理。这就足以支持递归了吗?

拥有堆栈是编译器在支持递归时必须具备的特殊处理方式

在较旧的编程语言(如早期版本的FORTRAN)中,运行时环境没有函数堆栈,每个函数在内存中的某个位置都有一个保留的激活记录。这意味着递归根本不可能,因为如果你递归调用一个函数,你会覆盖它唯一的激活记录,失去你到达那里的背景

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

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

希望这有帮助