自制编程语言

出版社:人民邮电出版社
出版日期:2013-11
ISBN:9787115333209
作者:[日] 前桥和弥
页数:396页

内容概要

作者简介:
前桥和弥(Maebasi Kazuya)
1969年出生,著有《征服C指针》、《彻底掌握C语言》、《Java之谜和陷阱》等。其一针见血的“毒舌”文风和对编程语言深刻的见地受到广大读者的欢迎。
作者主页:http://kmaebashi.com/。
译者简介:
刘卓
2004年开始从事对日软件开发工作,其间还从事技术及软件工程相关培训工作。自2011年开始从事电力行业产品研发。持续关注企业级应用架构和Web客户端技术。
徐谦
6年技术开发及项目经验,曾以技术工程师身份赴日本工作两年,后归国联合创办互联网公司,现居上海继续创业中。主要从事PHP方向的Web开发。热爱开源,曾向Zend Framework等知名PHP开源项目贡献代码,并于Github自主研发运维EvaThumber等开源项目获得国内社区认可。乐于分享技术心得,个人技术博客avnpc.com在国内PHP圈小有影响。
吴雅明
13年编程经验。其中7年专注于研发基于Java EE和.NET的开发框架以及基于UML 2.0模型的代码生成工具。目前正带领团队开发云计算PaaS平台及云计算自动化配置部署的系统。译著有《征服C指针》等。

书籍目录

