我正在为我班上的一个项目工作。我正在使用 Flex(lex)和 Bison(YACC)和C构建编译器。我只做了一些语义分析,但我一直在思考我将如何实现面向对象的部分。也就是说,我如何处理类,重载,多态和遗产。
我似乎无法在谷歌上发现一些有用的东西,而龙书的水平太低了。我的意思是过于专注于从头开始构建编译器。所以我希望有人能指出我一本好书,教程,例子,这些东西可以帮助我消除疑虑。
提前感谢您的帮助,如果有人认为我要完成我的作业,我很抱歉。
答案 0 :(得分:3)
我同意第一条评论,即这个问题太广泛而无法回答。但无论如何我都会尝试。
您的问题有几个方面:
语言之间存在很大差异,对OOP的实际含义也存在相当多的混淆/争议(关于该主题的一个很好的演示:http://www.infoq.com/presentations/It-Is-Possible-to-Do-OOP-in-Java还有一些实现OOP特性的例子)。只需选择一个模型并查找定义语义的引用,例如语言规范或模型上的科学论文。
Javascript可能是最容易实现的模型,因为它非常直接映射到实现,而编译器中没有太多必要的周围框架。 Java模型的静态版本(编译时类编译而不是运行时类加载)也不应该太难。更复杂的模型是C ++(允许多重继承)和Smalltalk或Common Lisp / CLOS(使用元对象协议)。
同样有多种选择。由于语义是固定的,而且大部分都是直接的,因此实现工作最大程度上取决于您要归档的性能和编译器的现有基础结构。将所有内容存储在列表中并扫描它们以获得满足规则的第一个条目可能是最简单的实现。
Java / C#/ C ++区域以外的大多数编程语言都会进行静态编译时名称/签名查找,以查找所引用事物的定义,并使用http://en.wikipedia.org/wiki/Virtual_method_table来解析多态调用。他们还使用Vtable指针进行instanceof
- 检查和检查向下转换。
虽然只有30页与对象直接相关,但我仍然认为Lisp in Small Pieces (LiSP)是一本很好的书,可以在编译器中学习该级别的工作。它专注于实现语言功能,实现中的权衡以及将各个部分组合在一起。 (如果(你可以克服使用的语法)(这很棒))。