我已经读过Bjarne Stroustrup最初的C ++实现使用了一个名为Cfront
的编译器,它在编译过程中将C ++转换为C语言。
现代编译器(大多数都是?)仍然如此?
我无法使用Google找到一个好的答案(或者我找不到合适的搜索字词)。
编辑:这不完全重复,因为我要求当前/现代的。但这两个问题和答案适用。
答案 0 :(得分:13)
绝对不是。在很久以前,CFront的做事方式变得难以为继。有一些C ++结构没有C解释,特别是异常,并且为每个模板实例化标记文字C源是有点荒谬的。 Bjarne停止制作Cfront的全部原因是因为它是不可能的。
然而,将代码降低到更有用的IR(如LLVM IR)是常见的,GCC在转换为机器代码之前也有内部IR。
答案 1 :(得分:4)
简答:不。现代C ++编译器直接生成本机代码。
没有理由你无法将C ++编译为C,这样就没有真正的理由这么做了,所以你'在编译过程中添加一个可能很容易不存在的额外阶段。但是,如果由于某种原因确实需要C代码输出,还有几个选项:Comeau C++ compiler发出C代码,目的是将C ++移植到可能不存在C ++编译器的平台(现在,非常少),Clang使用LLVM作为后端代码生成器,它将C作为其众多目标指令语言之一。 (编辑:这些选项中,第一个是过时的,第二个不再维护)
在任何一种情况下,C都不会像你输入的代码那样:它的可读性明显低于机器代码。将方法调用转换为带有this
的函数调用的日子肯定已经过去了 - 很多情况下"编译"而不是"转换"。
答案 2 :(得分:0)
不,现代编译器,如GCC和clang(以及其他基于LLVM的编译器)通常有两个部分:后端和前端。 前端处理将源代码语言编译为某些中间表示,例如LLVM IR。
后端在目标平台上生成机器代码,可能使用该中间形式的一些优化。