python开发的软件sparrow-自制编程语言:基于C语言 PDF 全书影印版

给大家带来的一篇关于C语言编程相关的电子书资源,介绍了关于编程语言、C语言方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小259.8 MB,郑钢编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:7.6。

内容介绍

1-191021125A4494.jpg

前百度网高 级技术工程师、专业书《电脑操作系统实情复原》的创作者的另一大作 业内权威专家联名鞋强烈推荐 滴滴打车系统部技术性高 级主管于晓声 阿里巴巴网蚂蚁金服技术性权威专家肖金亮 百度网资 深运维工程师陈晓聪 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

学习笔记

python与c语言的不同

Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python,发现Python与其他语言确实有很大的区别。Python是由C语言实现的,因此想把Python与C语言做一个简单的比较。 一、 C语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快,不能跨平台,一般用于操作系统,驱动等底层开发。 Python是编译型还是解释型这个界限并不明显,但大致上可以理解为解释型语言,执行速度慢,由于Python虚拟机,Python是可以跨平台的,Python高度集成适合于软件的快……

python需要c语言基础吗

学python需要c语言基础吗? 学python可以不需要c语言基础,Python简单易学,适合零基础入门。不同的编程语言就好比其他国家的语言(英语、法语、德语),只不过一个是用来和机器交流的、一个是用来和人来交流的。 首先要做的是了解一些python的语法,就可以写一些比较简单的东西了,深入的话在了解一些算法相关的内容。 另外可以多看一些计算机基础方面的书籍,对学习编程会很有帮助。 相关推荐:《Python教程》 以上就是python需要c语言基础吗的详细内容,更多请关注码农之家其它相关文章! ……

python中赋值与c语言区别

python中赋值与c语言区别?先来看看简单的 Python 代码在内存中是什么样子的: b = 3b = b + 5 它在内存中的操作示意图是这样的: 然而,从代码的的字面意思上看,“把 3 赋给 b,把 b 加 5 之后再赋给 b。” 也就是把代码看成这个样子: b ← 3b ← b + 5 所以下面这张在内存中的操作图可能更符合我们的直觉: 也即 b + 5 的值又写回到 b 中。典型的 C 程序就是这样的。为变量 b 分配一个 int 型的内存单元,然后将整数 3 存放在该内存单元中。b 就代表了该块内存空间,不再移动,可以更新 b 的值,但 b 在内存中的地址就不再变化了。所以我们说 b = b + 5,就等于 b ← b + 5,把 b 的值加 5 之后还依然放入 b 中。 变量……

Java版C语言版简单使用静态语言实现动态数组的方法

动态语言相对于静态语言的一个优势,就是数组可以不需要预先确定大小,对于一些数组长度不确定的场景下是非常有用的。像PHP,只需要声明一下数组 $arr = array() 然后就可以直接 $arr[] = 1,$arr[] = 2,$arr[] = 3 ...这样一直加元素了,删除一个元素就直接使用unset($arr[1]),元素的空间就被释放了,而C和JAVA原生的数组就没有这么方便,声明的时候就必须先预先确定长度,由编译器分配相应的内存空间。不过通过一些巧妙的做法,也是可以实现一样的功能的,这也是本文的主要内容。 JAVA版 JAVA自带了一个集合类ArrayList,可以实现动态数组的功能,相比原生的数组,使用起来非常方便。在阅读Tomcat源码的时候,发现……

以上就是本次介绍的C语言编程电子书的全部相关内容,希望我们整理的资源能够帮助到大家,感谢大家对码农之家的支持。

展开 +

收起 -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值