编译器如何解析作用域?
How compiler resolves the scope?
我知道什么是栈以及它们是如何工作的。我也知道每个函数都在内存中分配了自己的栈,这就是作用域。
但让我感到困惑的是编译器如何发现这些名称是在此范围内声明的。 它是否展开整个堆栈并检查是否有给定名称的条目。(看起来很累)
考虑这段代码:
void func(int a)
{
cout<<a;
cout<<b;
}
这里的 func 堆栈将包含 a 的条目,但是当编译器遇到名称 b 时,它会检查堆栈并发现那里没有 b 的条目。现在的问题是它如何检查,是否展开整个堆栈。
如果这个函数是在另一个包含 b 的函数中声明的,它是否也必须展开所有其他堆栈。
编译器通过符号 tables 解析变量的作用域。每个范围都有自己的符号 table,这些 table 是根据程序的结构以分层方式组织的。
当编译器想要解析变量的范围时,它会首先检查它是否存在于当前范围的符号 table 中。如果没有找到,它将尝试父作用域的符号 table,依此类推。
每个交易品种 table 搜索起来应该相对较快。
请参阅 here 以获取视觉示例。
我知道什么是栈以及它们是如何工作的。我也知道每个函数都在内存中分配了自己的栈,这就是作用域。 但让我感到困惑的是编译器如何发现这些名称是在此范围内声明的。 它是否展开整个堆栈并检查是否有给定名称的条目。(看起来很累) 考虑这段代码:
void func(int a)
{
cout<<a;
cout<<b;
}
这里的 func 堆栈将包含 a 的条目,但是当编译器遇到名称 b 时,它会检查堆栈并发现那里没有 b 的条目。现在的问题是它如何检查,是否展开整个堆栈。 如果这个函数是在另一个包含 b 的函数中声明的,它是否也必须展开所有其他堆栈。
编译器通过符号 tables 解析变量的作用域。每个范围都有自己的符号 table,这些 table 是根据程序的结构以分层方式组织的。
当编译器想要解析变量的范围时,它会首先检查它是否存在于当前范围的符号 table 中。如果没有找到,它将尝试父作用域的符号 table,依此类推。
每个交易品种 table 搜索起来应该相对较快。
请参阅 here 以获取视觉示例。