oop - 构建面向对象的编译器

标签 oop compiler-construction yacc lex

我目前正在为我的类(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/

    相关文章:

    ios - swift 中的统一响应/错误处理

    c - yacc 在归约过程中丢失了值

    yacc - 如何将 lex 文件中的 yytext 传递给 yacc?

    c++ - 没有空格的 Lex 解析

    oop - Liskov 替换原则是否与开放/封闭原则冲突?

    c# - 我应该多积极地进行子类化以保持 DRY?

    JavaCC 和 Unicode 问题。为什么\u696d属于 "\u4e00"-"\u9fff"范围,但在JavaCC中无法管理

    css - W3C CSS 语法,语法怪癖

    php - 像谷歌一样的分页背后的逻辑

    时间:2019-03-08 标签:c++typeidoperator