编程语言实现模式

Terence Parr

出版时间

2012-03-19

ISBN

9787560977003

评分

★★★★★

标签

编程

书籍介绍
这本书最打动人的地方,是它把'编译原理'从神坛上请了下来,重新翻译成工程师能直接上手的东西。与'屠龙书'那种偏理论、偏数学的讲法不同,作者的核心主张是:真正需要处理的'语言应用'远比编译器广泛——配置文件解析、代码生成器、源码翻译器、静态类型检查,都是同类问题。全书以31个可复用的设计模式为骨架,每个模式都拆成'数据结构+算法+策略'三件套,让读者拿走的是一套方法,而不是一次性的编码技巧。多位读者提到,读完此书再回头啃经典编译教材会'好理解许多',正说明它充当了从直觉到形式化理论之间的桥梁。适合那些想动手造工具、又希望背后有清晰设计思想支撑的工程师。
作者简介
Terence Parr是美国旧金山大学的计算机教授、研究生导师,他一直致力于从事ANTLR项目(antlr.org)和模板引擎(stringtemplate.org)的设计和开发工作。Terence曾担任IBM、洛克希德马丁、NeXT、雷诺汽车等公司的技术顾问,另著有《ANTLR权威指南》。
AI导读
核心看点
  • 归纳31种语言应用设计模式
  • 涵盖解析、分析及解释执行
  • 侧重工程实践而非纯理论
读者共识
  • 比龙书更易懂且实用
  • 适合构建编译器前端参考
  • 为语言实现提供清晰思路
精彩摘录
  • "图11.2中所示是使用这些引擎的方法,需要给引擎提供输入语言的文法和系列的转换规则。根据文法,引擎从输入内容构造解析樹,然后应用规则到输出。"
  • "11.3模型驱动的翻译 Model-driven Translation 在模型驱动翻译器中,一切都要围绕解析器构建的输入模型进行。最简的就是创建AST模型,然后一边对其进行遍历,一边对其进行输出”。它与导译器唯一的区别是在历过程中生成代码,而不是在解析过程中生 AST的优点是可以在生成输出之前进行语义分析。"
  • "的输出语言)的语法都会搅和在一起。使用这种显式的生成类时,输入模型和输出模型之间的连通管道通常都是构造方法的参数。 将赋值子树映射到对应的输出对象其实是很自然的过程,下面来考虑更复杂的情况:译标矩的垂法运算两者的语法都一样,但是语义上却有很大的差别。所以,要想创建正确的输出模型,翻译时必须检测待翻译表达式的类型"
  • "Python采取动态类型机制,因此程序员不用指明程序实体的类型(而编译器也无法通过推断计算出所有的类型)。 Python的解释器会在运行时检查所有的语义规则。C++正好处于另一个极端,虽然其他的规则都是执行时完成的,但C+是静态类型语言,使用者必须指定所有程序实体的类型。程序实体的概念比较广泛,包括程序中的常量、变量、函数、方法、类等要素。有些语言在编译时对某些语义规则进行静态检查,但为了防止恶意程序造成破坏,在执行时还会再次检査。比如,Java在编译时刻和运行时刻都会做类型检查。"
  • "语句的含义既反映在其结构里(语法),又体现于它所使用的符号和词汇中。结构指明的是该进行什么操作,而符号代表的是对什么进行操作。 这里会对许多类型安全规则进行检查。简言之,所有的操作和赋值语句中操作数的类型必须合法 本章的几种模式都会采用三次遍历,实际上,它们前两次遍历都一样。第一次遍历, Symbol解析器构建AST:第二次遍历,树遍历器构建作用域树,并生成符号表。模式ニ十的第三次遍历会在遍历AST的时候计算各个表达式的类型。"
  • "类型提升的目的就是统一操作类型。 编译器的语义分析器使用静态类型分析器来判断该提升哪一个元素或子表达式。通常,分析器会修改中间表示树以加入需要类型转换的节点。翻译器只要进行标注即可,类型转换可以在代码生成阶段完成,这比修改树要容易多了 不光是表达式,静态类型分析器还需要分析赋值语句、返回语句、函数调语句和数组下标语句中的值的类型,以检查是否需要提升。"
  • "要实现算术类型提升,还需要两个函数:第一个函作数类型,能判断操作的结果类型;第二个函数根据输结果类型,能判断是否要进行类型提升。"
  • "实现 Cymbal的返回值类型表时,需要先定义各个类型的序号。然后定义类型。有了这些定义,就能填写算术操作的返回类型表了。"
目录
第1部分 读取输入
第1章 初探语言应用 3
1.1 大局观 3
1.2 模式概览 5
1.3 深入浅出语言应用 9

显示全部
用户评论
一本很棒的讲述编译原理的书,最重要的是,从中看到了无限的可能性。
相比龙书这类理论派的书, 更加注重工程化的实践. 书里应该是基于antlr v3的, 期待第二版>_<
适合我这种外行看咯。
每次读都有新感觉。 这本书读完,再去啃编译原理,会感觉很好理解。
说了很多的模式,不太适合入门时看.....还是走实战路线....以后再回来看
书里的模式都比较实用,但个人觉得如果不依赖 antlr3 就更好了。
全面详细但不深入,很多泛泛之谈,我发现很多模式可以迁移到解析语言之外,栈模式和寄存器模式甚至可以迁移到编程之外,后面没怎么看具体实现,把思想都看了,发现解析语言真是一个脏累苦的细节体力活,快乐人生得用黑盒,或是人工智能代工——这些解析工作,反正不能手写,这就像去海边捡贝壳一样,茫茫多的看不到尽头,需要机器批量处理。
解析器扫盲入门教材。对于构建一些语法简单的DSL,本书的内容足够了
实战性比较强的语言应用实现解读。模式编号有点不友好,取个名字更方便。
真正的实现编译器,里面的模式很实用
下载
收藏