我目前正在为我的班级做一个项目。我正在用Flex (Lex)、和Bison (YACC)、和C构建一个编译器。我只做了一点语义分析,一种语法分析,但我一直在考虑如何实现面向对象的部分。也就是说,我如何处理类、重载、多态和继承。
我似乎找不到什么有用的谷歌和龙书,它只是太低的水平。我的意思是太专注于从头开始构建一个编译器。所以我希望有人能给我指点一本好书,比如教程,一些能帮助我消除疑虑的东西。
提前感谢你的帮助,如果有人认为这是在要求我做家庭作业,我很抱歉。
发布于 2011-10-31 22:01:23
我同意第一个意见,即这个问题太宽泛,无法回答。但我还是会试试的。
你的问题有几个方面:
语义学
语言之间差异很大,对于OOP的实际含义也有相当多的混淆/争论(关于这个主题的一个很好的介绍:http://www.infoq.com/presentations/It-Is-Possible-to-Do-OOP-in-Java,它也有一些实现OOP特性的例子)。只需选择一个模型并查找定义语义的引用,如语言规范或模型上的科学论文。
Javascript可能是最容易实现的模型,因为它非常直接地映射到实现,而编译器中没有很多必要的框架。Java模型的静态版本(编译时类编译而不是运行时类加载)也不应该太难。更复杂的模型将是C++ (它允许多重继承)和Smalltalk或Common /CLOS(带有元对象协议)。
可能的实现
再一次,各种各样的选择。由于语义是固定的,而且非常简单,所以实现工作最主要取决于您想要存档的性能和编译器的现有基础结构。将所有内容存储在列表中并扫描它们以找到满足规则的第一个条目可能是最简单的实现。
通常执行
Java/C#/C++区域之外的大多数编程语言都进行静态编译时名称/签名查找,以查找所引用的内容的定义,并使用表格解析多态调用。他们还将Vtable指针用于instanceof-checks和检查向下转换。
资源
虽然只有30页与对象直接相关,但我仍然认为小片段Lisp (LiSP)是一本很好的书,可以在编译器中学习在该级别上工作。它着重于实现语言特性、实现中的权衡以及将这些部分整合在一起。(如果(您可以克服所使用的语法)(这很棒))。
https://stackoverflow.com/questions/7948940
复制相似问题