【问题标题】:Does handling recursion need special treatment when designing a compiler?在设计编译器时处理递归是否需要特殊处理?
【发布时间】:2011-11-12 15:22:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2011-08-01
      • 1970-01-01
      • 2022-01-09
      • 2014-02-21
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多