自制编程语言

自制编程语言

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

编辑推荐

适读人群 :适合对编译原理及语言处理器设计有兴趣的读者以及正在学习相关课程的大中专院校学生。

前百度高 级工程师、专业书《操作系统真相还原》的作者的又一力作

业界专家联名推荐

滴滴系统部技术高 级总监于晓声

阿里巴巴蚂蚁金服技术专家肖金亮

百度资 深运维工程师陈晓聪

360企业安全集团政企云事业部技术总监冯顾

ACFUN高 级运维总监陆景玉

Mobvista运维总监黄梦溪

手把手地教读者从零去实现一门语言,从原理到实践事无巨细

每一步都有实际的代码和详尽的原理说明,读者可以很轻松地掌握各个实现细节

实现脚本语言重要的垃圾回收(GC)、虚拟机(VM)和线程等黑技术都在本书一一呈现

内容简介

内 容 提 要

本书是一本专门介绍自制编程语言的图书,书中深入浅出地讲述了如何开发一门编程语言,以及运行这门编程语言的虚拟机。本书主要内容包括:脚本语言的功能、词法分析器、类、对象、原生方法、自上而下算符优先、语法分析、语义分析、虚拟机、内建类、垃圾回收、命令行及调试等技术。

本书适合程序员阅读,也适合对编程语言原理感兴趣的计算机从业人员学习。

作者简介

郑钢,网名大刚,毕业于北京大学,前百度运维开发工程师,《操作系统真象还原》作者。

爱父母,爱老婆,爱运动,爱钻研。

章节目录

第0章 一些可能令人迷惑的问题 1

0.0 成功的基石不是坚持,而是“不放弃” 1

0.1 你懂编程语言的“心”吗 2

0.2 编程语言的来历 2

0.3 语言一定要用更底层的语言来编写吗 2

0.4 编译型程序和脚本程序的异同 8

0.5 脚本语言的分类 10

0.6 为什么CPU要用数字而不是字符串作为指令 11

0.7 为什么脚本语言比编译型语言慢 11

0.8 既然脚本语言比较慢,为什么大家还要用 12

0.9 什么是中间代码 12

0.10 什么是编译器的前端、后端 13

0.11 词法分析、语法分析、语义分析和生成代码并不是串行执行 13

0.12 什么是符号表 14

0.13 什么是关系中的闭包 14

0.14 什么是程序中的闭包 15

0.15 什么是字母表 16

0.16 什么是语言 17

0.17 正规式就是正则表达式 17

0.18 什么是正规(表达)式和正规集 17

0.19 什么是有穷自动机 18

0.20 有穷自动机与词法分析的关系 19

0.21 词法分析用有穷自动机(有穷状态自动机)的弊端 19

0.22 什么是文法 20

0.23 BNF和EBNF,非终结符和终结符,开始符号及产生式 21

0.24 什么是句型、句子、短语 23

0.25 什么是语法分析 24

0.26 语法分析中的推导和归约为什么都要最“左” 25

0.27 什么是语义分析 26

0.28 什么是语法制导 27

0.29 词法分析器吃的是lex,挤出来的是token 27

0.30 什么是“遍” 28

0.31 文法为什么可以变换 28

0.32 为什么消除左递归和提取左因子 28

0.33 FIRST集、FOLLOW集、LL(1)文法 29

0.34 最右推导、最左归约、句柄 31

0.35 算符优先分析法 32

0.36 算符优先文法 33

0.37 非终结符中常常定义的因子和项是什么 33

0.38 什么是抽象语法树 33

0.39 编译器如何使用或实现文法中的产生式 34

0.40 程序计数器pc与ip的区别 35

第 1章 设计一种面向对象脚本语言 36

1.1 脚本语言的功能 36

1.2 关键字 37

1.3 脚本的执行方式 38

1.4 “纯手工”的开发环境 38

1.5 定义sparrow语言的文法 38

第2章 实现词法分析器 46

2.1 柔性数组 46

2.2 什么是字节序 47

2.3 一些基础的数据结构(本节源码stepByStep/c2/a) 48

2.4 定义虚拟机结构(本节源码stepByStep/c2/b) 56

2.5 实现源码读取(本节源码stepByStep/c2/c) 57

2.6 unicode与UTF-8 59

2.6.1 什么是unicode 59

2.6.2 什么是UTF-8 59

2.6.3 UTF-8编码规则 60

2.6.4 实现UTF-8编码、解码(本节源码stepByStep/c2/d) 61

2.7 实现词法分析器parser(本节源码stepByStep/c2/e) 66

2.7.1 lex和token 66

2.7.2 字符串和字符串内嵌表达式 66

2.7.3 单词识别流程 67

2.7.4 定义token和parser 68

2.7.5 解析关键字及获取字符 71

2.7.6 解析标识符和unicode码点 73

2.7.7 解析字符串、内嵌表达式、转义字符 75

