C ++在普通C中实现

时间:2013-04-12 11:57:18

标签: c++ c compiler-construction implementation

我已经多次读过早期的C ++编译器在编译它之前将第一个C ++代码翻译成普通的C(或者可能需要第三方C编译器)。

使用语法/语言/编译字段,我很想知道C ++是如何在普通C中实现的,特别是可以用来实现类继承和[虚拟]方法调用的方法。

你能指点我现在仍然可用的编译器吗?

我知道可以使用结构和函数指针在纯C中模拟/模拟OO代码,但我希望在C中看到C ++语言的实际实现。

5 个答案:

答案 0 :(得分:5)

您可以尝试cfront。您可以下载旧版本here。但它只支持非常有限的C ++子集。 某些功能如异常无法以这种方式实现。

<强>更新 正如Maxim Yegorushkin所说,可以用setjmp / longjmp实现异常。但是如果我没记错的话,异常无法在C ++中实现为库。它们必须是核心语言的一部分。

答案 1 :(得分:2)

如果您只是想了解如何在C中翻译C ++,那么您可以使用多种选项,而C ++常见问题解答中有一个涵盖此here的部分。它涵盖了我见过的所有主要选项,并且在有新选项时应该更新。

答案 2 :(得分:2)

Comeau compiler以这种方式工作。在其鼎盛时期,每个人都赞扬其标准合规性,并使用Comeau在线测试代码片段,但很少有人用它来构建生产代码。

EDGE frontend也是这样的。我听说英特尔C ++编译器和Comeau都使用它。

答案 3 :(得分:1)

第一个Microsoft C ++编译器与您描述的完全一样,我知道因为我记得使用它。从我的记忆中,我认为它是他们的C编译器的第7版。这可能是在1992年左右(加/减2年)。

更新:见http://en.wikipedia.org/wiki/Visual_C%2B%2B,我所指的那个确实是在1992年发布的,名为“C / C ++ 7.0”

答案 4 :(得分:0)

这就是C ++的原始实现(称为cfront)的工作方式。它是C编译器的前端。虽然EDG的C ++前端可以配置C后端,但它可以生成C代码,但现在这种情况并不常见。当你正在运行一个新的编译器时,这很有用,但是在生产编译器中,这是一个浪费的步骤,因此商业编译器通常直接转到目标平台的首选形式。并且真的不希望通过读取生成的C代码来调试程序。我没有为C ++做过这样的事情,但是当我在Dinkumware工作时,我们实现了Java核心库以及EDG正在开发的Java前端。 C代码在逻辑上是结构化的,但它看起来很像LISP:很多地狱般的愚蠢括号。