在编译过程中,C++代码是否会被转换成C代码?

8
我了解到,Bjarne Stroustrup 最初的 C++ 实现是使用一个编译器叫做 Cfront,在编译过程中将 C++ 转换成 C。现代编译器(大多数)是否仍然采用这种方式呢?
我在谷歌上没有找到很好的答案(或者我没有找到正确的搜索关键词)。注意:这不是一个精确的重复问题,因为我的问题是关于当前/现代的编译器。但是两个问题及其答案都适用。

4
不,这已不再是事实。 - Shoe
对我来说,编译器将 C++ 编译成本地语言(通常是汇编)听起来很合乎逻辑。请注意,微软托管的 C++ 被翻译为字节码(CLR)。 - NirMH
3个回答

14

绝对不可以。很久以前,CFront的做法变得不可行了。有一些C++构造没有C的解释,特别是异常,为每个模板实例化制作字面C源代码有点荒谬。Bjarne停止制作Cfront的整个原因是因为这是不可能的。

然而,常见的方法是将代码降低到更有用的IR(如LLVM IR),GCC也有一个内部IR,然后再转换为机器代码。


5
简短回答:不需要。现代C++编译器可以直接生成本地代码。
虽然你可以将C++编译成C,但这样做没有实际必要,因此你会增加一个多余的编译阶段,而这个阶段也可以很容易地省略。但是,如果你确实需要C代码输出,仍然有一些选择:Comeau C++编译器发出的C代码旨在将你的C++移植到可能不存在C++编译器的平台上(如今这种情况非常少见),而Clang使用LLVM作为后端代码生成器,其中C是其众多目标指令语言之一。(编辑:这些选项中,第一个已经过时,第二个不再维护)
在任何一种情况下,生成的C代码都与你输入的代码完全不同:它比机器码难以读取得多。将方法调用转换为函数调用并带有this的日子已经过去了——这更像是“编译”而不是“转换”。

4
没有一种语言结构是没有C语言等价的。 - Alex Celeste
1
告诉LLVM IR函数属性。或零成本Itanium ABI EH。 - Puppy
6
当然,EH的翻译可能不会做得很好。但这并不意味着完全不能翻译。我的观点仅是,如果你足够固执,你可以将任何东西编译成任何(图灵完备的)东西。这并不是“不可能”,只是一个坏主意。 - Alex Celeste
2
那里使用的“等价性”定义对于现实世界的程序毫无意义。如果我有一个使用Itanium EH的C++程序,你不能编写一个能够从中捕获异常的C程序,就是这么简单。 - Puppy
3
不是不可能。在这个例子中,我可以从头重新编译您的程序,使用昂贵的异常处理方式,并且该功能仍然会得到支持,只是效果不太好,并且与其他任何工具链都不兼容。 - Alex Celeste
显示剩余4条评论

0
现代编译器(如GCC和基于LLVM的clang等)通常由两个部分组成:后端和前端。 前端处理将源代码语言编译为某种中间表示形式,例如LLVM IR。
后端在目标平台上生成机器代码,可能使用来自该中间形式的一些优化。

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