有很多关于创建编译器的书籍和文章,它们一次完成所有编译工作。那些IDE使用的增量编译器/解析器的设计呢?我熟悉第一类编译器,但我从未使用过第二类编译器。
我试图阅读一些关于Eclipse Java开发工具的文章,但是他们描述了如何使用完整的基础设施(即API)而不是描述内部设计(即内部如何工作)。
我的目标是为我自己的编程语言实现增量编译器。你会推荐我哪些书籍或文章?
答案 0 :(得分:14)
本书值得一看:提供灵活的增量编译器后端。
引自Ch。 10“结论”:
本文探讨了设计 增量的后端 编译系统。而不是 构建单个固定增量 编译器,本文提出了一个 构建这样的灵活框架 系统根据用户需求而定。
我认为这就是你要找的......
编辑:
所以你计划创建一个被称为“交叉编译器”的东西?!
我开始了新的尝试。到现在为止,我无法提供最终的参考。如果你计划这么大的项目,我相信你是一个经验丰富的程序员。因此,您可能已经知道这些链接。
Compilers.net
某些编译器的列表,甚至是交叉编译器(Translators)。不幸的是,有一些断开的链接,但'Toba'仍在工作,并有一个链接到其源代码。可能这可以激励你。
clang: a C language family frontend for LLVM
好的,它适用于LVVM,但源代码在SVN存储库中可用,它似乎是编译器(转换器)的前端。也许这可以激励你。
答案 1 :(得分:4)
我将不同意传统智慧,因为大多数传统智慧都会对您的目标做出不成文的假设,例如完整的语言设计和对极端效率的需求。从你的问题,我假设这些目标:
您想构建一个黑客攻击线束和一个递归下降解析器。
以下是您可能只想使用基于文本的处理器为线束构建的内容。
在家用硬件上切换运行(现在为OFF)
你的命令,陛下?
您可能希望用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,测试线束等。
制作自己的语言可能是一段美妙的旅程!期待学习。不要指望致富。
答案 2 :(得分:1)
我看到有一个已接受的答案,但我认为此页面上可以包含一些其他材料。
我阅读了关于这个主题的维基百科文章,它与1997年的DDJ文章相关联:
http://www.drdobbs.com/cpp/codestore-and-incremental-c/184410345?pgno=1
文章的内容是第一页。它解释了编辑器中的代码被分成“合并”到“CodeStore”(数据库)中的部分。这些部件通过包含未合并件的工作队列合并。可以解析一段代码并将其多次返回到工作队列,每次尝试都会失败,直到成功完成。数据库包含各个部分之间的依赖关系,这样当编辑源代码时,可以看到对编辑过的部分和其他部分的影响,并且可以重新处理这些部分。
我相信其他系统会以不同方式解决问题。 Java提出了与C / C ++不同的问题,但也有优势,因此Eclipse可能有不同的设计。