我已经寻找可以回答我的问题的建议问题,但没有找到任何相关问题。
我正在研究编译器设计,并遇到了一种语言支持嵌套词法作用域的特性。这意味着外部变量对于在其他函数中定义的内部函数是可见的。但是,要做到这一点,需要知道在哪个堆栈框架和在哪个偏移量找到相关变量。如果我们的递归深度取决于用户输入,编译器如何在符号表中发出此信息?
谢谢!
我已经寻找可以回答我的问题的建议问题,但没有找到任何相关问题。
我正在研究编译器设计,并遇到了一种语言支持嵌套词法作用域的特性。这意味着外部变量对于在其他函数中定义的内部函数是可见的。但是,要做到这一点,需要知道在哪个堆栈框架和在哪个偏移量找到相关变量。如果我们的递归深度取决于用户输入,编译器如何在符号表中发出此信息?
谢谢!
示例:范围 A 包含范围 B,范围 B 包含范围 C。在范围 C 中,有一个对
va
在范围 A 中声明的变量的引用。当编译作用域 C 时,编译器知道
va
在 A 中声明了。尽管它不知道 A 的堆栈框架在运行时会在哪里,但它知道 A 位于 C 的“两个作用域之外”。因此,它认为是va
“两个作用域之外,偏移量为 1”(例如)。它为引用生成的对象代码va
是“沿作用域链向下走 2 步,然后访问偏移量 1”。因此在运行时,每个堆栈框架都有一个指向其堆栈上的“父”框架的指针(因此它知道如何在返回时设置堆栈指针),还有一个指向作用域链上“下一个”框架的指针(因此它可以解析对非局部变量的引用)。设置这些指针是创建新堆栈框架过程的一部分。
(或者至少,这是你应该开始的心理模型。有一些优化可以避免遍历范围链。)