我现在正在学习编程语言原理课程,但我一生都无法弄清楚这一点。这不是作业,只是一个一般概念问题。
在我们的课程中,我们讨论了静态链和显示。我想我明白为什么我们需要这些。否则当我们有嵌套方法时,当我们有嵌套方法时,我们无法弄清楚我们在谈论什么变量。
我的教授还谈到了符号表。我的问题是符号表是做什么用的?它与静态链有什么关系?
我会提供一些背景信息(如果我错了,请纠正我)。
(我将定义一些东西只是为了使解释更容易)
假设我们有这样的代码:
main(){
int i;
int j;
int k;
a(){
int i;
int j;
innerA(){
int i = 5;
print(i);
print(j);
print(k);
}
}
b(){
...
}
...
}
而这个堆栈:
| innerA |
| a |
| b |
| main |
-----------
静态链的快速描述作为复习。
静态链用于查找在内部函数中重新定义变量时应该使用哪个变量。在上面显示的堆栈中,每个帧都有一个指向包含它的方法的指针。所以:
| innerA | \\ pointer to a
| a | \\ pointer to main
| b | \\ pointer to main
| main | \\ pointer to global variables
-----------
(假设静态范围,对于动态范围,我认为每个堆栈帧都将指向它下面的那个)
我认为当我们在方法print(<something>)
内部执行时innerA
会发生这种情况:
currentStackframe = innerAStackFrame;
while(true){
if(<something> is declared in currentStackFrame)
print(<something>);
break;
else{
currentStackFrame = currentStackFrame.containedIn();
}
}
符号表快速复习
我不太确定符号表的用途。但这就是它的样子:
Index is has value,
Value is reference.
__
| |
|--| --------------------------------------------------
| | --------------------> | link to next | name | type | scope level | other |
|--| --------------------------------------------------
| | |
|--| ---------------
| | |
|--| | --------------------------------------------------
| | -------> | link to next | name | type | scope level | other |
|--| --------------------------------------------------
| |
|--|
- 链接到下一个 - 如果多个事物具有相同的哈希值,则这是一个链接
- name - 元素的名称(例如:i、j、a、int)
- 类型 - 事物是什么(例如:变量、函数、参数)
- 范围级别 - 不是 100% 确定这是如何定义的。我觉得:
- 0 将是内置的
- 1 将是全局变量
- 2 将是主要方法
- 3 将是 a 和 b
- 4将是innerA
只是为了重申我的问题:
- 符号表是干什么用的?
- 它与静态链有什么关系?
- 为什么我们需要静态链,因为范围信息在符号表中。