6

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

所以,我的问题是,在程序编程中,代码在代码部分,它进入只读内存区域。变量要么在堆栈上,要么在堆上。

但是 OOP 说对象是在内存中创建的。那么,这是否意味着连函数都写入了 R/W 存储区?

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

4

3 回答 3

6

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

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

于 2010-11-07T22:47:50.803 回答
3

这是一个很好的问题。

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

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

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

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

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

于 2010-11-07T23:11:49.987 回答
1

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

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

但是 OOP 说对象是在内存中创建的。那么,这是否意味着连函数都写入了 R/W 存储区?

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

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

于 2010-11-07T22:48:39.990 回答