首选语言:C / C ++,Java 和 Ruby。
我正在寻找一些有用的书籍 / 教程,以了解如何仅出于教育目的编写自己的编译器。我最熟悉 C / C ++,Java 和 Ruby,因此我更喜欢涉及这三种资源之一的资源,但是任何好的资源都是可以接受的。
Legend:
我认为这是一个非常模糊的问题。只是因为涉及的主题很深。但是,编译器可以分解为两个独立的部分。上半部分和下半部分。上半部分通常采用源语言并将其转换为中间表示,下半部分负责平台特定的代码生成。
尽管如此,一种用于实现该主题的简便方法的想法(至少在我们的编译器类中使用了该想法)是在上述两部分中构建编译器。具体来说,仅通过构建上半部分就可以对整个过程有所了解。
仅做上半部分就可以使您获得编写词法分析器和解析器的经验,并生成一些 “代码”(我提到的中间表示形式)。因此,它将采用您的源程序并将其转换为另一种表示形式,并进行一些优化(如果需要),这是编译器的核心。然后,下半部分将采用该中间表示形式,并生成在特定体系结构上运行程序所需的字节。例如,下半部分将采用您的中间表示形式并生成 PE 可执行文件。
我发现有关此主题的一些书特别有用,例如《 编译器原理和技巧》 (或《龙书》,这是由于封面上有可爱的龙)。它有一些很棒的理论,并且确实以一种真正可访问的方式涵盖了上下文无关文法。另外,为构建词法分析器和解析器,您可能会使用 * nix 工具 lex 和 yacc。不足为奇的是,这本名为《 lex and yacc 》的书在这本《龙书》停了下来的地方接了下来。
我认为ML 中的现代编译器实现是编写文本的最佳入门编译器。还有一个Java 版本和一个C 版本,鉴于您的语言背景,这两个版本可能更易于访问。本书包含许多有用的基本材料(扫描和解析,语义分析,激活记录,指令选择,RISC 和 x86 本机代码生成)和各种 “高级” 主题(编译 OO 和功能语言,多态性,垃圾回收,优化和静态分配表格)放入相对较小的空间(约 500 页)。
我更喜欢《现代编译器实现》而不是《 Dragon》一书,因为《现代编译器》实现只研究了很少的领域,相反,它确实涵盖了编写严肃,体面的编译器所需的所有主题。阅读完本书后,如果需要,您将可以直接处理研究论文,以进行更深入的了解。
我必须承认,我对 Niklaus Wirth 的Compiler Construction 情有独钟。它以 PDF 格式在线提供。我发现 Wirth 的编程美学简直很漂亮,但是有些人发现他的风格太小了(例如 Wirth 偏爱递归下降解析器,但是大多数 CS 课程都侧重于解析器生成器工具; Wirth 的语言设计相当保守。)编译器构造是非常简洁的提炼关于 Wirth 的基本思想,因此无论您是否喜欢他的风格,我都强烈建议您阅读本书。