【问题标题】:How do scopes work? [closed]范围如何工作? [关闭]
【发布时间】:2012-10-04 21:53:29
【问题描述】:

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

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

【问题讨论】:

  • 我不确定你的意思。你是在问为什么我们有范围?或者它们是如何在语言内部实现的?范围只是为程序员提供方便;它们作为编程语言的一部分被强制执行,但你是对的,最终它只是机器指令(或在执行范围规则的 VM 上运行的字节码)。
  • 那么它们在程序的设计和编程过程中有什么用呢?
  • 他们把东西整理得井井有条,就像书柜里的书架一样。一本书只知道它在哪个书架上,以及同一书架上的其他书,而不知道其他书架上的书。想象一下,如果我们把所有的书都扔进一大堆。管理它们会很困难,不是吗?
  • 编程语言实现范围规则。
  • IDE与它无关,它只是一个编辑器。范围早在 IDE 之前就已经存在

标签: scopes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 构造是什么意思?
      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 2011-09-19
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2020-10-05
      相关资源
      最近更新 更多