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

10

可能是一个相当模糊和广泛的问题,但是所有的C++编译器在将代码编译成机器码之前是否都会先将其编译成C语言?


3
Cfront足以满足我爷爷的需求,也足以满足我的需求! - Tyler McHenry
1
我们甚至可以将答案从“不是所有编译器都这样做”扩展到“没有编译器这样做”。 - Philipp
@TripShock:为什么要这么模糊和笼统呢?我认为这只是一个简单的二元问题 :-) - Philipp
@GMan:当然我不知道每个编译器 :-) - Philipp
@GManNickG:Comeau现在似乎已经死了。该网站已经4年没有更新了。 - IInspectable
显示剩余4条评论
5个回答

16

由于C编译器几乎无处不在,可以在几乎所有平台上使用,因此许多(已编译的)语言在其开发过程中都要经历这个阶段来启动进程。

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

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

C ++已经在20多年前经历了第一阶段和第二阶段。 因此,很容易找到专门用于C ++并生成直接传递给后端的中间格式的编译器'前端'。 但是,仍然可以找到将C ++翻译成C(作为中间格式)然后再进行编译的版本。


现在有免费的便携式优化后端,例如LLVM,因此新的编译器/语言通常以前端开始,将LLVM-IR提供给LLVM库进行优化和代码生成,以支持任何目标。 - Peter Cordes
@PeterCordes 后端像LLVM一样一直存在。我在95/96年就使用了GCC IL图形格式。但即使有这个可用且易于使用,C++的第一个版本也是通过翻译成C实现的(回到83年,IL仍然存在)。从翻译器跳转到生成特定于后端的中间格式仍然很大,因此编写一个翻译器到C是测试事物的简单方法。如果您仍然看到该语言的前途,则使用LLVM后端是下一步的好选择。 - Martin York

13

不是这样的。例如,GCC将从C++转换为汇编语言。您可以使用g++命令的-S选项来查看这一点。

实际上,现代编译器都不会先转换成C再转换成汇编语言。


2
Comeau 将 C++ 编译成 C。(然后再编译成二进制文件。) - GManNickG
6
@Gianni: 实际上,Comeau编译器被认为是最顺从的编译器之一。 :) (不过,我只知道这些,对于它实际产生的优化二进制文件的质量,我一无所知。) - GManNickG
6
尽管你关于 g++(而非 GCC)是正确的,但你不能仅凭 -S 选项就确定它。在编译生成汇编代码之前,代码实际上会经过多个中间格式的转换(其中大部分可以导出到文件)。 - Martin York
5
实际上,Comeau的C编译器也使用C作为其中间表示法。几乎每个编译器都会进行前端翻译成一些中间表示 - Comeau的中间表示恰好是C,这意味着他不需要为他支持的每个平台维护一个后端。由于他只是一个人(我想),这是有一定道理的。我想他本来可以使用GCC使用的任何中间表示,但可能存在许可或其他问题,使得那样做不太理想。 - Michael Burr
3
实际上,像那样的编译器对于各种小型(例如:嵌入式)平台非常有用,这些平台只支持C编译器。除非你真的使用C,否则我认为这很有用。 发抖 - T.E.D.
显示剩余2条评论

7

在C++的早期阶段,仅使用了C作为其开发和演变的语言。今天大多数C++编译器直接编译成汇编或机器码。例如,Borland C++直接编译成机器码。


4

这是一个谬论,基于Stroustrup早期版本的实现方式。C++编译器生成的机器码与C编译器几乎完全相同。

截至2010年,我所知道的唯一一个创建C代码的C++编译器是Comeau*。然而,这个编译器已经超过5年没有消息了(2022年)。可能还有一两个用于嵌入式目标的编译器,但这肯定不是主流事情。


* - 这个WP页面上有一个指向他们旧网站的链接。我建议不要点击,除非你的电脑已经更新了所有的补丁。


收到了一個贊,所以我進行了編輯。據我所知,Comeau 在 2017 年之前就像消失了一樣。 - T.E.D.
@T.E.D,建议将链接放在文本中而不是超链接,以促进“除非您的计算机已经接种所有疫苗,否则不要点击该链接”。 - chux - Reinstate Monica
@chux - 很遗憾,SE的软件仍然会使其成为可点击的链接。如果您知道如何修复它的bbcode-fu,请随意编辑它。 - T.E.D.

-2

这不是标准定义的。当然,编译成C源代码是一个合理的方法。它只需要目标平台有一个具有合理程度的C编译器,因此这是一种高度可移植的方法。 缺点是速度。可能会受到编译速度和执行速度(由于大量的强制转换,例如虚函数,防止编译器完全优化)的影响。 不久前,有一家公司拥有一个非常好的C++编译器,正是这样做的。不幸的是,我不记得公司的名字,短暂的谷歌也没有找回名字。该公司的所有者是ISO C++委员会的积极参与者,您可以直接在主页上测试您的代码,该主页还提供了一些相当不错的关于C++的资源。 编辑:我的一位同行刚刚提醒我。我当然是在谈论Comeau。


我认为你想到的是Comeau。它已经在将近四年前发布的另一个答案中提到过了。 - nobody
2
哇,我简直不敢相信我提出这个问题已经快4年了 :)。你的答案没有真正为这个帖子增添任何内容。 - TripShock
1
你提到Comeau和其他人提到它的区别在于:你是在它死了一年后才提起的。 - IInspectable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接