2.7.8 跳过注释和空行 77

2.7.9 获取token 79

2.7.10 token匹配和初始化parser 84

2.8 构建主程序(本节源码stepByStep/c2/f) 85

2.9 编译、测试(本节源码stepByStep/c2/f) 88

2.9.1 一个简单的makefile 88

2.9.2 测试paser 92

第3章 类与对象 95

3.1 对象在C语言中的概貌 95

3.2 实现对象头(本节源码stepByStep/c3/a) 96

3.3 实现class定义(本节源码stepByStep/c3/a) 99

3.4 实现字符串对象(本节源码stepByStep/c3/a) 101

3.5 模块对象和实例对象(本节源码stepByStep/c3/a) 103

3.6 upvalue、openUpvalue和closedUpvalue 106

3.7 实现函数对象、闭包对象与调用框架(本节源码stepByStep/c3/a) 107

3.8 完善词法分析器之数字解析(本节源码stepByStep/c3/b) 111

3.9 完善词法分析器之字符串解析和获取token(本节源码stepByStep/c3/b) 114

3.10 最终版词法分析器的功能验证(本节源码stepByStep/c3/b) 116

3.11 实现list列表对象(本节源码stepByStep/c3/c) 118

3.12 range对象(本节源码stepByStep/c3/c) 121

3.13 迟到的class.c(本节源码stepByStep/c3/c) 122

3.14 map对象(本节源码stepByStep/c3/c) 124

3.14.1 哈希表 124

3.14.2 map对象头文件及entry 125

3.14.3 冲突探测链与伪删除 126

3.14.4 map对象的实现 128

3.15 线程对象(本节源码stepByStep/c3/c) 134

3.15.1 线程、协程浅述 134

3.15.2 运行时栈 137

3.15.3 用户线程的实现 138

第4章 原生方法及基础实现 142

4.1 解释器流程(本节源码stepBystep/c4/a) 142

4.2 符号表 144

4.2.1 模块的符号表 144

4.2.2 类方法的符号表 144

4.2.3 模块变量符号表 146

4.2.4 局部变量符号表 147

4.2.5 常量符号表 147

4.3 方法在运行时栈中的参数 147

4.4 定义模块变量(本节源码stepByStep/c4/b) 148

4.5 原生方法(本节源码stepByStep/c4/b) 154

4.5.1 定义裸类 154

4.5.2 定义返回值与方法绑定的宏 155

4.5.3 定义原生方法 157

4.5.4 符号表操作 159

4.5.5 定义类、绑定方法、绑定基类 160

4.6 元类及实现(本节源码stepByStep/c4/b) 161

4.6.1 meta-class类、class类、object类 161

4.6.2 创建元类,绑定类方法 163

4.7 加载模块(本节源码stepByStep/c4/c) 164

4.8 虚拟机简介 166

4.8.1 虚拟机分类及优缺点 166

4.8.2 为什么要采用虚拟机 168

4.8.3 虚拟机的简单优化 170

4.9 字节码 171

第5章 自上而下算符优先——TDOP 177

5.1 自上而下算符优先—TDOP 177

5.2 来自Douglas Crockford的教程 177

5.3 TDOP原理 194

5.3.1 一些概念 194

5.3.2 一个小例子 196

5.3.3 expression的思想 197

