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