我正在为我班上的一个项目工作。 我正在使用Flex(lex)和Bison(YACC)和C构建编译器。我只做了一些语义分析,但我一直在思考如何实现面向对象的部分。 也就是说,我如何处理类,重载,多态和遗产。
我似乎无法在谷歌上发现一些有用的东西,而龙书的水平太低了。 我的意思是过于专注于从头开始构建编译器。 所以我希望有人可以指点我一本好书,教程,例子,这些东西可以帮助我消除疑虑。
在此先感谢您的帮助,如果有人认为这是要求完成我的作业,我很抱歉。
我正在为我班上的一个项目工作。 我正在使用Flex(lex)和Bison(YACC)和C构建编译器。我只做了一些语义分析,但我一直在思考如何实现面向对象的部分。 也就是说,我如何处理类,重载,多态和遗产。
我似乎无法在谷歌上发现一些有用的东西,而龙书的水平太低了。 我的意思是过于专注于从头开始构建编译器。 所以我希望有人可以指点我一本好书,教程,例子,这些东西可以帮助我消除疑虑。
在此先感谢您的帮助,如果有人认为这是要求完成我的作业,我很抱歉。
我同意第一个评论,即这个问题太广泛而无法回答。 但无论如何我会尝试。
您的问题有几个方面:
语言之间存在很大差异,对于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
-checks并检查向下转换。
虽然只有30页与对象直接相关,但我仍然认为Lisp in Small Pieces(LiSP)是一本很好的书,可以在编译器中学习该级别的工作。 它专注于实现语言功能,实现中的权衡以及将各个部分组合在一起。 (如果(你可以克服使用的语法)(这很棒))。