6

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

玩弄语法/语言/编译领域,我很想知道 C++ 是如何用纯 C 实现的,尤其是实现类继承和 [虚拟] 方法调用的一种方法。

你能指出我现在仍然可用的这样一个编译器吗?

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

4

5 回答 5

5

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

更新: 正如 Maxim Yegorushkin 所指出的,可以使用 setjmp/longjmp 实现异常。但是,如果我没记错的话,异常不能作为 C++ 中的库来实现。它们必须是核心语言的一部分。

于 2013-04-12T12:08:10.043 回答
2

如果您只是想看看 C++ 是如何用 C 语言翻译的,那么您有几个选项可供您使用,C++ FAQ 有一个部分在这里介绍了这一点。它涵盖了我所见过的所有主要选项,并且应该在新选项可用时进行更新。

于 2013-04-12T12:11:02.613 回答
2

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

EDGE 前端也以这种方式工作。我听说英特尔 C++ 编译器和 Comeau 都使用它。

于 2013-04-12T12:12:31.403 回答
1

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

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

于 2013-04-12T12:08:24.590 回答
0

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

于 2013-04-12T14:59:33.417 回答