我有一个非常简单的问题,我无法在互联网上的任何地方找到答案。
所以,我的问题是,在程序编程中,代码在代码段中,进入只读存储区。变量在堆栈或堆上。
但是OOP说这个对象是在内存中创建的。那么,是否意味着将函数写入R / W存储区?
而且,Os是否必须支持一些内置的OOP程序?例如,如果OS doesent允许读取只读代码部分之外的指令。谢谢。
答案 0 :(得分:6)
通常,OOP和过程编程都是仅在源代码级别存在的抽象。一旦程序被编译成可执行的机器代码,这些抽象就不复存在了。因此,特定语言是否为OOP或程序性与其使用的内存区域或执行期间放置指令的位置无关。
操作系统本身通常不知道或不关心特定可执行文件是用OOP还是过程语言编写的。它只关心可执行文件使用与其本机指令集兼容的二进制操作码,并且可执行文件具有它理解的ABI(二进制接口)。
答案 1 :(得分:3)
这是一个很好的问题。
然而,当对象构成函数和数据理论上放置在同一位置时,大多数实现将其拆分。您这样做的方式是将代码拆分并存储到RO段中。然后,RW区域中的对象有一种方法可以返回RO区域中的代码。代码和数据的耦合仅在人类程序员和类型检查器的概念上使用,以确保您不违反规则和原则。
通常会使用类似Java / C#的语言,使每个对象都有一个标记来标识对象的类型。对象本身只是一个包含按预定顺序排列的所有字段的结构。然后可以使用此标记查找要呼叫的RO区域中的哪个功能。改变RO区域中的功能以获取额外的参数,称为 this 或 self ,通过该参数可以到达所述对象的内容。当方法需要引用字段时,它知道预先指定的顺序,因此它可以做到相关。请注意,解决继承需要一些技巧,但这是这个想法的关键。
类似Python / Ruby的语言通常会使对象成为哈希表,其中方法是指向RO区域中代码的指针(假设语言是编译的,而不是通过字节码解释器运行)。通过查找散列表内容并遵循代码指针来进行函数调用。字段也在同一个哈希表中查找。
随着这些基础知识的降低,大多数实现都会采用一些技巧来避免跟随指针的部分找到要调用的函数。他们试图找出并缩小对单个函数的可能调用。然后,他们可以直接调用正确的函数来替换查找,这是一个更快的解决方案。
tl; dr版本:语言语义将字段和方法视为对象的一部分。 实现将它们分成RO和RW段。因此,不需要OS支持。
答案 2 :(得分:1)
OOP没有这样说。我不知道你在哪里读它,如果你添加一个有用的引用。
对象是变量,因此您对变量的了解对于对象是正确的。在像C#这样的语言中(实际上是.net框架),对象只能存储在堆中,因为它们是所谓的引用类型。在C ++中,他们可以在任何地方生活。
但是OOP说这个对象是在内存中创建的。那么,是否意味着将函数写入R / W存储区?
从此我得出结论,你认为函数是对象。在所有OOP语言中都是如此。它来自功能语言,其中函数是第一类对象。函数在大多数情况下是不可变的,并且放在只读部分中。
Windows,Linux和MacOsx等常见操作系统不知道对象。这纯粹是程序概念。 .net框架和java vm提供了抽象层。它们是构建对象支持的执行环境。