【问题标题】:How does object oriented code translate into machine code?面向对象的代码如何转化为机器代码?
【发布时间】:2013-05-14 02:31:05
【问题描述】:

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

在过程式编程中,编译后的样子非常明显,因为机器语言实际上支持函数。但是在 oop 编程的情况下,机器语言中没有对象。

我的理论是,它将对象本身编译为某种 C 类结构,该结构仅包含数据(无成员函数),并且当调用 memeber 函数时,如果接受一个附加参数,该参数是对象本身的数据结构.我对吗?

【问题讨论】:

    标签: oop compiler-construction compilation


    【解决方案1】:

    不用猜,看生成的“汇编”(其实是MSIL)代码:

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

    【讨论】:

    • 那么c++案例呢?他们俩到底应该看相同的结构或内存布局,不是吗?可以有不止一种方法来做到这一点?因为例如,您也可以将这个结构体与函数一起使用,但我认为这不太可能,因为如果对象重复相同的函数会消耗更多的内存。
    • 编写一个“你好世界”的 C 程序。用 gcc -o hw hw.c 编译它。发出 objdump -d hw。这是同一个故事,变化的只是工具名称和具体说明。 IOW 目标 CPU 不同:它在 .net 中是虚拟的,在 C++ 中是真实的。
    【解决方案2】:

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

    根据语言和编译器标志,可以通过函数签名(名称和参数)或简单地通过索引来查找 vtable 中适当的指针。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多