面向对象的代码如何转换为机器代码?

时间:2013-05-19 11:27:34

标签: oop compiler-construction compilation

我在C ++或C#中编写的oop代码究竟是如何转换为机器代码的,或者在C#的情况下转换为字节码?我的意思是,对象如何翻译?

在程序编程中,编译后它看起来很明显,因为机器语言中的函数实际上是真正的支持。但是在oop编程的情况下,机器语言中没有对象。

我的理论是它将对象本身编译为某种类似C的结构,它只包含数据(没有成员函数),并且在调用memeber函数时,如果接受一个addion参数,它是对象本身的数据结构。我对吗?

3 个答案:

答案 0 :(得分:2)

无需猜测,只需查看生成的“程序集”(MSIL,实际上)代码:

How can I view MSIL / CIL generated by C# compiler? Why is it called assembly?

答案 1 :(得分:1)

它依赖于实现。但实际上,常见的是使用虚拟表(“vtable”)。每个类都有一个虚拟表,其中包含指向每个成员函数实现的指针列表。每个对象都有一个指向相应vtable的指针。

根据语言和编译器标志,可以通过函数签名(名称和参数)或仅通过索引查找vtable中的相应指针。

当通过它的vtable指针调用成员函数时,肯定它需要一个指向对象数据的指针。但是这可能会在堆栈或寄存器中传递。

答案 2 :(得分:0)

OOP中的所有面向对象都只是一个更高级别的编程结构,使开发人员能够在包含原型及其实例的范例中编写模块化和有组织的代码。 oop代码在机器代码中没有等价物。

它更像我们在typescript中的接口,然后转换为javascript,它没有接口的概念。 (这可能不是一个很好的例子)