按范围我的意思是函数范围,类范围,库,DLL等。
如果最后所有代码都被翻译成一系列指令(通过编译器),那么高级语言中的高级作用域如何对最低级别的代码产生影响?
答案 0 :(得分:1)
这就是重点 - 其中一个是高级别,另一个是低级别。 CPU指令对范围一无所知。这是一个内存管理问题。
“Scopes”是高级编程环境的一部分 - 编译器会检查您(根据编程语言的规则)您可以访问您尝试访问的内容(例如,您不能访问变量x,它是另一个函数的本地变量)。有人可能会说这是减少错误的一种方法。
正在执行的“真实”代码不了解范围。
答案 1 :(得分:1)
每个变量名称或函数名称等对应于存储器中存储相应信息或代码的位置。 (这是一个轻微的简化,但你明白了)。范围表示从名称到位置的映射。可以将其视为您喜欢的语言中的字典或类似数据结构。
嵌套作用域作为一种堆栈。当语言语法引入新范围时,会将新映射推送到堆栈。当您使用变量名称时,例如i
,编译器或解释器在顶层映射中查找它,然后(如果在那里找不到)根据语言规则向上查找。当作用域结束时,相关的映射将从堆栈中弹出,之前的映射将恢复生效。
这种工作原理的丑陋细节可能有所不同:在最简单的情况下,编译器可以生成直接引用内存位置的代码。更现实地说:C编译器生成包含“符号表”的可执行对象,该符号表将变量和函数名称映射到内存中的位置。链接器通过查找另一个模块的符号表中的一个模块的引用来解析模块之间的引用。并且名称不会映射到绝对位置,而是映射到某些参考点的偏移。这允许库是“可重定位代码”,这意味着它们可以在执行期间加载到内存中的任何位置,并且仍然可以正常工作。编译到虚拟机的语言可能会削减一些角落,但原则是相同的。
答案 2 :(得分:0)
范围是一种高级语言结构和机制。低级CPU指令与范围无关。