2
函数调用通过堆栈数据结构进行处理。这足以支持递归吗?设计编译器时处理递归是否需要特殊处理?
函数调用通过堆栈数据结构进行处理。这足以支持递归吗?设计编译器时处理递归是否需要特殊处理?
完全拥有堆栈是编译器在支持递归时必须具备的特殊处理。
在较早的FORTRAN版本的编程语言中,运行时环境没有函数堆栈,每个函数只有一个激活记录保留在内存中某处。这意味着递归并非完全可能,因为如果递归调用某个函数,则会覆盖其唯一的激活记录,从而失去了如何到达的上下文跟踪。
函数堆栈的引入是首先使得递归实际上以编程语言表达的。在此之前,程序员会使用递归作为抽象解决问题的工具,但由于缺少调用堆栈,必须将该代码翻译为迭代逻辑。
为了使编程语言支持递归,它需要有一些动态维护调用堆栈的机制。这不必通过明确的堆栈;你理论上可以动态分配所有的堆栈帧,并将它们链接在一起作为链表。例如,如果您想要支持协程或闭包,并且在函数返回后实际需要保留旧的激活记录,以便稍后可以存储数据,则这会很有用。
希望这会有所帮助!
这有很大的帮助。谢谢! – Halaby