所有C++编译器都生成C代码吗?

Tri*_*ock 8 c c++ compiler-construction

可能是一个非常模糊和广泛的问题,但是所有C++编译器在将代码编译成机器代码之前是否先将代码编译成C?

Mar*_*ork 14

由于C编译器几乎无处不在并且几乎在每个平台上都可用,因此很多(编译的)语言在开发过程中经历了这个阶段以引导该过程.

在语言开发的早期阶段,看看语言是否可行,最简单的方法就是构建一个将语言转换为C然后让本机C编译器构建实际二进制文件的编译器.

这样做的问题在于语言特定的构造会丢失,因此可能会错过潜在的优化机会,因此第二阶段的大多数语言都会获得自己的专用编译器front end,这些编译器可以理解语言特定的构造,因此可以提供基于这些构造的优化策略.

二十多年前,C++经历了第一阶段和第二阶段.因此很容易找到专用于C++的编译器的"前端",并生成一个直接传递给支持的中间格式.但是在编译之前,您仍然可以找到转换为C(作为中间格式)的C++版本.


Gia*_*nni 9

不.例如GCC来自C++ - >汇编程序.你可以通过使用-Sg ++选项看到这一点.

实际上,现在我考虑一下,我认为任何现代编译器都不会在ASM之前转到C语言.

  • @Gianni:实际上,Comeau被认为是最合规的编译器之一.:)(这就是我所知道的;不知道它实际产生优化二进制文件的程度.) (6认同)
  • 虽然你对g ++(而不是GCC)是正确的,但由于-S选项,你无法告诉它.在它到达汇编之前,代码实际上是通过几种中间格式(大多数可以转储到文件中)进行转换的. (6认同)
  • 实际上,Comeau的**C编译器**也使用C作为其中间表示.几乎每个编译器都会将前端转换为一些中间表示 - Comeau的中间表示恰好是C,这意味着他不需要为他支持的每个平台维护后端.由于他是一个单人店(我认为),这有一定的意义.我想他可以使用GCC使用的任何中间代表,但可能存在许可或其他问题使得不太理想. (4认同)
  • Comeau 将 C++ 编译成 C。(然后编译成二进制文件。) (2认同)
  • 实际上,像这样的编译器对于仅运行 C 编译器的各种小型(例如:嵌入式)平台非常有用。除非你真的*想要*使用 CI 假设。*不寒而栗* (2认同)

dth*_*rpe 6

No. C++ - > C仅用于C++开发和发展的最早阶段.今天大多数C++编译器直接编译为汇编程序或机器代码.例如,Borland C++直接编译为机器代码.