27

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

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

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

4

3 回答 3

14

这本书值得一看:Builing a Flexible Incremental Compiler Back-End。

引用来自 Ch。10“结论”:

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

我想这就是你要找的...

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

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

clang:LLVM 的 C 语言家族前端
好的,它用于LVVM,但源代码在 SVN 存储库中可用,它似乎是编译器(翻译器)的前端。也许这也能激发你的灵感。

于 2011-06-01T05:45:37.503 回答
4

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

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

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

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

  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、测试工具等。

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

于 2011-06-01T18:52:26.140 回答
1

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

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

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

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

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

于 2012-07-08T22:42:32.140 回答