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