2

我正在考虑尝试为一种语言的子集研究和构建一个非常小的人为编译器。我认为在我目前的技能水平上,这对我来说太难了。

但是,有些事情让我很感兴趣,编译器如何将抽象概念(例如对象)转换为汇编/二进制文件?

例如:

class Dog            
{
  public:            
    Dog(string name);
    ~Dog();
    string GetName();
};

dog *Dog = new Dog('rover');

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

4

1 回答 1

1

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

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

当整个文件被读取时,所有的表都被翻译成目标文件的一部分,所以链接器可以把它们放在一起。这并不是真正生成二进制代码,只是将现有部分放在一起。

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

于 2013-08-02T07:11:07.003 回答