目 录
第1章  引子  001
1.1 为什么要制作编程语言  002
1.2 自制编程语言并不是很难  003
1.3 本书的构成与面向读者  004
1.4 用什么语言来制作  006
1.5 要制作怎样的语言  007
1.5.1 要设计怎样的语法  007
1.5.2 要设计怎样的运行方式  009
补充知识  “用户”指的是谁?  012
补充知识  解释器并不会进行翻译  012
1.6 环境搭建  012
1.6.1 搭建开发环境  012
补充知识 关于bison与flex的安装  014
1.6.2 本书涉及的源代码以及编译器  015
第2章  试做一个计算器  017
2.1 yacc/lex是什么  018
补充知识  词法分析器与解析器是各自独立的  019
2.2 试做一个计算器  020
2.2.1 lex  021
2.2.2 简单正则表达式讲座  024
2.2.3 yacc  026
2.2.4 生成执行文件  033
2.2.5 理解冲突所代表的含义  034
2.2.6 错误处理  040
2.3 不借助工具编写计算器  041
2.3.1 自制词法分析器  041
补充知识  保留字(关键字)  046
补充知识 避免重复包含  047
2.3.2 自制语法分析器  048
补充知识 预读记号的处理  053
2.4 少许理论知识——LL(1)与LALR(1)  054
补充知识 Pascal/C 中的语法处理诀窍  056
2.5 习题:扩展计算器  056
2.5.1 让计算器支持括号  056
2.5.2 让计算器支持负数  058
第3章  制作无类型语言crowbar  061
3.1 制作crowbar ver.0.1语言的基础部分  062
3.1.1 crowbar是什么  062
3.1.2 程序的结构  063
3.1.3 数据类型  064
3.1.4 变量  064
补充知识 初次赋值兼做变量声明的理由  066
补充说明 各种语言的全局变量处理  067
3.1.5 语句与结构控制  067
补充知识 elif、elsif、elseif的选择  068
3.1.6 语句与运算符  069
3.1.7 内置函数  069
3.1.8 让crowbar支持C 语言调用  070
3.1.9 从crowbar中调用C 语言(内置函数的编写)  071
3.2 预先准备  071
3.2.1 模块与命名规则  072
3.2.2 内存管理模块MEM  073
补充知识 valgrind  075
补充知识 富翁式编程  075
补充知识 符号表与扣留操作  076
3.2.3 调试模块DBG  076
3.3 crowbar ver.0.1的实现  077
3.3.1 crowbar的解释器——CRB_Interpreter  077
补充知识 不完全类型  080
3.3.2 词法分析——crowbar.l  081
补充知识 静态变量的许可范围  084
3.3.3 分析树的构建——crowbar.y 与create.c  085
3.3.4 常量折叠  089
3.3.5 错误信息  089
补充知识 关于crowbar中使用的枚举型定义  091
3.3.6 运行——execute.c  092
3.3.7 表达式评估——eval.c  096
3.3.8 值——CRB_Value  104
3.3.9 原生指针型  105
3.3.10 变量  106
3.3.11 字符串与垃圾回收机制——string_pool.c  108
3.3.12 编译与运行  110
第4章  数组和mark-sweep垃圾回收器  113
4.1 crowbar ver.0.2  114
4.1.1 crowbar的数组  114
4.1.2 访问数组元素  115
4.1.3 数组是一种引用类型  116
补充知识  “数组的数组”和多维数组  116
4.1.4 为数组添加元素  118
4.1.5 增加( 模拟) 函数调用功能  118
4.1.6 其他细节  118
4.2 制作mark-sweep GC  119
4.2.1 引用数据类型的结构  119
4.2.2 mark-sweep GC  121
补充知识 引用和immutable  123
4.2.3 crowbar栈  124
4.2.4 其他根  127
4.2.5 原生函数的形式参数  128
4.3 实现GC 本身  129
4.3.1 对象的管理方法  129
4.3.2 GC 何时启动  129
4.3.3 sweep阶段  132
补充知识 GC 现存的问题  133
补充知识 Coping GC  134
4.4 其他修改  136
4.4.1 修改语法  136
4.4.2 函数的模拟  137
4.4.3 左值的处理  139
4.4.4 创建数组和原生函数的书写方法  142
4.4.5 原生指针类型的修改  144
第5章  中文支持和Unicode  147
5.1 中文支持策略和基础知识  148
5.1.1 现存问题  148
5.1.2 宽字符(双字节)串和多字节字符串  149
补充知识 wchar_t 肯定能表示1 个字符吗?  150
5.1.3 多字节字符/ 宽字符之间的转换函数群  150
5.2 Unicode  153
5.2.1 Unicode的历史  153
5.2.2 Unicode的编码方式  154
补充知识 Unicode可以固定(字节)长度吗?  156
5.3 crowbar book_ver.0.3的实现  156
5.3.1 要实现到什么程度?  156
5.3.2 发起转换的时机  157
5.3.3 关于区域设置  158
5.3.4 解决0x5C问题  158
补充知识 失败的 #ifdef  160
5.3.5 应该是什么样子  160
补充知识 还可以是别的样子——Code Set Independent  161
第6章  制作静态类型的语言Diksam  163
6.1 制作Diksam Ver 0.1语言的基本部分  164
6.1.1 Diksam的运行状态  164
6.1.2 什么是Diksam  165
6.1.3 程序结构  165
6.1.4 数据类型  166
6.1.5 变量  166
6.1.6 语句和流程控制  167
6.1.7 表达式  167
6.1.8 内建函数  168
6.1.9 其他  168
6.2 什么是静态的/ 执行字节码的语言  169
6.2.1 静态类型的语言  169
6.2.2 什么是字节码  169
6.2.3 将表达式转换为字节码  170
6.2.4 将控制结构转换为字节码  173
6.2.5 函数的实现  173
6.3 Diksam ver.0.1的实现——编译篇  175
6.3.1 目录结构  175
6.3.2 编译的概要  176
6.3.3 构建分析树(create.c)  176
6.3.4 修正分析树(fix_tree.c)  179
6.3.5 Diksam的运行形式——DVM_Executable  185
6.3.6 常量池  186
补充知识 YARV 的情况  187
6.3.7 全局变量  188
6.3.8 函数  189
6.3.9 顶层结构的字节码  189
6.3.10 行号对应表  190
6.3.11 栈的需要量  190
6.3.12 生成字节码(generate.c)  191
6.3.13 生成实际的编码  193
6.4 Diksam虚拟机  197
6.4.1 加载/ 链接DVM_Executable到DVM  200
6.4.2 执行——巨大的switch case  202
6.4.3 函数调用  204
第7章  为Diksam引入数组  207
7.1 Diksam中数组的设计  208
7.1.1 声明数组类型的变量  208
7.1.2 数组常量  209
补充知识 D 语言的数组  210
7.2 修改编译器  210
7.2.1 数组的语法规则  210
7.2.2 TypeSpecifier结构体  212
7.3 修改DVM  213
7.3.1 增加指令  213
补充知识 创建Java 的数组常量  215
补充知识 C 语言中数组的初始化  217
7.3.2 对象  217
补充知识 ArrayStoreException  218
7.3.3 增加null  219
7.3.4 哎! 还缺点什么吧?  219
第8章  将类引入Diksam  221
8.1 分割源文件  222
8.1.1 包和分割源代码  222
补充知识 #include、文件名、行号  225
8.1.2 DVM_ExecutableList  225
8.1.3 ExecutableEntry  226
8.1.4 分开编译源代码  227
8.1.5 加载和再链接  230
补充知识 动态加载时的编译器  233
8.2 设计Diksam中的类  233
8.2.1 超简单的面向对象入门  233
8.2.2 类的定义和实例创建  237
8.2.3 继承  239
8.2.4 关于接口  241
8.2.5 编译与接口  242
8.2.6 Diksam怎么会设计成这样?  243
8.2.7 数组和字符串的方法  245
8.2.8 检查类的类型  246
8.2.9 向下转型  246
8.3 关于类的实现——继承和多态  247
8.3.1 字段的内存布局  247
8.3.2 多态——以单继承为前提  249
8.3.3 多继承——C++  250
8.3.4 Diksam的多继承  252
补充知识 无类型语言中的继承  254
8.3.5 重写的条件  254
8.4 关于类的实现  256
8.4.1 语法规则  256
8.4.2 编译时的数据结构  258
8.4.3 DVM_Executable中的数据结构  260
8.4.4 与类有关的指令  262
补充知识 方法调用、括号和方法指针  263
8.4.5 方法调用  264
8.4.6 super  266
8.4.7 类的链接  266
8.4.8 实现数组和字符串的方法  267
8.4.9 类型检查和向下转型  267
补充知识 对象终结器(finalizer)和析构函数(destructor)  268
第9章  应用篇  271
9.1 为crowbar引入对象和闭包  272
9.1.1 crowbar的对象  272
9.1.2 对象实现  273
9.1.3 闭包  274
9.1.4 方法  276
9.1.5 闭包的实现  278
9.1.6 试着跟踪程序实际执行时的轨迹  281
9.1.7 闭包的语法规则  284
9.1.8 普通函数  284
9.1.9 模拟方法(修改版)  285
9.1.10 基于原型的面向对象  286
9.2 异常处理机制  286
9.2.1 为crowbar引入异常  286
9.2.2 setjmp()/longjmp()  289
补充知识 Java 和C# 异常处理的不同  293
9.2.3 为Diksam引入异常  295
补充知识 catch 的编写方法  296
9.2.4 异常的数据结构  297
9.2.5 异常处理时生成的字节码299
9.2.6 受查异常  301
补充知识 受查异常的是与非 303
补充知识 异常处理本身的是与非  304
9.3 构建脚本  305
9.3.1 基本思路  306
9.3.2 YY_INPUT  307
9.3.3 Diksam的构建脚本  308
9.3.4 三次加载/ 链接  308
9.4 为crowbar引入鬼车  309
9.4.1 关于“鬼车”  309
9.4.2 正则表达式常量  310
9.4.3 正则表达式的相关函数  311
9.5 其他  312
9.5.1 foreach 和迭代器(crowbar)  312
9.5.2 switch case(Diksam)  314
9.5.3 enum(Diksam)  315
9.5.4 delegate(Diksam)  316
9.5.5 final、const(Diksam)  319
附录A  crowbar语言的设计  322
附录B  Diksam语言的设计  336
附录C  Diksam Virtual Machine 指令集  359
编程语言实用化指南——写在最后  369
参考文献  375

