学习增量编译设计



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

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

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

这本书

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

引自第10章"结论":

本文探讨了 增量的后端 编译系统。而不是 构建单个固定增量 编译器,本文提出了一个 构建此类的灵活框架 系统符合用户需求。

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

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


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

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

在这一点上,我不同意传统智慧,因为大多数传统智慧对你的目标做出了不成文的假设,比如完整的语言设计和对极端效率的需求。 从你的问题中,我假设这些目标:

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

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

以下是您可能希望仅使用基于文本的处理器为工具构建的内容。

  1. 更改代码片段(现在为"AT 0700 将走廊灯设置为全开")
  2. 编译片段
  3. 更改代码文件(现在是"tests.l")
  4. 从文件编译
  5. 切换词法分析器输出(现在打开)
  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)
        ...

所以你需要写:

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

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新