本书的第一版使用C作为实现语言,第二版用C++,第三版采用Java. 尽管我会保留早期版本的结构,理念和方法,但这是一次真正彻底的重写。
你会学到什么东西?
通过本书你将学到如何采用高级语言编写用于处理程序的编译器和解释器。(1) 你将会写能够执行程序的解释器。(2) 在引入调试器后,你能够在程序执行时,通过设置断点与解释器交互,显示调用栈,查看和修改变量值,还有逐行的单步调试。(3)在引入IDE后你能在观察屏幕程序过程中用鼠标做所有事情。(4)你还会学习到写为JVM生成目标代码的编译器(也就是生成JVM 汇编代码),这样能够在多个平台上运行编译后的程序。当然,因为编译器,解释器,IDE都是用Java写的,也能在多平台上运行他们。
你写的编译器解释器将处理的源程序语言是Pascal。我基于几个理由选择Pascal。首先它是个真的编程语言,不是为本书需要杜撰的。Pascal是在70年代中期和80年代非常流程的面向过程的高级语言。这个语言有一个相对来说比较直白的语法但包含很多使编写充满乐趣的语言特性,比如结构化的用户自定义类型,嵌套作用域,值传参/引用传参,完整的控制语句集等等。Pascal今天仍活着,你可在网上下载免费的Pascal编译器和解释器,与你自己写的比比
软件工程方法
编译器和解释器很复杂,搞成功不容易。为处理这种复杂度,我采用软件工程方法诸如设计模式,统一建模语言(UML)图和其它现代面向对象的设计实践让代码更好理解好管理。
贯穿全书,特别是早期的篇章,设计笔记 指出相关设计要点比如用到的设计模式,我为何选用这种方式架构代码等。
我坚信的方法是 增量开发,每一步完成少量代码,基于上一步构建下一步可运行的代码。基本上每章包含一个主工作程序和其它简练的增量代码。每章的程序构建以上一章的代码为基础。(提醒你不要跳跃式看书)
书的组织方式
第一章是简介。第二章讲述了编译器和解释器的框架,怎样设计和测试框架为让后续的成功编写打下个好基础。紧接着两章关注基本(语言)转换工作:词法扫描(第三章),符号表(第四章)。接下的几章会构建一个可运行的解释器。基于增量开发方法,这些章会迭代语法分析和解释好几次,每次增加点新的语言特征。第五章分析表达式和赋值语句,第六章解释她们;第七章分析控制语句,第八章解释;第九章分析声明(Declaration),第十章做语法检查,第十一章分析过程(Procedure),函数(Function)和程序(Program)。第十二章完善解释器使其能够运行整个Pascal程序。
接下来的两章基于前面的工作。第十三章增加了一个能够通过命令行输入命令与之交互的源码级调试器。第十四章将命令行调试器以GUI封装成为一个IDE,你初次通读时可以跳过这两章而不失连续性,但以后一定要看,因为它讲了不少真的很NB的开发工具。
本书的最后部分讲述基于前面章节开发编译器。第十五章介绍了Java虚拟机(JVM)的结构和Jasmin即编译器生成的JVM汇编语言。同样还是增量方法,第十六章编译程序,赋值语句和表达式。十七章编译过程和函数调用以及字符串操作。十八章通过编译控制语句,数组和Record(后续将会以纪录称呼)来完善整个编译器。
末尾的19章简要介绍前面章节没有涉及到的编译器编写相关话题,比如代码优化和表驱动词法扫描和语法分析器。
哪儿能得到源程序
你能在网页 http://www.apropos-logic.com/wci/ (不过建议你看每章中经过汉化改写的中文版代码,注释更全面)下载本书用到的所有源程序。你会找到怎么下载,编译,安装,运行程序的介绍。上面还有很多Pascal测试程序。