-1

作用域是指函数作用域、类作用域、库、DLL 等等。

如果最后所有代码都被翻译成一系列指令(由编译器),高级语言中的高级范围如何对最低级别的代码产生任何影响?

4

3 回答 3

1

每个变量名或函数名等都对应于内存中存储相应信息或代码的位置。(这是一个轻微的简化,但你明白了)。范围表示从名称到位置的映射。把它想象成你最喜欢的语言的字典或类似的数据结构。

嵌套范围作为一种堆栈工作。当语言语法引入一个新的范围时,一个新的映射被推送到堆栈中。当您使用变量名时,例如i,编译器或解释器会在顶级映射中查找它,然后(如果在那里找不到)根据语言规则向上查找。当作用域结束时,相关的映射会从堆栈中弹出,之前的映射会重新生效。

其工作原理的丑陋细节可能会有所不同:在最简单的情况下,编译器可以生成直接引用内存位置的代码。更实际的是:C 编译器生成可执行对象,其中包括一个“符号表”,该表将变量和函数名称映射到内存中的位置。链接器通过在另一个模块的符号表中查找来自一个模块的引用来解析模块之间的引用。并且名称不会映射到绝对位置,而是映射到某个参考点的偏移量。这允许库成为“可重定位代码”,这意味着它们可以在执行期间加载到内存中的任何位置并且仍然可以正常工作。编译到虚拟机的语言可能会走捷径,但原理是一样的。

于 2012-10-04T13:44:28.767 回答
1

这就是重点——一个是高级,另一个是低级。CPU 指令对范围一无所知。这是内存管理的问题。

“范围”是高级编程环境的一部分——编译器会检查你(根据编程语言的规则)你可以访问你试图访问的东西(例如,你不能访问变量 x这是另一个功能的本地)。有人可能会说这是一种减少错误的方法。

正在执行的“真实”代码不知道范围。

于 2012-10-04T13:42:38.327 回答
0

范围是一种高级语言结构和机制。低级 CPU 指令与范围无关。

于 2012-10-04T13:40:20.813 回答