基本信息
编辑推荐
只需14天,从零开始设计和实现脚本语言
从解释器到编译器,支持函数、数组、对象等高级功能
东京大学&东京工业大学教授执笔
日本编译器权威专家中田育男作序推荐
内容简介
作译者
东京工业大学研究生院信息技术理工系研究科教授,兼任东京大学研究生院信息技术理工系研究科教授。著有《面向切面入门——从Java语言·面向对象步入AspectJ语言程序设计》《简明Java程序设计——Great Ideas for Java Programming》《GUI库机制——软件设计案例研习》等。
陈筱烟
毕业于复旦大学计算机科学与技术系,主要研究方向为跨设备人机交互理论。从大学时期开始接触Java、JavaScript程序开发,目前对Web应用及智能手机应用开发有浓厚兴趣,并参与Android开发文档翻译项目。业余开发的移动应用在Google Play商店中已有数十万次下载。译作有《JavaScript编程全解》《App,这样设计才好卖》等。
目录
第1部分 基础篇
第1天 来,我们一起做些什么吧 1
1.1 机器语言与汇编语言 2
1.2 解释器与编译器 3
1.3 开发语言处理器 5
1.4 语言处理器的结构与本书的框架 6
第2天 设计程序设计语言 10
2.1 麻雀虽小、五脏俱全的程序设计语言 11
2.2 句尾的分号 12
2.3 含糊不得的语言 14
第3天 分割单词 17
3.1 Token对象 18
3.2 通过正则表达式定义单词 19
3.3 借助java.util.regex设计词法分析器 22
3.4 词法分析器试运行 27
第4天 用于表示程序的对象 30
4.1 抽象语法树的定义 31
4.2 设计节点类 34
4.3 BNF 38
译者序
怀着对编译原理的这份兴趣与热忱,我一直都希望能做一些与之相关的工作。遇到这本《两周自制脚本语言》,算是一种缘分。
初见书名,我还有些犹豫。国内以速成为卖点的计算机书籍不少,真正值得一读的好书却不多。诱惑读者靠走捷径学到真知,常常最终使他们绕了弯路。不过在了解到作者是东京大学和东京工业大学计算机系的资深教授后,我又对这本书产生了好奇。一位仍活跃在科研与教学第一线的学者,会怎样在两周内教会读者设计一种脚本语言呢?
读完本书,我颇为惊喜,原本的担心消失殆尽。这是一本有趣而实用的书,内容编排十分独特,作为一本编译原理的入门读物,本书的很多编写思路都围绕这点展开。作者没有为了增添噱头而加入大量初学者不易理解也无需急着掌握的知识与技术,而是始终以够用为本,逐步扩展语言的语法规则,帮助读者从最基础的概念到一些常用的进阶设计理念,逐步掌握语言处理器的运行原理,以及设计一门新的语言的必要步骤。书中随处可见的老师与学生、学生与学生间的轻松对话是本书的一大特色,几位性格迥异的出场人物时而为读者解惑,时而提出一些更深层次的问题,引发读者的思考。
尽管书名是自制脚本语言,但本书的内容却是自制脚本语言处理器。作者花了大量篇幅讲解语言处理器的功能增强与性能优化。与同类书相比,本书使用了一种较为新颖的实现方式,能够有效简化语言处理器的设计与维护成本。尽管它还无法完全胜任实际生活中更为复杂的系统,这种解决问题的思路却对开拓读者的眼界很有帮助。
得益于作者丰富的教学科研经验,本书涉及了不少实践中可能遇到的问题。作者没有直接给出解答,而是引导读者思考,无论是初学者还是有一定基础知识的读者,都能在阅读本书后有新的发现。在翻译本书时,我也有所收获。其中,为了深究一些细节问题,我曾专门致信向作者请教。作者立刻对我的疑问进行了解答,并附上了细致的说明,在他的帮助下,中译本的质量得到了进一步提升。在此谨对作者的支持表示衷心的感谢。此外,中译本已经参照原书的勘误及补遗表做了修改与调整,一些细节问题得到了修正。
在翻译过程中,我得到了许多人的帮助与支持。家人为自己创造了能够安心翻译的环境,并始终给予理解与关心。好友陈洁也为我提供了莫大的支持,使我可以每天以最佳状态投入工作。这里还要感谢图灵的各位编辑提出大量极具价值的建议与意见,帮助本书顺利完成并最终问世。最后,希望对编译原理有兴趣的读者都能从本书中获益。
陈筱烟
2014 年4 月于上海
前言
因此,与其说本书是编译原理的入门书,不如说是语言处理器的入门读物更为恰当。语言处理器是用于执行程序设计语言的软件,它同时包含了编译器与解释器。本书看似用了大量篇幅讲解解释器的原理,其实是在讲解编译器与解释器通用的理论。第1 章将详细介绍各章节的具体内容。
本书采用了Java 语言来实现语言处理器。在设计语言处理器时,C 语言或C++ 语言更为常见,加之本书没有借助yacc 等常用的工具来生成语言处理器,因此读者也许会认为本书的实用性不足。
本书在介绍语言处理器的设计方式时,尽可能采用了较新颖的手段。C 语言或C++ 语言结合yacc 的方式性能较差,且是上世纪80 年代的实现方式。在那之后,程序设计语言飞速发展,已不可同日而语,其运行性能也大幅提升。入门读物也应该与时俱进,讲解与过去不同的设计方式,展现它们的实践价值。
时至今日,软件领域的发展依然日新月异,并逐渐渗透至生活的方方面面,这一势头无疑将持续下去。在此期间,各类技术必将不断发展,为了跟上技术更新的步伐,软件应当以略微领先于时代的设计思路开发。
很久以前,笔者曾使用C++ 语言开发过适用于工作站的语言处理器,当时,时钟频率仅有100 兆赫,内存也不过几百兆字节。那套软件幸运地在各种环境下运行了十年以上。有一天,我收到了一封邮件。我记得好像是一个德国的年轻人,他洋洋洒洒写了很多,批评那套软件的设计有不少问题。还说开发者应当合理使用模板,并灵活运用各种库,要学习使用设计模式,还要用XML 来表示抽象语法树,等等。
他指出我太节省内存,只顾着提升性能,结果程序难以阅读。从当时的主流软硬件标准来看,这些批评确实合情合理,但那套系统毕竟是十年前的产物。在当时软硬件性能孱弱的情况下,如果遵循他的建议,最终完成的语言处理器恐怕会被打上缺乏使用价值的标签(顺便一提,提出批评的那位年轻人虽然说了很多,却没有写一行代码)。
然而,从这件事中我深刻体会到,软件有着惊人的生命力,即使在开发时采用了最佳设计,最终还是会随着时代的进步而被迅速淘汰。因此,前文说软件应当以略微领先于时代的设计思路开发有其合理性。当然,我们也可以不关心他人的批评,尽可能缩短软件的生命周期,并积极抛弃过时的内容。具体采用哪种策略因人而异。
希望读者能够在阅读本书时始终记住这些理念。读过本书之后,如果大家觉得收获良多,我将深感荣幸与喜悦。
2012 年 新春
千叶滋
媒体评论
——日本编译器权威专家 中田育男