预处理器、汇编程序和链接器是编译器的一部分吗
Is the preprocessor, assembler and linker a part of the compiler?
所以我和我们许多人一样,被教导编译器是一个将人类可读代码转换为机器可读代码的程序。然而,你越深入研究,就会发现"编译过程"实际上分为4个不同的部分:预处理器、编译器、汇编程序和链接器。我想,不了解所有这些部分的位置让我有点困惑。
- 典型编译过程中描述的所有步骤是否都是编译器程序
- 或者像汇编程序和链接器这样的东西是单独构建的程序吗与编译器一起进入IDE以生成代码
- 它取决于编译器还是编程语言
- 如果是单独的,编译器是否只负责汇编代码创建以及优化程序集代码
典型编译过程中描述的所有步骤是否都是编译器程序的一部分?
翻译过程需要所有步骤。该过程包括预处理、编译、汇编/机器代码指令生成和生成可执行文件(例如链接)。
翻译程序,又称编译器,不需要将所有步骤放入一个编译器可执行文件中。
例如,一个程序可能由多个翻译单元组成,因此它们可以同时编译,然后这些部分可以链接在一起。通常将编译与链接分离是有益的。
或者像汇编程序和链接器这样的东西是独立的程序,与编译器一起构建在IDE中以生成代码吗?
有些IDE(如Eclipse)没有内置的编译器或链接器。EclipseIDE设计用于与各种编译器和链接器配合使用。Eclipse IDE需要配置,以便在构建程序时使用哪些工具。
它取决于编译器还是编程语言?
IDE通常独立于编译器和语言。NetBeans IDE可以与Java或C++一起使用(与Eclipse类似)。
某些IDE可能具有与一种语言相比更适合使用另一种语言的功能,例如关键字突出显示。
如果是单独的,编译器是否只负责创建程序集代码以及优化程序集代码?
汇编语言的创建不是该过程的必需部分。
通常,编译器可以提供一个选项来打印汇编语言列表。
有些编译器在不生成汇编语言的情况下发出可执行代码。
术语“编译器";取决于上下文。
对于初学者来说,编译器是您用来从源代码创建可执行程序的工具。
再深入一点,我们就会了解到,在实用的工具链中,至少可以划分为编译器和链接器。
虽然以上两种观点完全基于工具的使用,但当人们了解到更多关于C++的知识时,就会意识到预处理和编译的划分“适当";,即预处理器和编译器,以及链接器,其中预处理器产生文本,编译器产生目标代码,链接器产生可执行文件或库。
更深入地研究一些事情,可能会开始区分编译器的不同内部阶段(在上面的三个阶段中)。有些编译器使用汇编程序,有些编译器直接从抽象语法树生成代码,有些编译器甚至在最后使用整个C编译器,只是将语言X源代码转换为C源代码。例如,Eiffel编译器过去常常这样做,现在可能还会这样做。C++就是这样开始的,作为C编译器的前端。
特别是对于只转换为C的想法,可以将该部分称为真正的编译器,而C编译器在最后只是编译器本身调用的工具之一。
因此,这在很大程度上取决于上下文。
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- C++:如何使函数只返回作为列表一部分的字符串
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- std::sort()函数无法对向量的一部分进行排序
- 编译器如何区分std::vector的构造函数
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- C++ Visual Studio 2010 C4717 编译器警告在代码的一部分,但不在另一部分
- 预处理器、汇编程序和链接器是编译器的一部分吗
- visualstudio2010-有没有一个列表,说明哪些编译器支持C++标准的哪一部分
- Autotools:将项目的一部分切换到不同的编译器