【问题标题】:Learning incremental compilation design学习增量编译设计
【发布时间】:2011-05-13 16:55:06
【问题描述】:

有很多关于创建编译器的书籍和文章,它们一次完成所有编译工作。 IDE 使用的增量编译器/解析器的设计又如何呢?我熟悉第一类编译器,但我从未使用过第二类。

我试图阅读一些关于 Eclipse Java 开发工具的文章,但它们描述了如何使用完整的基础架构(即 API),而不是描述内部设计(即它如何在内部工作)。

我的目标是为我自己的编程语言实现增量编译器。你会推荐我哪些书或文章?

【问题讨论】:

  • 你问这个问题已经一年了,我也有同样的情况。你找到更好的信息了吗?
  • Johannes,很抱歉很久没有回复。不幸的是,我错过了你的评论。有几种不同的方法。而且这个问题还是很差覆盖。有一些理论文章,但工程师熟悉的实现太少了。不过,我建议您查看 Intellij Idea 的方法:goo.gl/wMJjk。尤其是这个框架:goo.gl/BaK9B.

标签: parsing compilation incremental-compiler


【解决方案1】:

这本书值得一看:构建灵活的增量编译器后端。

引自Ch。 10“结论”:

本文探讨了设计 增量的后端 编译系统。而不是 构建单个固定增量 编译器,本文提出了一个 构建这样的灵活框架 系统根据用户需求。

我想这就是你要找的……

编辑:
所以你打算创建一个被称为“交叉编译器”的东西?!
我开始了新的尝试。直到现在,我都无法提供最终的参考。如果你计划这么大的项目,我相信你是一个经验丰富的程序员。因此,您可能已经知道这些链接。

Compilers.net
某些编译器的列表,甚至是交叉编译器(Translators)。不幸的是,有一些断开的链接,但“Toba”仍在工作,并且有一个指向其源代码的链接。或许这能激发你的灵感。

clang: a C language family frontend for LLVM
好的,它适用于LVVM,但源代码在 SVN 存储库中可用,它似乎是编译器(翻译器)的前端。或许这也能激发你的灵感。

【讨论】:

  • 马库斯,谢谢您的回复。我希望它对我有用。如果我理解正确,它侧重于设计的后端方面,但我正在寻找前端(也许还有中端)方面,如解析和 AST 构造。我自己的语言编译器属于源到源类,因此其设计的后端方面可能与源到字节码编译器中的类似方面不同。是否可以阅读一些专注于前端方面的文章?
  • 这是我在这里收到的最接近的答案。我还在论文的参考资料部分找到了有趣的链接。所以我将此答案标记为“已接受”。再次感谢您!
【解决方案2】:

在这一点上,我不同意传统观点,因为大多数传统观点都会对您的目标做出不成文的假设,例如完整的语言设计和对极高效率的需求。根据您的问题,我假设这些目标:

  • 了解如何编写自己的语言
  • 玩弄你的语言,直到它看起来优雅
  • 尝试将代码转换为另一种语言或字节码以供实际执行。

您想构建一个黑客工具和一个递归下降解析器。

这是您可能想要为线束构建的内容,仅使用基于文本的处理器。

  1. 更改代码片段(现在“AT 0700 SET HALLWAY LIGHTS ON FULL”)
  2. 编译片段
  3. 更改代码文件(现为“tests.l”)
  4. 从文件编译
  5. 切换 Lexer 输出(现在打开)
  6. 切换发射器输出(现在打开)
  7. 在家用硬件上切换运行(现在关闭)

    您的命令,陛下?

您可能希望使用 Python 或其他脚本语言编写代码。你正在优化你的游戏速度,而不是执行。递归下降解析器可能如下所示:

def cmd_at():
    if next_token.type == cTIME:
        num = next_num()
        emit("events.setAlarm(events.DAILY, converttime(" + time[0:1] + ", " 
           + time[2:] + ", func_" + num + ");")
        match_token(cTIME)
        match_token(LOCATION)
        ...

所以你需要写:

  • 黑客小菜单。
  • 一些词法分析例程,用于为数字、保留字等返回不同的标记。
  • 你的语言的一堆逻辑

这种方法旨在加快将语言组合在一起的周期。完成此方法后,您就可以使用 BISON、测试工具等。

制作自己的语言可能是一段美妙的旅程!期待学习。不要指望发财。

【讨论】:

  • 查尔斯,感谢您的详细回复。对于那些第一次开始从事编译器/语言设计的人来说,这可能是一个很好的建议。但我已经完成了这些步骤。我有一个完整的编程语言设计和一个编译器原型。现在我将重写编译器,以便为该语言实现某种 IDE。换句话说,我想做“引导步骤”。因此,我对增量解析设计(不同于常规递归下降或上升解析技术)感兴趣。这就是我问这个问题的原因。 :)
【解决方案3】:

我看到有一个可接受的答案,但我认为在此页面上可以有用地包含一些额外的材料。

我阅读了有关此主题的 Wikipedia 文章,它链接到 1997 年的 DDJ 文章:

http://www.drdobbs.com/cpp/codestore-and-incremental-c/184410345?pgno=1

文章的核心是第一页。它解释说,编辑器中的代码被分成“合并”到“CodeStore”(数据库)中的部分。这些片段通过包含未合并片段的工作队列合并。一段代码可能会被多次解析并返回到工作队列,每次尝试都会失败,直到它成功通过。数据库包括片段之间的依赖关系,以便在编辑源代码时可以看到编辑片段和其他片段的效果,并且可以重新处理这些片段。

我相信其他系统处理问题的方式不同。 Java 与 C/C++ 存在不同的问题,但也具有优势,因此 Eclipse 可能有不同的设计。

【讨论】:

  • 卡迪夫太空人,这是一种有趣的方法。感谢您的参考!