使用基于堆栈计算机的语言添加嵌套函数支持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用基于堆栈计算机的语言添加嵌套函数支持相关的知识,希望对你有一定的参考价值。

假设我有一个简单的类C编程语言:

int foo() {
    int x = 10;
    int bar(y int) {
        return y * 2
    }
    return bar() + x
}

就像你看到的,它支持嵌套函数。 我已经实现了lexing-parsing阶段,现在我正在研究代码生成和堆栈机器。大多数操作,以及已经实现的简单流控制,但我需要一些帮助/想法如何解决嵌套函数任务。

堆栈机有两个寄存器,累加器和临时寄存器。 每个帧包含:[arguments, local variables, return address, caller frame and stack pointer, temporaries and data operations],我使用相同的堆栈作为调用帧和操作评估。也许我应该将它分成两个堆栈,一个用于调用帧,第二个用于操作评估。

我读到了两种实现嵌套函数的方法。一,使用激活链接(也称为静态链接)和显示。有没有更好的办法处理这个问题? 如果我选择其中一个想法,是编译时计算还是我需要在运行时存储一些东西?如果它是运行时的东西,它的时间复杂度是多少?是O(1)运算,还是O(k)之类的东西,其中k是函数的深度。

答案

静态链接需要O(k)时间来访问中间变量,而显示需要O(k)时间在每个帧上复制它,但总是在O(2)时间内进行变量访问。在实践中,静态链接实际上比显示器稍快一些,并且比闭合更好。

以上是关于使用基于堆栈计算机的语言添加嵌套函数支持的主要内容,如果未能解决你的问题,请参考以下文章

将片段添加到片段中(嵌套片段)

Go语言学习-函数

ActionBar 菜单项在嵌套片段中消失

替换或删除后台堆栈上现有片段的代码不起作用

onActivityResult() 未在新的嵌套片段 API 中调用

逆向——C语言的汇编表示之堆栈图 手把手示例 可以见后面在函数内部加一个局部变量以及嵌套调用的例子来综合理解