我正在考虑尝试研究和构建一个非常小的人为设计的编译器,用于一种语言的子集。我想这对我目前的技能水平来说太难了。
但是,有些事情让我很感兴趣,编译器如何将抽象概念(例如对象)翻译成汇编/二进制文件?
例如:
class Dog
{
public:
Dog(string name);
~Dog();
string GetName();
};
dog *Dog = new Dog('rover');
那是如何被翻译成机器代码的——这真是令人费解。
最佳答案
幕后?这里没有什么大惊喜。让我们假设一个合理的编译器:
首先,有一个全局Dog* dog
。在全局对象表中添加一个名称,大小为 4,类型为 (Dog) 的指针。
接下来,有一个非常量表达式的初始化。编写一小段代码 __dog__initializer
调用 ::operator new(sizeof(Dog))
,将结果存储在 dog
中,然后调用 __Ctor_Dog
。需要一个字符串常量 "rover"
,因此将其添加到全局字符串表中。
当读取整个文件时,所有表都被翻译成目标文件的各个部分,因此链接器可以将它们放在一起。这并不是真正生成二进制代码,只是将现有部分放在一起。
请记住,这只是一个假设的实现,细节在实践中肯定会有所不同。
关于c++ - 编译器如何将类的对象实例翻译成二进制机器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18006447/