预处理器、汇编程序和链接器是编译器的一部分吗

Is the preprocessor, assembler and linker a part of the compiler?

本文关键字:编译器 一部分 链接 处理器 汇编程序 预处理      更新时间:2023-10-16

所以我和我们许多人一样,被教导编译器是一个将人类可读代码转换为机器可读代码的程序。然而,你越深入研究,就会发现"编译过程"实际上分为4个不同的部分:预处理器、编译器、汇编程序和链接器。我想,不了解所有这些部分的位置让我有点困惑。

  1. 典型编译过程中描述的所有步骤是否都是编译器程序
  2. 或者像汇编程序和链接器这样的东西是单独构建的程序吗与编译器一起进入IDE以生成代码
  3. 它取决于编译器还是编程语言
  4. 如果是单独的,编译器是否只负责汇编代码创建以及优化程序集代码

典型编译过程中描述的所有步骤是否都是编译器程序的一部分?

翻译过程需要所有步骤。该过程包括预处理、编译、汇编/机器代码指令生成和生成可执行文件(例如链接)。

翻译程序,又称编译器,不需要将所有步骤放入一个编译器可执行文件中。

例如,一个程序可能由多个翻译单元组成,因此它们可以同时编译,然后这些部分可以链接在一起。通常将编译与链接分离是有益的。

或者像汇编程序和链接器这样的东西是独立的程序,与编译器一起构建在IDE中以生成代码吗?

有些IDE(如Eclipse)没有内置的编译器或链接器。EclipseIDE设计用于与各种编译器和链接器配合使用。Eclipse IDE需要配置,以便在构建程序时使用哪些工具。

它取决于编译器还是编程语言?

IDE通常独立于编译器和语言。NetBeans IDE可以与Java或C++一起使用(与Eclipse类似)。

某些IDE可能具有与一种语言相比更适合使用另一种语言的功能,例如关键字突出显示。

如果是单独的,编译器是否只负责创建程序集代码以及优化程序集代码?

汇编语言的创建不是该过程的必需部分。

通常,编译器可以提供一个选项来打印汇编语言列表。

有些编译器在不生成汇编语言的情况下发出可执行代码。

术语“编译器";取决于上下文。

对于初学者来说,编译器是您用来从源代码创建可执行程序的工具。

再深入一点,我们就会了解到,在实用的工具链中,至少可以划分为编译器和链接器。

虽然以上两种观点完全基于工具的使用,但当人们了解到更多关于C++的知识时,就会意识到预处理和编译的划分“适当";,即预处理器和编译器,以及链接器,其中预处理器产生文本,编译器产生目标代码,链接器产生可执行文件或库。

更深入地研究一些事情,可能会开始区分编译器的不同内部阶段(在上面的三个阶段中)。有些编译器使用汇编程序,有些编译器直接从抽象语法树生成代码,有些编译器甚至在最后使用整个C编译器,只是将语言X源代码转换为C源代码。例如,Eiffel编译器过去常常这样做,现在可能还会这样做。C++就是这样开始的,作为C编译器的前端

特别是对于只转换为C的想法,可以将该部分称为真正的编译器,而C编译器在最后只是编译器本身调用的工具之一。

因此,这在很大程度上取决于上下文。