4

编写类 C 语言的编译器是我小组的一项大学任务。当然,我将实现我们心爱的 C++ 的一小部分。
确切的任务是绝对愚蠢的,讲师告诉我们它需要是自编译的(应该能够自己编译)——所以,他的意思是不要使用诸如 Boost 和 STL 之类的库。
他也不希望我们使用模板,因为它很难实现。
问题是 - 这对我来说是真的吗,因为我将自己编写这个项目,截止日期为 5 月底 - 6 月中旬(今年),不仅要实现模板,还要实现嵌套语法分析级别的类、命名空间、虚函数表?
PS 我不是 C++ 中的菜鸟

4

9 回答 9

28

坚持做一个C编译器。

相信我,构建一个像样的 C 编译器已经够辛苦了,尤其是如果它期望自己编译的话。试图支持所有 C++ 特性,如嵌套类和模板,会让你发疯。也许一个小组可以做到,但就你自己而言,我认为一个 C 编译器就足够了。

如果您对此一无所知,请至少先实现一种类似 C 的语言(这样您就可以提交一些东西)。然后专注于炫耀。

于 2009-03-06T13:35:49.230 回答
22

“确切的任务绝对是愚蠢的”——我认为你不能公平地做出这个判断。最好放弃这种观点。

“我要自己写这个项目”——你说这是一个小组项目。您是说您的团队不同意您的观点,即它应该转变为 C++,所以您要开始自己的工作?还有一点我建议改变。

你对 C++ 的了解程度并不重要。您在语法、解析器、词法分析器、AST 和代码生成方面的能力似乎更为密切。

在不了解您或任务的情况下,我会说您在 5 月底之前完成原始任务会做得很好。那就是三个月了。坚持任务。它的难度可能会让你大吃一惊。

如果您提前完成并履行您对团队的义务,我会说您应该随时修改生成的内容以添加 C++ 功能。

我敢打赌 Bjarne Stroustrup 花了三个多月的时间才将对象添加到 C。不要高估自己或低估最初的任务。

于 2009-03-06T13:38:06.010 回答
11

没问题。当您使用它时,为什么不实施一个操作系统来让它运行呢。

于 2009-03-06T14:07:24.553 回答
7

按照任务。为类 C语言编写编译器!我要做的是选择 C ​​的一个子集。删除浮点数据类型和构建编译器时不需要的所有其他功能。

编写 C 编译器需要大量工作。几个月后你将无法做到这一点。编写 C++ 编译器简直是疯了。5年内你不可能做到这一点。

于 2009-03-06T13:56:26.793 回答
5

我想强调已经提到的几点并提供一些参考。

1) 坚持 1989 ANSI C 标准,没有优化。

2) 别担心,只要有适当的指导、良好的组织和相当多的努力,这是可行的。

3) 阅读C 编程语言封面。

4) 从龙书了解编译器开发的重要概念。

5)看看lcc的代码和

6) 看看Lex 和 Yacc(或 Flex 和 Bison)

7) 编写一个 C 编译器(直到它可以自编译)是程序员的通行仪式。好好享受。

于 2009-03-06T15:32:33.117 回答
3

对于一个类项目,我认为要求编译器能够自己编译有点过分。我认为这就是问题中愚蠢的意思。这意味着您需要提前确定要实现多少 C,并在构建编译器时坚持这一点。因此,使用原语而不是仅仅使用 STL 映射来构建符号表。这对于数据结构课程可能很有用,但错过了编译器课程的重点。它应该是关于理解编译器所涉及的问题,并选择要使用的数据结构,而不是对数据结构进行编码。

构建编译器是一种很好的方式,可以真正了解一旦编译器掌握了代码会发生什么情况。目标语言是什么?当我学习编译器时,我们三个人花了整个学期的时间来构建一个从 sorta-pascal 到汇编的编译器。这不是一项微不足道的任务。它是一开始看起来很简单的事情之一,但你越深入,事情就越复杂。

于 2009-03-06T15:13:12.100 回答
2

您应该能够在时间范围内完成类 c 语言。假设您参加的课程超过 1 门,这正是您可以及时完成的​​。C++ 也是可行的,但需要花费更多的额外时间。期望做 c++ 模板/虚拟函数是对自己的期望过高,你可能会一起失败。所以最好坚持使用ac子集编译器并及时完成。您还应该考虑质量检查所需的时间。如果你想要彻底的 QA 本身也需要很好的时间。

于 2009-03-06T14:50:49.503 回答
1

命名空间或嵌套类,无论是虚函数在语法级别上都非常简单,它只需要解析一两个规则。在更高级别上,在决定选择哪个函数/类(名称阴影、命名空间之间的名称不明确等)或编译为字节码/运行 AST 时要复杂得多。所以 - 你可以写这些,但如果没有必要,跳过它,只写裸函数模型。

于 2009-03-06T13:37:41.333 回答
1

如果您谈论的是带有代码生成的完整编译器,那就忘了它。如果您只是打算做词法和句法分析方面的事情,那么某种形式的模板可能在时间框架内几乎是可行的,具体取决于您使用的编译器构建工具。

于 2009-03-06T13:41:32.227 回答