【问题标题】:OOP vs procedural in run-timeOOP 与运行时的过程
【发布时间】:2011-05-06 10:14:57
【问题描述】:

我有一个非常简单的问题,我在互联网上的任何地方都找不到答案。

所以,我的问题是,在过程编程中,代码位于代码段中,该段进入只读内存区域。变量在堆栈或堆上。

但是 OOP 说对象是在内存中创建的。那么,是不是连函数都写入R/W内存区了呢?

而且,Os 是否必须有一些内置的 OOP 程序支持?例如,如果操作系统不允许在只读代码部分之外读取指令。谢谢。

【问题讨论】:

  • 这取决于语言——更重要的是,取决于所述语言的运行时。当前 CLR 可能会在堆栈上创建对象(大多数情况下是值类型,除非解除)。 OOP 或“程序”都没有说明使用“数据部分”的任何固有内容——但只读存储器在任何情况下都是只读的。结局太混乱了,我什至不知道该怎么回答。我认为问题在于试图将 40 个问题合二为一。一次只专注于一件事。

标签: oop procedural-programming


【解决方案1】:

通常,OOP 和过程式编程都是仅存在于源代码级别的抽象。一旦程序被编译成可执行的机器代码,这些抽象就不复存在了。因此,特定语言是 OOP 还是过程性语言与它使用的内存区域或在执行期间放置指令的位置无关。

操作系统本身通常不知道也不关心特定的可执行文件是用 OOP 还是过程语言编写的。它只关心可执行文件使用与其本机指令集兼容的二进制操作码,以及可执行文件是否具有它可以理解的 ABI(二进制接口)。

【讨论】:

  • 好的,但是,例如 MS Windows 是否允许您跳转到将存储在 .data 区域中的函数?毕竟系统不知道它是一些数据还是指令。而且,还有什么有趣的,为什么连程序代码都进入只读部分?
  • @B.Gen.Jack.O.Neill,这取决于架构。执行存储在代码段以外的其他地方的代码的能力历来被黑客利用。例如,大多数堆栈缓冲区溢出攻击基本上都是尝试执行放置在堆栈缓冲区中的 shell 代码。因此,如果指令指针最终位于进程代码段之外的地址,某些硬件架构会触发故障。
  • 代码部分只读的原因是为了防止恶意注入代码。系统对什么是数据或可执行命令没有更多的概念,就像它知道你喜欢芝士汉堡或披萨一样,只知道接下来要执行的操作。例如,这就是编译器可以创建可执行文件的原因。例如,我认为您应该阅读冯诺依曼架构。
【解决方案2】:

OOP 没有这样说。我不知道你在哪里读到的,如果你添加一个有用的报价。

对象变量,因此您对变量的了解对于对象来说是正确的。在像 C#(实际上是 .net 框架)这样的语言中,对象只能存储在堆中,因为它们是所谓的引用类型。在 C++ 中,它们可以生活在任何地方。

但是 OOP 说对象是在内存中创建的。那么,是不是连函数都写入R/W内存区了呢?

由此我得出结论,您认为函数是对象。远非所有 OOP 语言都是如此。它来自函数式语言,其中函数是一等对象。函数在大多数情况下是不可变的,并且放置在只读部分中。

Windows、Linux 和 MacOsx 等常见操作系统不知道对象。这纯粹是程序概念。 .net 框架和 java vm 提供了抽象层。它们是具有内置对象支持的执行环境。

【讨论】:

    【解决方案3】:

    这是个好问题。

    虽然对象构成 函数数据 在理论上被放置在同一位置,但大多数 实现 将其分开。您这样做的方式是将代码拆分并存储到 RO 段中。然后,RW 区域中的对象有一种方法可以引用 RO 区域中的代码。代码和数据的耦合仅在概念上由人类程序员和类型检查器使用,以确保您不违反规则和原则。

    类似Java/C#的语言通常会被制作成每个对象都有一个标签来标识对象的类型。对象本身只是一个结构,包含按预先指定的顺序排列的所有字段。然后可以使用该标签查找要调用 RO 区域中的哪个函数。 RO 区域中的函数被更改为采用一个额外的参数,称为 thisself,通过该参数可以访问所述对象的内容。当方法需要引用字段时,它知道预先指定的顺序,所以它可以做到这一点。请注意,解决继承问题需要一些技巧,但这是想法的关键。

    类似 Python/Ruby 的语言通常会使对象成为哈希表,其中方法是指向 RO 区域中代码的指针(前提是该语言已编译且不通过字节码解释器运行)。通过查找哈希表内容并跟随代码指针来进行函数调用。字段也在同一个哈希表中查找。

    有了这些基础知识,大多数实现都会使用技巧来避免跟随指针查找要调用的函数的部分。他们试图找出并缩小对单个函数的可能调用。然后他们可以直接调用正确的函数来代替查找,这是一种更快的解决方案。

    tl;dr 版本:语言语义将字段和方法视为对象的一部分。 实现将它们分成 RO 和 RW 段。因此不需要操作系统支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多