为什么 C++ 编译器在创建机器代码之前将源代码翻译成汇编?

cod*_*ive 0 c++ assembly

我开始学习C++,我了解到编译器通过编译将源代码从程序转换为机器代码。

但是,我了解到 C++ 编译器实际上将源代码转换为程序集,作为将程序集代码转换为机器代码之前的中间步骤。这一步的目的是什么?

Kla*_*aus 8

为什么不直接翻译成机器码呢?

首先:不需要编写中间汇编语言表示。每个编译器供应商都可以自由地直接发出机器代码。

但是有很多很好的理由来“编写”一个中间程序集并将其传递给汇编程序以生成最终的可执行文件。重要的是,不需要真正将文件写入某种媒体,但输出可以直接通过管道传输到汇编器本身。

供应商使用中间汇编语言的一些原因:

  • 汇编程序已经可用并且“知道”如何生成一些可执行文件格式(例如 elf)。

  • 某些任务可以推迟到达到装配级别。例如,解析跳跃目标。这是可能的,因为中间组装通常不仅是 1:1 表示,而且是某种“宏组装器”,它可以做的不仅仅是从 mnomics 中创建位。

  • 汇编器级别之后是执行链接器。如果编译器直接想要创建可执行文件格式,也必须这样做。如果必须再次编码,则有很多重复的工作。例如,之前“未知地址”的所有重定位都必须在到可执行文件的途中完成。只需使用汇编器/链接器即可完成工作。

  • 中间程序集对于调试目的总是有用的。因此,能够执行此中间步骤或多或少是硬性要求,即使在用户未请求调试输出的情况下可以省略它。

我相信还有很多...

不好的一面是:

  • “编写”文本表示并从文本中解析程序需要更长的时间,因为直接将信息传递给链接器。