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

C++ 编译器如何将类的对象实例转换为二进制机器代码?,c++,architecture,compiler-construction,computer-science,C++,Architecture,Compiler Construction,Computer Science,我正在考虑为一种语言的子集研究并构建一个非常小的人工编译器。我认为在我目前的技术水平下,这对我来说太难了 然而,有件事让我很感兴趣,编译器如何将抽象概念(如对象)转换为汇编/二进制 例如: class Dog { public: Dog(string name); ~Dog(); string GetName(); }; dog *Dog = new Dog('rover'); 这是如何被翻译成机器代码的——这是一种

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

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

例如:

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

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

这是如何被翻译成机器代码的——这是一种严重的谩骂。

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

首先,有一个全局的
Dog*Dog
。向全局对象表中添加一个名称,大小为4,类型(狗)指针。 接下来是一个带有非常量表达式的初始化。编写一小段代码
\uuuuu dog\uuu初始值设定项
,调用
::operator new(sizeof(dog))
,将结果存储在
dog
中,然后调用
\uuu Ctor\uo dog
。需要一个字符串常量
“rover”
,因此将其添加到全局字符串表中

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


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

这只是接口定义。可能根本就不会将其转换为二进制文件,而不是头文件。这只是为了让编译器看到。我认为这个问题太广泛了。我建议你找一本关于编译器构造的教程,或者找一本关于编译器的书。你在问什么?生成了什么类型的代码(也就是说,OO风格的代码被翻译成什么类型的代码),或者编译器是如何工作的?我知道最终会生成机器代码,但具体来说,编译器如何知道在什么特定的机器代码和内存状态下转换成狗类的高级实例?在机器代码级别,通常只有数据和函数。基于类的类型系统是编译器必须跟踪的高级抽象,以便知道哪些数据属于哪个用户定义的语言结构。请参阅此处的详细答案: