2012-10-04 33 views
-1

作用域我的意思是函数作用域,类作用域,库,DLL等等。示波器如何工作?

如果最后所有代码都被编译为一系列指令,那么高级语言的高级作用域如何对最低级别的代码产生影响?

+2

我不确定你的意思。你问为什么我们有范围?或者它们是如何由语言在内部实现的?范围对程序员来说只是一种方便,它们作为编程语言的一部分被强制执行,但是你是对的,最终它只是机器指令(或者是在虚拟机上运行的字节码,用于执行范围规则)。 –

+0

那么他们在程序的设计和编程过程中有什么用处呢? – Apeee

+2

他们保持有秩序的东西,就像书架上的书架一样。一本书只知道它在什么样的架子上,以及在同一个架子上的其他书籍,而不是其他书架上的书籍。想象一下,如果我们只是把所有的书扔进一大堆。管理它们会很难,不是吗? –

回答

0

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

+0

构思是什么意思? – Apeee

1

这就是整点 - 其中一个是高层次的,另一个是低层次的。 CPU指令不知道任何有关范围。这是一个内存管理的问题。

“范围”是高级编程环境的一部分 - 编译器检查您(根据编程语言的规则)您可以访问您尝试访问的内容(例如,访问变量x对另一个函数是本地的)。有人可能会说这是减少错误的手段。

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

1

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

嵌套作用域作为一种堆栈工作。当语言语法引入一个新的作用域时,一个新的映射被推送到堆栈。当你使用一个变量名称,比如说i时,编译器或解释器在顶层映射中查找它,然后根据语言规则向上查找(如果找不到)。当范围结束时,相关映射从堆栈中弹出并且以前的映射恢复生效。

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