例如,我用 C++ 或 C# 编写的 oop 代码如何转换为机器代码,或者在 C# 的情况下如何转换为字节码?我的意思是,这些对象是如何翻译的?
在过程式编程中,编译后的样子非常明显,因为机器语言实际上支持函数。但是在 oop 编程的情况下,机器语言中没有对象。
我的理论是,它将对象本身编译为某种类似 C 的结构,该结构仅包含数据(无成员函数),并且当调用 memeber 函数时,如果接受一个附加参数,该参数是对象本身的数据结构。我对吗?
例如,我用 C++ 或 C# 编写的 oop 代码如何转换为机器代码,或者在 C# 的情况下如何转换为字节码?我的意思是,这些对象是如何翻译的?
在过程式编程中,编译后的样子非常明显,因为机器语言实际上支持函数。但是在 oop 编程的情况下,机器语言中没有对象。
我的理论是,它将对象本身编译为某种类似 C 的结构,该结构仅包含数据(无成员函数),并且当调用 memeber 函数时,如果接受一个附加参数,该参数是对象本身的数据结构。我对吗?
不用猜,看一下生成的“汇编”(其实是MSIL)代码:
它依赖于实现。但在实践中,常见的是使用虚拟表(“vtable”)。每个类都有一个虚拟表,其中包含指向每个成员函数实现的指针列表。每个对象都有一个指向相应 vtable 的指针。
根据语言和编译器标志,可以通过函数签名(名称和参数)或简单地通过索引来查找 vtable 中的适当指针。
当通过它的 vtable 指针调用成员函数时,它肯定需要一个指向对象数据的指针。但这可能会在堆栈或寄存器中传递。
OOP 中的所有面向对象只是一个更高级别的编程结构,使开发人员能够在包含原型及其实例的范例中编写模块化和有组织的代码。oop 代码在机器代码中没有它的等价物。
它更像是我们如何在 typescript 中拥有接口,然后将其转换为没有接口概念的 javascript。(这可能不是一个很好的例子)