编译器如何将类的对象实例转换为二进制机器代码

How does a compiler translate an object instance of a class to binary machine code?

本文关键字:转换 二进制 机器 代码 实例 对象 编译器      更新时间:2023-10-16

我曾考虑尝试为一种语言的子集研究和构建一个非常小的人工编译器。回想起来,以我目前的技术水平,这对我来说太难了。

然而,有一件事让我很感兴趣,编译器如何将抽象概念(如对象)转换为汇编/二进制?

例如:

class Dog            
{
  public:            
    Dog(string name);
    ~Dog();
    string GetName();
};
dog *Dog = new Dog('rover');

这是如何被翻译成机器代码的——这真是令人困惑。

幕后?这里没有什么大的惊喜。让我们采用一个合理的、byt假设的编译器:

首先,有一个全局Dog* dog。在全局对象表中添加一个名称,大小为4,类型为(Dog)指针。接下来,将使用一个非常量表达式进行初始化。编写一小段代码__dog__initializer,它调用::operator new(sizeof(Dog)),将结果存储在dog中,然后调用__Ctor_Dog。需要一个字符串常量"rover",所以将其添加到全局字符串表中。

当读取整个文件时,所有表都被转换为对象文件的一部分,因此链接器可以将它们放在一起。这并不是真正生成二进制代码,只是将现有的部分放在一起。

请记住,这只是一个假设的实现,在实践中细节肯定会有所不同。