作者简介

★ 只需编程基础
★ 从零开始自制编程语言
★ 支持面向对象、异常处理等高级机制
本书手把手地教读者用C语言制作两种编程语言:crowbar与Diksam。crowbar是运行分析树的无类型语言,Diksam是运行字节码的静态类型语言。这两种语言都具备四则运算、变量、条件分支、循环、函数定义、垃圾回收等功能,最终版则可以支持面向对象、异常处理等高级机制。所有源代码都提供下载,读者可以一边对照书中的说明一边调试源代码。这个过程对理解程序的运行机制十分有帮助。
本书适合有一定基础的程序员和编程语言爱好者阅读。


 自制编程语言下载 更多精彩书评



发布书评

 
 


精彩书评 (总计2条)

  •     (原帖发在ItEye的HLLVM群组,地址:http://hllvm.group.iteye.com/group/topic/39194)一点历史 几年前日本流行过一段时间「俺言語」「オレオレ言語」「OreScript」(自制语言)潮。Ruby作为编程语言的成功普及对这个潮流有很大推动作用。本书便是在此背景下诞生的。 作者之前就对C、Java等语言挺熟悉的,写过几本书,也一直有意愿写本实现编程语言的书。后来看到某本不太能行的书(http://book.douban.com/subject/25794665/)之后大概更加觉得应该自己出马了吧 XD虽然这本书不是我写的,也不是我翻译的,但我对它还是颇有感情。某种意义上说,我对引进这本书也有一点责任感。大概是2007年底或者2008年初,我应该是在看Lightweight Language Spirit 2007(http://ll.jus.or.jp/2007/)的资料时留意到原本作者还在自己的主页(http://kmaebashi.com/programmer/devlang/)和Hatena(http://d.hatena.ne.jp/kmaebashi/)上Web连载自制编程语言系列的文章。当时我就有跟着读,觉得作者能一步步把语言功能都实现出来挺好的。 光读文章不动手练练也没用,所以我也有把这系列配套的代码编译出来把玩。当然,这系列两种语言的实现都只是入门级,边把玩边能找出很多可以改进的地方,可以在上面做各种实验做优化或添加功能,也挺好玩的。 后来作者把整个系列整理成书,我也就赶紧买了一本以表支持。 然后断断续续有试着把这本书推荐给国内的出版社看看有没有机会引进,终于图灵接了下来,我也觉得挺欣慰的。虽然最终结果上来说我会期待能翻译得更好一些⋯呃呵呵。 本书定位 本书明确定位为一本入门书,面向的读者群是没有实现过编程语言、对编译原理不熟悉,但又对此感兴趣、想学习这方面知识的人。 在此定位之上,我相当推荐本书作为入门的第一本书,学习实现编程语言相关的基本知识点。同时自己动手使用配套代码做实验,观察和感受实际程序的运行,并尝试自己动手修改和增强其实现代码。 光读这本书还只是挠了挠痒痒,读了觉得还没吃饱那就对了,上道了 后续还想进一步学习的话,可以再读些经典书籍,例如:在编译原理方面可以读虎书和龙书;特定于语法分析方面可以读Parsing Techniques;在GC方面可以读GC手册,等等。 既然已有那么多经典书,为什么我还要推荐从这本开始,而不是直接去读那些经典书呢? 我一直觉得在入门阶段能够有实际可运行的、小规模简单的实现作为参考,对学习有很大帮助。本书正好提供了充分的范例代码来让读者把玩。 相比之下, * 虎书还好,言简意赅但一路有范例代码,但它的C版代码写得像Java一样、Java版代码写得像C一样,ML版虽然很赞又可能有很多人看不懂⋯ * 龙书只有第二章对应有编译器前段的范例代码,后面大部分内容都比较抽象,用这本书来入门恐怕会觉得像撞墙一样; * GC手册直接啥范例代码都没有,只有理论⋯ 而从知识面来看,本书也比较出色。本书循序渐进、由浅到深地讲解了丰富的基础知识,不但覆盖了常见的编译原理入门,更难能可贵的覆盖了许多运行时支持系统(runtime system)的知识,特别是对象、虚方法分派、闭包、异常、GC等。对这些知识点好奇的读者至少能通过本书了解到相应的基础概念以及入门级实现是怎样的。 与此相比,其它一些同类入门书(参考这个豆列 http://book.douban.com/doulist/2529382/)通常只覆盖到编译原理入门,外加只支持数字、字符串等原始类型的解释器,而没有覆盖前面提到的运行时支持系统的知识点。 从语言设计看,本书的两个范例语言,crowbar可以看作是简化的JavaScript(没有实现原型继承), 而Diksam可以看作是基本版的Java,在入门范例语言中已经算不那么玩具的了。两者都与热门语言沾边,正好迎合了一些同学想窥探热门语言的实现、但苦于没有足够知识基础的学习需求。 从实际实现看,crowbar与Diksam都确实相当的入门级:结构简单,功能基本正确(配套代码有少量问题),性能嘛⋯就呵呵了。 但还别说,现实中许多大名鼎鼎的编程语言的实现也没好到哪儿去。早期JavaScript引擎中,像JavaScriptCore的早期版及其前身的KJS都使用树遍历解释器,跟crowbar的相似。这些引擎中使用最弱的形态的discriminated union来实现值表现形式(value representation)也跟crowbar的做法相似。而某些早期JVM的内部实现也跟Diksam的许多部分颇为相似。有了本书的基础,再去了解实际生活中可以见到的基于解释器的编程语言实现就会轻松许多。 稍有基础的读者读了可能会觉得不过瘾,因为想进阶阅读的知识在这本书里很难找到:更完善的语法分析器、高性能的解释器、高性能的对象系统和GC、JIT编译器等等,所以可能会对本书有所不满。但这本书本来就不是进阶读物而是入门读物,如果有同学仔细阅读完还觉得不过瘾的话,那您的水平应该已经超过这本书的目标读者群,该去读点重量级一点的书了。 P.S. 作为JVM从业者,我也不隐瞒我推荐这本书有私心:有这么一本书介绍了各种知识点的基本概念和简易实现,我就不用总是费那么多事去讲解;而没比较就没有进步,知道简易实现是怎样的之后会更有动力追求高效的实现,这样我就可以有更多同行了 >_<P.S.S. 这本书的配套代码实现有些微妙的bug,如果读完整本书都没觉得有bug的话你可能就中招了⋯欢迎找茬~
  •     同事买了一本,我借过来翻了几天看完了。这本书的内容正如书名和我的标题,就是作者自己设计与实现语言。本书包含的两门语言都是玩具式的。跟实现一门实用的编程语言(类似于C或者Perl那种)之间还是有不小的差距。而且两门语言的实现都是解释执行的,只不过第一门是一个赤果果的解释器,第二门加了一个虚拟机。但是请注意所有的一切:从语言到虚拟机都是玩具式的。实现的代码说实话质量一般。所以只适合完全没有基础的初学者。我突然想到一本类似的书 - 虚拟机的设计与实现http://book.douban.com/subject/1231974/ 虚拟机这本更差,作者以作者的认识很浅显地实现了一堆宏大的主题,然后告诉你:"喏,这就是虚拟机还有汇编器和连接器的呦,你看这些东西是很简单的嘛。"下面的所有讨论实用的编程语言就是指C语言,而且不讨论语言的优劣只是讨论实现相关的一些情况。对于编译器的编写,个人认为为这种自己设计的无类型而且还是解释执行的语言写实现是最简单的。静态编译的语言要复杂一些,比如编写一个C的编译器会涉及到汇编代码的生成,需要纠结类型的检查和类型转换,需要在语法分析阶段就要考虑根据变量的linkage和storage的差别来决定存储在什么地方需要使用什么样子的伪指令,尤其是C语言这种declaration语法复杂到坑爹地步的语言,parse的编写着实是头等大事(可能你会提到可以使用flex/bison,确实parse的编写会简单一些,但是你不觉得写一个很有挑战的parse也是一件很有趣的事情吗? :)。实际的语言一般会有一个语言设计者编写的language specification(但是我知道Matz的Ruby是没有的,来自二次元世界的东西果然是很特别的),这样你写编译器需要读懂specification(做编译器的前端)然后就是需要对目标机器非常熟悉(后端的代码选择和指令调度),还有同样需要熟悉的就是assembler的伪指令和目标机器的ABI(除非自己实现标准库),linker和OS熟悉最好。我写了怎么多你看到了吗?实现一门实用的语言真的需要知道很多东西,因为你要跟一堆现有的东西来接口。对于这种偏编译器实践的书籍我看过一些,这些书几乎都是为了教学而编写的,真正接近工业级别的只有A Retargetable C Compiler - http://book.douban.com/subject/1610344/ 这本书描述的编译器是lcc,实现代码非常优秀,个人认为是唯一能媲美UNIX V6系代码的,简洁清晰,当你跟我一样天天的工作就是面对一坨14W行代码的而且代码风格极其鬼畜的C编译器做优化的时候,当你再看看lcc你会感慨世界上居然会有这么清新的东西。但是缺点是lcc没有全局优化,对于工业用途的编译器来说是不可接受的,但是当你能完全读懂lcc我相信根据一些专门讲解优化的书籍或者paper编写优化算法绝对是可以的。另外个人认为最好的用于教学的两本书:一本是Compiler Construction - http://book.douban.com/subject/3152162/ 全书的描述逻辑异常清晰,简明扼要。个人认为是偏于教学这种书里最优秀的。很可惜国内没有引进。另外一本是Compiler design in C - http://book.douban.com/subject/1453167/ 这本书真是太TM厚了,而且这本书居然是实现了一堆的工具程序,说实话不推荐。最后,这种偏实践的书籍如果只选择一本果断是A Retargetable C Compiler,如果再加一本是Compiler Construction,如果你实在没有基础那么看看本书-自制编程语言也是一个不错的选择。have fun with compiler implementation, enjoy..

精彩短评 (总计23条)

  •     :无
  •     前边还不错,越往后越抽象,说语法的篇幅大于实现,整体还是值得阅读
  •     对语言背后的思考有了更多的了解,打算配上代码在读一遍。翻译偶尔有些生硬。
  •     有趣的技术书。书里还有翻页小动画。
  •     感谢@soasme 借书, 这方面的书看过不少, 但此本是少见的从无到有去玩的书, 看Lua源码这种大家都能看懂, 但背后怎么一步一步架构起来的却更有意义一些.
  •     已暂停,只读了一章,觉得受益匪浅。编译器原理,待我再积累一段时间,重新再战。
  •     入门学习,希望能开发自己的语言
  •     毕设是编译器,这本书帮了很大忙
  •     从实践角度入手,让人加深了对语言的理解,好书!
  •     显然 这本书虽然初级 但入门来说非常不错
  •     玩具式语言,代码质量一般.如果是初学者会比较合适..
  •     还凑合的入门书
  •     有些部分真的翻译得莫名其妙。好歹把一些专业名词翻对吧= =
  •     还不错,科普一下,龙书真心啃不动
  •     主要介绍如何自己制作编程语言。文中介绍两种语言,一种是动态无类型,一种是静态的。觉得本书作者在陈述自己设计方面欠缺功底,看后不容易理解。而且设计的两个语言太过大,不适合初学者学习。
  •     再看看
  •     一般,主要是熟悉一下里面介绍的几个工具,对于编译器思想介绍的不深。可以先看看这本书,找找感官上的认识,然后还是得看龙书
  •     好多东西都讲不太清楚, 需要百度的次数比较多
  •     更加深入的理解C
  •     选题和写法很有吸引力(让人看不懂放下,然后又拿起看),但是缺少一章解析全书思路的概论,最后只好虎头蛇尾般读完……
  •     挺好的,让人对一些程序概念的实现有了一些了解
  •     gc unicode closure 等等 可以一阅
  •     - -不太喜欢这书,yacc什么的感觉用着好恶心
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024