5.3.4 while(rbp

推荐序

很高兴能成为本书的首 批读者,也很高兴能为本书写推荐序。

刚拿到本书手稿时,从书名上我意识到这是对我胃口的书。果然,整书阅对以后,收获颇多。如今程序员的开发成本已经很低了,项目中有各种成熟的框架和库可供选择和使用,但还有人能静下心来研究编译器这么底层的技术,实属难得。本书犹如一把火炬,点燃了技术人内心对开发的热情。

依稀记得2010年年初在百度与郑刚初次见面的情景,那时他工作之余的时间基本都用在向各个技术专家请教、讨论各类技术问题上,他是我带过的人中最勤奋的人之一。时间荏苒,一分耕耘一分收获,看到他今天的成长,尤感欣慰。

本书讲述了一门脚本语言(sparrow)的开发过程,这是一本“步步为营”式的书籍,延续了他编写《操作系统真象还原》的风格,手把手地教读者从零实现一门语言,从原理到实践每一步都有实际的代码和详尽的原理说明,通过运行书中各小节中的代码,读者可以很轻松地掌握各个细节,因此本书的学习曲线并不陡峭,甚至很平坦。另外,值得欣喜的是,本书所编写的脚本语言并不是用Java、C等入门难度略大的语言实现的,而是用C语言,这是我们学习编程的基础语言。也就是说,本书并不需要专业的开发经验即可上手学习。另外,在实现过程中并未用到复杂的库函数或系统调用, 可以负责地说,本书已经将学习成本降到最低。

C语言是一种面向过程的语言,如何用一种面向过程的语言去实现一种面向对象的语言很有意思。另外,PHP和Perl语言虽然也实现了类,但它们其实是一种面向过程的语言,并不是纯粹的面向对象语言,而sparrow语言是一种纯粹的面向对象语言,它在设计之初就采用对象的方式来处理脚本语言中类的成员和方法,这仿佛让我们看到了面向对象编程语言的基因。众所周知,当今最流行的脚本语言应属Python,Python也是用C语言实现的,也许你很好奇Python的内部原理,但是想到它将近有 4 万行的源代码时,也许甚至不想看它的源程序了。那么研读本书中的sparrow语言会是一种更好的选择,其源码不足7100行,阅读过程轻松愉快,但可以学到系Python这种语言的实现原理。

对于脚本语言来说,两个重要方面就是垃圾回收和运行环境。垃圾回收就是我们平时所说的GC(Garbage Collection)。有了GC,程序员不需要手工释放所分配的对象,可以使精力专注于业务逻辑而不用担心内存泄漏问题。在sparrow语言中同样实现了GC,通过此部分代码你可以看到GC 的原理,以及哪些对象才能被回收。 运行时环境就是脚本语言中的虚拟机,即VM(如Java语言的JVM也是一种VM)。脚本语言是通过虚拟机才能运行的,如何把编译器生成的操作码转换为实际的代码行为,这里面的工作对大多数人来说很神秘。相信各位在源码中一探究竟之后会发现:GC和VM这两个神秘的黑盒子不过如此。另外,也许程序员最感兴趣的就是线程,关于线程在用户态下是如何实现的、线程如何实现调度,本书将告诉你答案。总之,但凡涉猎,开卷有益。

每个程序员都有实现属于自己编程语言的梦想,说其是梦想,原因是实现的难度很大......这种情况一直持续到本书的出现。本书讲的是纯粹的技术“干货”,符合郑刚一贯的写作风格,这是他静心写出来的东西,内容满满,很值得阅读。

于晓声

滴滴系统部技术高 级总监

自制编程语言是2018年由人民邮电出版社出版,作者郑钢。

得书感谢您对《自制编程语言》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

你可能喜欢
WebAssembly标准入门 电子书
适读人群 :本书适合从事高性能Web前端开发、跨语言Web应用开发的技术人员学习参考,也可以作为WebAssembly标准参考手册随时查阅。 作为一种新颖的网页前端技术,WebAssembly的发展日新月异。本书基于已受浏览器普遍支持的WebAssembly极小可用特征集,致力于通过简单易懂的方式,从使用方法到虚拟机设计,讲解WebAssembly的运行原理。极小可用特征集只是快速迭代的起点,SIMD、多线程等更多特性将逐渐被添加到WebAssembly标准中。 在WebAssembly 大潮来临之际,希望本书能为该技术在国内的推广贡献绵薄之力。 本书内容要点: WebAssembly 简要介绍; 在JavaScript 中使用WebAssembly 模块的方法; WebAssembly 汇编语言及二进制格式; 使用高级语言开发WebAssembly 模块; WebAssembly 指令参考。
用Go语言自制解释器 电子书
从零开始,用GO语言创造出另一门语言,体验从无到有实现类C语言的乐趣。
自然语言处理实战 电子书
实战自然语言处理及深度学习,涵盖基础知识与实际应用。
第一行代码  C语言(视频讲解版) 电子书
学习程序设计,初学者往往遇到这样的困境:语言规则可以倒背如流,但写出的代码总是编译通不过,即使编译通过了却也得不出想要的结果。怎么办?《行代码 C语言》可以给你提供帮助。 你不需要具备高深的数学和电子学知识,只需要训练自己以计算机能够理解的方式去表达自己的逻辑,也就是要具备“计算思维”,寻找到解决问题的方法,然后用编程语言去指挥计算机执行即可。因此,本书与常规的C语言书不同,除了C语言本身的语法规则外,本书更关注的是培养初学者具有程序设计的思想,掌握程序设计的方法。 另外,计蒜客在线教育团队,为本书的读者提供了伴随式的在线编程平台支持,读者可以将图书和线上编程结合起来学习。 提供扫码看视频服务,全书94个微视频,总时长超过1000分钟。 提供辅助教学资源包,包括实验、试卷及答案、教学大纲、PPT等。
Go语言程序设计项目化教程(微课版) 电子书
本书切合现代职业教育计算机类专业教学实际,围绕电商平台开发案例予以深入浅出的项目化设计,夯实读者Go语言基础语法知识点的同时,强化其应用Go语言解决实际工程应用问题的能力,为“零基础”的读者提供全面的Go语言学习入门指导和综合应用实践。本书覆盖Go语言的核心语法和特色功能应用,主要内容包括熟悉Go语言开发环境、学习Go语言基础语法、掌握Go语言函数应用、理解Go语言面向对象、体会Go语言高级特性、