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

时间:2010-07-22 17:22:14

标签: c++ c compiler-construction

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

5 个答案:

答案 0 :(得分:13)

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

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

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

C ++在20多年前经历了第1阶段和第2阶段。因此很容易找到专用于C ++的编译器的“前端”,并生成一个直接传递给支持的中间格式。但是你仍然可以找到在编译之前被翻译成C(作为中间格式)的C ++版本。

答案 1 :(得分:9)

不。例如GCC来自C ++ - >汇编。您可以通过使用带有g ++的-S选项来看到这一点。

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

没有。 这是一个神话,基于这样一个事实:Stroustrup的早期版本的工作就是这样的。 C ++编译器生成的机器代码几乎与C编译器完全相同。

今天,我所知道的唯一创建C代码的C ++编译器是Comeau。嵌入式目标可能还有一两个,但它确实不是主流。

答案 4 :(得分:-3)

标准没有定义。当然,编译C源是一种合理的方法。它只需要目标平台具有合理程度的C编译器,因此它是一种高度可移植的方式。 缺点是速度。可能的编译速度以及可能还有执行速度(由于例如虚拟函数的强制转换的加载而阻止编译器完全优化)将受到影响。 不久前,有一家公司有一个非常好的C ++编译器就是这么做的。不幸的是,我不记得该公司的名称和一个简短的谷歌没有带回名称。该公司的所有者是ISO C ++委员会的积极参与者,您可以直接在主页上测试您的代码,该主页也有一些关于C ++的相当不错的资源。 编辑:我的其中一张海报让我想起了。当然,我在谈论Comeau。