学习编写一个编译器
首选语言:C / C ++,Java和Ruby。
我正在寻找一些关于如何编写自己的编译器的有用的书籍/教程,仅用于教育目的。 我对C / C ++,Java和Ruby最为熟悉,所以我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的。
资源大名单:
传说:
我认为这是一个非常模糊的问题。 只是因为涉及这个主题的深度。 编译器可以分解成两个独立的部分,但是; 上半部分和下半部分。 上半部分通常采用源语言并将其转换为中间表示形式,下半部分负责平台特定的代码生成。
尽管如此,一个简单的方法来解决这个问题(我们在编译器类中至少使用过的一个方法)的一个想法是在上面描述的两部分中构建编译器。 具体来说,您只需构建上半部分即可了解整个流程。
只要完成上半部分,就可以获得编写词法分析器和解析器的经验,并生成一些“代码”(我提到的中间表示)。 所以它会把你的源程序转换成另一种表示并做一些优化(如果你想的话),这是编译器的核心。 然后,下半部分将采用该中间表示形式,并生成在特定体系结构上运行程序所需的字节。 例如,下半部分将采用您的中间表示形式并生成PE可执行文件。
关于这个主题的一些书籍,我发现特别有用的是编译原则和技术(或龙书,由于可爱的龙在封面上)。 它有一些伟大的理论,并且以真正可访问的方式确实涵盖了上下文无关语法。 另外,为了构建词法分析器和解析器,您可能会使用* nix工具lex和yacc。 而且无趣的是,这本名为“lex and yacc”的书收录了龙书在这部分留下的部分。
我认为ML中的Modern Compiler Implementation是编写文本的最佳入门编译器。 还有一个Java版本和一个C版本,根据您的语言背景,这两种版本都可以更容易访问。 本书包含了许多有用的基本资料(扫描和解析,语义分析,激活记录,指令选择,RISC和x86本地代码生成)以及各种“高级”主题(编译面向对象和功能语言,多态,垃圾收集,优化和单个静态分配表单)分配到相对较小的空间(〜500页)中。
我更喜欢现代编译器实现龙的书,因为现代编译器实现调查较少的领域 - 相反,它确实覆盖了所有需要编写一个严肃,体面的编译器的主题。 完成本书后,如果需要,您可以直接处理研究论文以获得更深入的研究。
我必须承认,我对Niklaus Wirth的编译器构建有着严重的困惑。 它可以在网上以PDF格式提供。 我发现Wirth的编程美学非常美丽,但是有些人觉得他的风格太少了(例如Wirth倾向于递归下降解析器,但是大多数CS课程都关注解析器生成工具; Wirth的语言设计相当保守)。编译器构建是一个非常简洁的蒸馏Wirth的基本想法,所以不管你是否喜欢他的风格,我都强烈推荐阅读这本书。
链接地址: http://www.djcxy.com/p/43413.html