作者简介:
前桥和弥(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 lex021
2.2.2 简单正则表达式讲座024
2.2.3 yacc026
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章 制作无类型语言crowbar061
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 内存管理模块MEM073
补充知识 valgrind075
补充知识 富翁式编程075
补充知识 符号表与扣留操作076
3.2.3 调试模块DBG076
3.3 crowbar ver.0.1的实现077
3.3.1 crowbar的解释器——CRB_Interpreter077
补充知识 不完全类型080
3.3.2 词法分析——crowbar.l081
补充知识 静态变量的许可范围084
3.3.3 分析树的构建——crowbar.y 与create.c085
3.3.4 常量折叠089
3.3.5 错误信息089
补充知识 关于crowbar中使用的枚举型定义091
3.3.6 运行——execute.c092
3.3.7 表达式评估——eval.c096
3.3.8 值——CRB_Value104
3.3.9 原生指针型105
3.3.10 变量106
3.3.11 字符串与垃圾回收机制——string_pool.c108
3.3.12 编译与运行110
第4章 数组和mark-sweep垃圾回收器113
4.1 crowbar ver.0.2114
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 GC119
4.2.1 引用数据类型的结构119
4.2.2 mark-sweep GC121
补充知识 引用和immutable123
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 GC134
4.4 其他修改136
4.4.1 修改语法136
4.4.2 函数的模拟137
4.4.3 左值的处理139
4.4.4 创建数组和原生函数的书写方法142
4.4.5 原生指针类型的修改144
第5章 中文支持和Unicode147
5.1 中文支持策略和基础知识148
5.1.1 现存问题148
5.1.2 宽字符(双字节)串和多字节字符串149
补充知识 wchar_t 肯定能表示1 个字符吗?150
5.1.3 多字节字符/ 宽字符之间的转换函数群150
5.2 Unicode153
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
补充知识 失败的 #ifdef160
5.3.5 应该是什么样子160
补充知识 还可以是别的样子——Code Set Independent161
第6章 制作静态类型的语言Diksam163
6.1 制作Diksam Ver 0.1语言的基本部分164
6.1.1 Diksam的运行状态164
6.1.2 什么是Diksam165
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_Executable185
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到DVM200
6.4.2 执行——巨大的switch case202
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 修改DVM213
7.3.1 增加指令213
补充知识 创建Java 的数组常量215
补充知识 C 语言中数组的初始化217
7.3.2 对象217
补充知识 ArrayStoreException218
7.3.3 增加null219
7.3.4 哎! 还缺点什么吧?219
第8章 将类引入Diksam221
8.1 分割源文件222
8.1.1 包和分割源代码222
补充知识 #include、文件名、行号225
8.1.2 DVM_ExecutableList225
8.1.3 ExecutableEntry226
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 super266
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_INPUT307
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
计算机组成原理 本书特色 王诚、董长洪、宋佳兴编著的《计算机组成原理》充分考虑全国硕士研究生入学统一考试大纲的有关规定,核心内容围绕如何理解和构建一台简单的计算...
网络操作系统Linux管理与配置 本书特色 陈志涛主编的《网络操作系统Linux管理与配置》是21世纪高职高专IT类专业系列教材之一。教材内容贯彻“工学结合”指...
《CSS基础教程》是优秀的CSS入门书,重点讲述了如何使用CSS实现基于Web标准的网站开发,实现网站内容和表现相分离。《CSS基础教程
在这个信息技术无所不在的时代,编程能力正在变得越来越重要。C++以高性能、易移植而著称,而且同时支持过程式、面向对象和泛型编
《礼义之邦》内容简介:礼仪是礼的形式,礼义则是礼的本质。所有礼仪活动或者礼仪程序的背后,都蕴含有特定的道德认同、价值导向、
《儿童时间管理效能手册》内容简介:为什么孩子总是发脾气?为什么孩子什么话都不愿跟家长说?为什么孩子对自己的事情负不起责任来
《智慧工厂技术与应用》内容简介:智慧工厂是现代工厂信息化发展的新阶段,是在数字化工厂的基础上,利用物联网技术和设备监控技术
Nowinitsfifthedition,thebestsellingbookonUMTShasbeenupdatedtocover3GPPWCDMAandHi...
《有一种境界叫苏东坡·3》内容简介:《有一种境界叫苏东坡·3》主要讲述了中、老年时期的苏东坡在政治、文学上的成就及其情感生活
本书通过实例的方式介绍了Macromedia公司的DreamweaverMX2004的使用方法和技巧。全书由14章组成,第1章和第2章介绍了软件的应用领
本书是原创Java技术图书领域继《深入理解Java虚拟机》后的又一实力之作,也是全球首本基于最新OSGiR5.0规范的著作。理论方面,既
《唐人小说与民俗意象研究》内容简介:《唐人小说与民俗意象研究》将小说与民俗相结合,摭取唐人小说中呈现出来的民俗意象,并对这
PacoHope,是Cigital公司的一名技术经理,《MasteringFreeBsDand0penBsDsecurity》(由O’Reilly出版)的合著者...
客厅.网络.咖啡屋--与名流聊天 内容简介 现在的中国人特别喜欢追逐名流,名流出的书不论好坏,总是能畅销,卖个几十万甚至上百万册也不稀奇。傍着名流出书也是发财的...
《哈佛凌晨四点半大全集》内容简介:哈佛大学的老师经常给学生这样的告诫:如果你想在进入社会后,在任何时候、任何场合下都能得心
《CSSWeb设计高级教程(第2版)》注重Web开发的实践,每章以现实中的Web站点为例,提供了很多容易理解的CSS技巧和技术,例如,如何
《用图表说话》内容简介:数据视觉化,一种新的商业语言,一项职场人士必备的技能。优秀的可视化图表在传达信息方面比任何其他形式
TheinternationalsuccessstoryofAntwerpfashionTheSix(WalterVanBeirendonck,AnnDemeu...
《TKT剑桥英语教学能力认证考试全真模拟试题(2020年版)》内容简介:本书是TKT剑桥英语教学能力认证考试的专用辅导用书,从考试内
《邓小平讲话实录:演讲卷》内容简介:《邓小平讲话实录》记述了邓小平从革命战争年代到社会主义建设中发挥的重要作用,他的历次讲