《自制编程语言:基于C语言》是由人民邮电出版社出版的一本关于C语言编程方面的书籍,作者是郑钢,主要介绍了关于编程语言、C语言方面的知识内容,目前在C语言编程类书籍综合评分为:8.3分。
书籍介绍
前百度网高 级技术工程师、专业书《电脑操作系统实情复原》的创作者的另一大作 业内权威专家联名鞋强烈推荐 滴滴打车系统部技术性高 级主管于晓声 阿里巴巴网蚂蚁金服技术性权威专家肖金亮 百度网资 深运维工程师陈晓聪 360企业安全集团公司政企云业务部技术主管冯顾 ACFUN高 级运维管理主管陆景玉 Mobvista运维管理主管黄梦溪 傻瓜式地教用户从零开始去保持一种語言,从基本原理到实践活动事无大小 每步常有具体的编码和详细的基本原理表明,用户能够很轻轻松松地把握每个保持关键点 保持开发语言关键的垃圾分类回收(GC)、虚拟机(VM)和进程等黑技术性都会这书逐一展现
内 容 提 要 这书是1本专业详细介绍自做计算机语言的书籍,书中从入门到精通地叙述了怎样开发设计一种计算机语言,及其运作这门计算机语言的虚拟机。这书主题思想包含:开发语言的作用、词法分析器、类、另一半、原生态方式、由上而下算符优先选择、语法分析、文本挖掘、虚拟机、内建类、垃圾分类回收、命令行及调节等技术性。 这书合适程序猿阅读文章,也合适对计算机语言基本原理很感兴趣的电子计算机从业者学习培训。
目录
- 第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 < token.lbp)的意义 200
- 5.3.5 进入expression时当前token的类别 201
- 5.3.6 TDOP总结 202
- 第6章 实现语法分析与语义分析 204
- 6.1 定义指令(本节源码stepByStep/c6/a) 204
- 6.2 核心脚本(本节源码stepByStep/c6/a) 206
- 6.3 写入指令(本节源码stepByStep/c6/a) 212
- 6.4 编译模块(本节源码stepByStep/c6/a) 216
- 6.5 语义分析的本质 218
- 6.6 注册编译函数(本节源码stepByStep/c6/b) 218
- 6.7 赋值运算的条件 221
- 6.8 实现expression及其周边(本节源码stepByStep/c6/c) 223
- 6.9 局部变量作用域管理 228
- 6.10 变量声明、中缀、前缀及混合运算符方法签名(本节源码stepByStep/c6/d) 229
- 6.11 解析标识符(本节源码stepByStep/c6/e) 233
- 6.11.1 处理参数列表及相关 233
- 6.11.2 实现运算符和标识符的签名函数 235
- 6.11.3 upvalue的查找与添加 239
- 6.11.4 变量的加载与存储 242
- 6.11.5 编译代码块及结束编译单元 243
- 6.11.6 各种方法调用 246
- 6.11.7 标识符的编译 249
- 6.12 编译内嵌表达式(本节源码stepByStep/c6/f) 256
- 6.13 编译bool及null(本节源码stepByStep/c6/g) 258
- 6.14 this、继承、基类(本节源码stepByStep/c6/h) 259
- 6.15 编译小括号、中括号及list列表字面量(本节源码stepByStep/c6/i) 260
- 6.16 编译方法调用和map字面量(本节源码stepByStep/c6/j) 263
- 6.17 编译数学运算符(本节源码stepByStep/c6/k) 266
- 6.18 编译变量定义(本节源码stepByStep/c6/l) 270
- 6.19 编译语句 274
- 6.19.1 编译if语句(本节源码stepByStep/c6/m) 274
- 6.19.2 编译while语句(本节源码stepByStep/c6/n) 275
- 6.19.3 编译return、break和continue语句(本节源码stepByStep/c6/o) 280
- 6.19.4 编译for循环语句(本节源码stepByStep/c6/p) 284
- 6.19.5 编译代码块及单一语句(本节源码stepByStep/c6/q) 288
- 6.20 编译类定义(本节源码stepByStep/c6/r) 289
- 6.20.1 方法的声明与定义 289
- 6.20.2 构造函数与创建对象 291
- 6.20.3 编译方法 293
- 6.20.4 编译类定义 296
- 6.21 编译函数定义(本节源码stepByStep/c6/s) 298
- 6.22 编译模块导入(本节源码stepByStep/c6/t) 300
- 第7章 虚拟机 306
- 7.1 创建类与堆栈框架(本节源码stepByStep/c7/a) 306
- 7.2 upvalue的创建与关闭(本节源码stepByStep/c7/b) 309
- 7.3 修正操作数(本节源码stepByStep/c7/c) 312
- 7.4 执行指令(本节源码stepByStep/c7/d) 314
- 7.4.1 一些基础工作 314
- 7.4.2 解码、译码、执行(本节源码stepByStep/c7/d) 316
- 7.5 运行虚拟机(本节源码stepByStep/c7/e) 334
- 第8章 内建类及其方法 337
- 8.1 Bool类及其方法(本节源码stepByStep/c8/a) 337
- 8.2 线程类及其方法(本节源码stepByStep/c8/b) 338
- 8.3 函数类及其方法和函数调用重载(本节源码stepByStep/c8/c) 345
- 8.4 Null类及其方法(本节源码stepByStep/c8/d) 347
- 8.5 Num类及其方法(本节源码stepByStep/c8/e) 348
- 8.6 String类及其方法(本节源码stepByStep/c8/f) 355
- 8.7 List类及其方法(本节源码stepByStep/c8/g) 369
- 8.8 Map类及其方法(本节源码stepByStep/c8/h) 374
- 8.9 range类及其方法(本节源码stepByStep/c8/i) 380
- 8.10 System类及其方法(本节源码stepByStep/c8/j) 383
- 8.11 收尾与测试(本节源码stepByStep/c8/k) 388
- 第9章 垃圾回收 393
- 9.1 垃圾回收浅述 393
- 9.2 理论基础 395
- 9.3 标记—清扫回收算法 396
- 9.4 一些基础结构(本节源码stepByStep/c9/a) 397
- 9.5 实现GC(本节源码stepByStep/c9/a) 400
- 9.6 添加临时根对象与触发GC 411
- 第 10章 命令行及调试 415
- 10.1 释放虚拟机(本节源码stepByStep/c10/a) 415
- 10.2 简单的命令行界面(本节源码stepByStep/c10/a) 415
- 10.3 调试(本节源码stepByStep/c10/b) 417