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

有帮助吗?

解决方案

坚持做一个C编译器。

相信我,构建一个体面的C编译器是非常困难的,尤其是如果它希望自己编译的话。试图支持嵌套类和模板等所有C ++功能会让你疯狂。也许一个小组可以做到这一点,但我自己认为C编译器绰绰有余。

如果你已经死定了,至少要先实现类似C语言(这样你就可以提交一些内容)。 然后专注于炫耀。

其他提示

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

“我要自己写这个项目” - 你说这是一个小组项目。你是说你的小组不想同意你应该变成C ++的观点,所以你要自己起飞和工作?还有一点我建议改变。

你对C ++的了解程度并不重要。你对语法,解析器,词法分析器,AST和代码生成的能力似乎更加密切相关。

在不了解您或作业的情况下,我会说您在5月底完成原始作业时表现不错。那是三个月之后。坚持任务。它很难让你感到惊讶。

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

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

没问题。当你在它的时候,为什么不实现一个操作系统来运行它。

按照作业进行操作。为 C-like 语言编写编译器! 我要做的是选择C的子集。删除浮点数据类型以及构建编译器时不需要的所有其他功能。

编写C编译器需要做很多工作。几个月后你将无法做到这一点。 编写C ++编译器是彻头彻尾的疯狂。你将无法在5年内做到这一点。

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

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

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

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

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

5)看一下 lcc 的代码以及< a href =“https://rads.stackoverflow.com/amzn/click/com/0805316701"rel =”noreferrer“> book 。

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

7)编写一个C编译器(直到可以自编译的程度)是程序员之间的一种仪式。享受吧。

对于一个类项目,我认为要求编译器能够编译自己有点问题。我认为这就是问题中愚蠢的含义。这意味着您需要提前确定要实现的C的确切数量,并在构建编译器时坚持这一点。因此,使用基元构建符号表而不是仅使用STL映射。这可能对数据结构课程有用,但是忽略了编译器课程的要点。它应该是理解编译器所涉及的问题,并选择使用哪些数据结构,而不是编码数据结构。

构建编译器是一种非常好的方式,可以在编译器获得代码后真正理解代码会发生什么。什么是目标语言?当我接受编译器时,我们整个学期花了三个人来构建一个编译器,从sorta-pascal转到汇编。这不是一项微不足道的任务。它起初看起来很简单,但是越多,它就越复杂。

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

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

如果您正在谈论一个完整的编译器,并生成代码,那么就算了。如果你只是打算做词汇&amp;语法分析的一面,然后某种形式的模板可能在时间范围内可行,具体取决于您使用的编译器构建工具。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top