Language Implementation Patterns

Terence Parr

出版时间

2010-01-10

ISBN

9781934356456

评分

★★★★★
书籍介绍
这是一本把编译原理从'玄学'拆解成'可复用套路'的工程实践书。它不纠缠于龙书式的理论证明与代码优化,而是聚焦编译器前端——词法、语法、语义分析、解释器——将反复出现的实现模式逐一提炼,配合 Java 与 ANTLR 给出可参照的样例。读者反馈两极:盛赞它越过最难的语义解析与优化,深入浅出,是写外部 DSL 的必备;也有人嫌它'内容太少''停留在七十年代',只讲怎么用、不讲为什么。正因如此,它更适合已掌握编译基础、想快速上手语言实现或 DSL 开发的工程师,而非指望单凭此书学通编译原理的初学者。
AI导读
核心看点
  • 提炼语言实现通用模式,涵盖词法到解释器全流程
  • 基于ANTLR工具实战,提供Java代码示例与最佳实践
  • 侧重工程落地与DSL开发,弥补传统理论教材的不足
读者共识
  • 工程味道浓厚,实战性强,是编写DSL的必备参考书
  • 相比传统编译原理教材更易懂,适合入门但深度有限
  • 作者深入浅出,但缺乏语义优化等深层理论指导
精彩摘录
  • "图11.2中所示是使用这些引擎的方法,需要给引擎提供输入语言的文法和系列的转换规则。根据文法,引擎从输入内容构造解析樹,然后应用规则到输出。"
  • "11.3模型驱动的翻译 Model-driven Translation 在模型驱动翻译器中,一切都要围绕解析器构建的输入模型进行。最简的就是创建AST模型,然后一边对其进行遍历,一边对其进行输出”。它与导译器唯一的区别是在历过程中生成代码,而不是在解析过程中生 AST的优点是可以在生成输出之前进行语义分析。"
  • "的输出语言)的语法都会搅和在一起。使用这种显式的生成类时,输入模型和输出模型之间的连通管道通常都是构造方法的参数。 将赋值子树映射到对应的输出对象其实是很自然的过程,下面来考虑更复杂的情况:译标矩的垂法运算两者的语法都一样,但是语义上却有很大的差别。所以,要想创建正确的输出模型,翻译时必须检测待翻译表达式的类型"
  • "Python采取动态类型机制,因此程序员不用指明程序实体的类型(而编译器也无法通过推断计算出所有的类型)。 Python的解释器会在运行时检查所有的语义规则。C++正好处于另一个极端,虽然其他的规则都是执行时完成的,但C+是静态类型语言,使用者必须指定所有程序实体的类型。程序实体的概念比较广泛,包括程序中的常量、变量、函数、方法、类等要素。有些语言在编译时对某些语义规则进行静态检查,但为了防止恶意程序造成破坏,在执行时还会再次检査。比如,Java在编译时刻和运行时刻都会做类型检查。"
  • "语句的含义既反映在其结构里(语法),又体现于它所使用的符号和词汇中。结构指明的是该进行什么操作,而符号代表的是对什么进行操作。 这里会对许多类型安全规则进行检查。简言之,所有的操作和赋值语句中操作数的类型必须合法 本章的几种模式都会采用三次遍历,实际上,它们前两次遍历都一样。第一次遍历, Symbol解析器构建AST:第二次遍历,树遍历器构建作用域树,并生成符号表。模式ニ十的第三次遍历会在遍历AST的时候计算各个表达式的类型。"
  • "类型提升的目的就是统一操作类型。 编译器的语义分析器使用静态类型分析器来判断该提升哪一个元素或子表达式。通常,分析器会修改中间表示树以加入需要类型转换的节点。翻译器只要进行标注即可,类型转换可以在代码生成阶段完成,这比修改树要容易多了 不光是表达式,静态类型分析器还需要分析赋值语句、返回语句、函数调语句和数组下标语句中的值的类型,以检查是否需要提升。"
  • "要实现算术类型提升,还需要两个函数:第一个函作数类型,能判断操作的结果类型;第二个函数根据输结果类型,能判断是否要进行类型提升。"
  • "实现 Cymbal的返回值类型表时,需要先定义各个类型的序号。然后定义类型。有了这些定义,就能填写算术操作的返回类型表了。"
用户评论
非常优秀,但是还不至于说可以扔掉龙书。本书重在勾勒实现思路与提炼实现模式,但缺乏理论与原理的指导。想单凭这本书来掌握编译技术是不现实的。
徐徐读完。入门书。
断断续续看完,正如书名所说 「patterns」介绍了一些实现 pattern 以及优缺点,本书例子用的是 java + ANTLR, 逐步介绍了 Lexer, Parser, Semantic Analyze, Interpreter 的实现,总的是来说适合入门了解
ANTLR&Stringtemplate的作者写的,越过编译界最难的语义解析及代码优化,真正做到了深入浅出,非常了不起!Start,2015年2月25日。唉,难以接受的结果。Done,2015年6月8日.
感觉可以归入应用类书籍,即是教会你如何去用,至于怎么用和为什么要这么用则不属于这本书的范畴.总地来说,就是一本工程味道浓重的书.
例子是用Java的某py库实现的,列举的样例有点过时,多是修饰语言
绝对实用,感觉入门了😃
翻阅评论结论:中文版翻译可读 未读完
Pragmatic Bookshelf的其他书籍查看全部

下载
收藏