热搜关键词: MATLAB天线OpenCVVHDL

pdf

自制编程语言基于C语言

  • 1星
  • 2022-07-18
  • 76.18MB
  • 需要1积分
  • 1次下载
  • favicon收藏
  • rep举报
  • free评论
标签: C语言

C语言

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

第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

仅供二Wnli业用途或交流学习伎HI
•...-•-
.
.
-1:
存烹曹雪
Y
q
μ
l
J
H
r
t
T
H
H
r
f
h
J
½
r
½
H
J
K
f
A
U
l
1
ι
A
4
4
3
A
d
H
H
M
f
H
V
l
1
A
A-
1
t
1
R
i见
w
½
μ
·
·
L
.
c
中½工信出版集团
多人民邮电出版社
φ
。U川H
A,
’也
丁g1”a兵k
儿h-呻队
微郑f大用刚
1叫发H。M
.
仅供非商业用 i孟或交流学习½用
·玩
n
’ι父
4
<.
r正
f
l:J
封~
'11.
-I.I:
;,:
i均~
fll
A
L
½
f1JI
向!
;:;:
1
回[!'..~姐!因
一…-·
M
m
H
晤捐·蝉面
-且,
.T.'
::.T,也
1•1.1
欢迎关注
蝙蝠侠学院
φ
仅 fj~非商业用途或交流学习½用
i 基
½
人民邮电出版社
北京
5号
仅供非商业用途或交流学习½用
图书在版编目
CC
I
P )数据
自制编程语言/郑钢著
一北京:人民邮电出版
丰土,
2018. 9
ISBN
978一7-115-48737-7
I. ①自… II.
①郑
… E
①C语言
一程序设计
IV. (
TP312.8
中½版本图书馆CIP数据核字( 2018 )第 137473 号
内容提要
本书是一本专门介绍自制编程语言的图书,书中深入浅出地讲述了如½开发
门编程语
言,以
及运行这门编程语言的虚拟机。本书主要内容包括
脚本语言的功½、词法分析器、类、对象、原
生方法、自上而下算符优先、语法分析、语义分析、虚拟机、内建类、垃圾回收、½令行及调试等
技术。
本书适合程序员阅读,也适合对编程语言原理感兴趣的计算机从业人员学习。
责任印制
邮编
郑钢
马振武
责任编辑张涛
’人民邮电出版社出版发行
100164
电子由附-
北京市丰台区成寿寺路
l
l
315@ptpress.co皿∞
½址
h邸’/仰WW.严press.co皿en
固安县铭成印刷有限公司印刷
开本
: 787
x
l092
印张: 28
1/16
2018 年 9 月
l
字数: 743 千字
印数:
I
2 400
flit
2018 年 9 月河北第
l
次印刷
定价
89
.00
读者服务热线:( 010)
81055410
反盗版热线
印装质量热线:(010)
81055316
(010)
81055315
广告经营许可证:京东工商广登字 20170147 号
φ
仅供非商业用途或交流学习½用
雄荐启富
很高兴½成为本书的
首批读者,也很高兴½为本书写推荐序 。
刚拿到本书手稿时,从书名上我意识到这是对我胃口的书
。果然
整书阅读以后,收获颇多。
如今程序员的开发成本己经很½了,项目中有各种成熟的框架和库可供选择和½用,½还有人½
静下
心来研究编译器这么底层的技术,实属难得。本书犹如一把火炬,点燃了技术人内 心对开发
的热情
依稀记得 2010 年年初在百度与郑钢初次见面的情景,那时他工½之½的时间基本½用在向各
个技术专家请教、讨论各类技术问题上,他是我带过的人中最勤奋的人之一。 时光在再,
一分耕
耘一分收获,看到他今天的成长,尤感欣慰。
本书讲述了
门脚本语言( sparrow )的开发过程,这是
一本
“步步为营”式的书籍,延续了
他编写《操½系统真象还原
的风格,手把手地教读者从零实现一 门语
,从原理到实践每一步
½有实际的代码和详½的原理说明,通过运行书中各
小节中的代码,读者可以很½松 地掌握各个
细节,因此本书的学习曲线并不陡峭,甚至很平坦
。另外
,值得欣喜 的是,本书所编写的脚本语
言并不是用
Java 、 C++等入门难度略大的语言实现的,而是用
C 语言,这是我们学习编程的基础
言。
也就是说,本书不需要专业的开发经验即可上手学习。另外,在实现过程中井未用到复杂
的库½数或系统调用,可以负责地说,本书已经将学习成本降到
最½。
C 语
言是一种面向过程的语言,
如½用
一种面向过程的语言去实现一种面向对象的语 言
很有
意思。另外, PHP 和 Perl 语言½然也实现了类,½它们其实是一种面向过程的语言,并不是纯粹
的面向对象语
,而 sparrow 语
言是一种纯粹的面向对象语言,它在设计之初就采用对象的方式
来处理脚本语言中类的成员和方法,这仿½让我们看到了面向对象编程语言的基因。众所周知,
½今流行的脚本语言应属 Python ,
Python 也是用 C 语言实现的,也许½很½奇 Python 的内部原
理,½是想到它有将近 4 万行的源代码时,也许甚至不想看它的源程序了。那么研读本书中的
sparrow
语言会是一种更½的选择,其源码不足 7
100 行,
阅读过程½松愉快,½可以学到 Python
这种语言的实现原理
对于脚本语言来说,两个重要方面就是垃圾回收和运行环境
。垃圾回
收就是我们平时所说的
GC (Garbage
Collection )
。有
了 GC ,程序员不需要手工释放所分配的对象,可以½精力专注于业
务逻辑而不用担
内存泄漏问题。在 sparrow 语言中同样实现了 GC ,通过此部分代码½可以看到
GC 的原理,以及哪些对象才½被回收
运行时环境就是脚本语言中的虚拟机,即 VM
C 如 Java
语言的
口币4 也是一种
VM )。脚本语言是通过虚拟机才½运行的,如½把编译器生成的操½码½换
为实际的代码,这里面的工½对大
多数人来说很神秘 。
相信各½在源码中
一探究竟之后会发现:
GC
和 VM 这两个神秘的黑盒子不过如此
。另
外,也许程序员
最感兴趣的就是线程
,关于线程在用户态
下是如½实现的、线程如½实现调度,本书将告诉½答案。总之,½凡涉猎,开卷有益。
每个程序员½有实现属于自己编程语
的梦想,说其是梦想,原因是实现的难度很大...本书
讲的是纯粹的技术“干货飞符合郑钢一贯的写½风格,这是他静心写出来的东西,内容满满,很
值得阅读。
于晓声
滴滴系统部技术高级总监
φ
展开预览

