学习渐进式编译设计

时间:2011-05-13 16:55:06

标签: parsing compilation incremental-compiler

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

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

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

3 个答案:

答案 0 :(得分:14)

本书值得一看:提供灵活的增量编译器后端。

引自Ch。 10“结论”:

  

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

我认为这就是你要找的......

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

Compilers.net
某些编译器的列表,甚至是交叉编译器(Translators)。不幸的是,有一些断开的链接,但'Toba'仍在工作,并有一个链接到其源代码。可能这可以激励你。

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

答案 1 :(得分:4)

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

  • 了解如何编写自己的语言
  • 使用您的语言,直到它看起来很优雅
  • 尝试将代码发送到另一种语言或字节代码以便实际执行。

您想构建一个黑客攻击线束和一个递归下降解析器。

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

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

    你的命令,陛下?

  8. 您可能希望用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)
            ...
    

    所以你需要写:

    • 黑客入侵的小菜单。
    • 一些lexing例程,为数字,保留字等返回不同的标记。
    • 一堆用你的语言
    • 的逻辑

    这种方法旨在加快黑客攻击语言的周期。当你完成这个方法,然后你到达BISON,测试线束等。

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

答案 2 :(得分:1)

我看到有一个已接受的答案,但我认为此页面上可以包含一些其他材料。

我阅读了关于这个主题的维基百科文章,它与1997年的DDJ文章相关联:

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

文章的内容是第一页。它解释了编辑器中的代码被分成“合并”到“CodeStore”(数据库)中的部分。这些部件通过包含未合并件的工作队列合并。可以解析一段代码并将其多次返回到工作队列,每次尝试都会失败,直到成功完成。数据库包含各个部分之间的依赖关系,这样当编辑源代码时,可以看到对编辑过的部分和其他部分的影响,并且可以重新处理这些部分。

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