推荐帖子 最新更新时间:2022-08-07 21:51

【老高推荐】PYTHON精选书籍(补廖雪峰)
未来是AI的时代,Python语言是最接近。用python已经不是装逼了确实没有错,未来10年,如果不是python/ruby这样的语言发展的时机,那会是什么语言?不废话了,上点python的精选书籍吧! python可以用来做什么 Python简明教程   Python.Cookbook(第2版)中文版 Python基础教程【第二版】 PYTHON QT GUI快速编程指南 Pr
高进 下载中心专版
TMS320F28377D_LED实验
#include "F28x_Project.h" int main(void) { //初始化 InitSysCtrl(); InitGpio(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EINT; ERTM;     //IO口配置     GPIO_Se
Aguilera 微控制器 MCU
STM32H743ZI的GPIO翻转频率问题
请教!请教!!请教!!! 搞到一块STM32H743ZI的nucleo板子,测试GPIO翻转速率,主频配置为400MHz,AHB总线设置为200MHz,打开了IO 的compensation cell,通过BSRR寄存器赋值给GPIO端口实现翻转,怎么测到的翻转频率才16.7MHz,还没有我F407平台跑的快,datasheet上不是说可以到133MHz??? 哪位大神知道,告知下! 使用8
yjlong stm32/stm8
DSP软硬件的几个基本概念
有不少刚刚接触DSP的兄弟,对DSP的基本概念不是很清楚,导致入门很慢,我来写几句,仅供大家参考。 如有错误请批评指正。我只用过TI的DSP,如有其他公司DSP用法不同的我也不能讲解,请见谅。 1.DSP:DSP(Digital Siginal Processing)原意是一种信号处理方法,但是发展到现在,已经成为专用芯片的称呼,一般指的是专门用来运行DSP算法的芯片,这些芯片与通用cpu最大
灞波儿奔 DSP 与 ARM 处理器
简单的上拉下拉电路,导致控制芯片发热!
问题是这样的,为了对STM32F103系列单片机的某几位引脚输入电平状态进行手动设置(声明:因为要完成某项功能,是通过外围电路随机设置的,所以不能通过修改程序来设置好),电路如图所示。单片机的几个引脚配置为上拉输入模式,所以我只在某些需要拉到低电平的引脚通过焊接0欧姆电阻来接地,使该引脚输入变为低电平。至于3.3V那一端可以忽略,因为是上拉输入模式,所以基本没有用到该部分电路。电路是可以实现该功能
燕园技术宅 模拟电子
了解恩智浦KW41Z(支持802.15.4和BLE同时运行),提交创意赢好礼(共200份)
前面有些网友反应有创意,但是最近工作忙没时间捣鼓KW41Z开发板,其实本次的KW41Z活动,即可提交创意申领开发板,也可以提交创意赢取小礼品,没有时间的网友,可以按照下方活动说明,参与活动哦 活动日期:即日起-2月28日 活动内容: 1、了解:点此阅读恩智浦无线MCU KW41Z专题 2、提交:点此提交基于KW41Z切实可行的创意 3、颁奖:活动结
nmg NXP MCU

评论

登录/注册

意见反馈

求资源

回顶部
查找数据手册?

EEWorld Datasheet 技术支持

热门活动

相关视频

可能感兴趣器件

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
×