logo
分类于: 其它

简介

自制编程语言

自制编程语言 7.9分

资源最后更新于 2020-03-20 17:46:05

作者:https://itpanda.net/book/196/download/192

译者:刘卓徐谦吴雅明

出版社:出版社人民邮电出版社

出版日期:2013-12

文件格式: pdf

标签: 网络 计算机 程序设计

简介· · · · · ·

本书手把手地教读者用C语言制作两种编程语言:crowbar与Diksam。crowbar是运行分析树的无类型语言,Diksam是运行字节码的静态类型语言。这两种语言都具备四则运算、变量、条件分支、循环、函数定义、垃圾回收等功能,最终版则可以支持面向对象、异常处理等高级机制。所有源代码都提供下载,读者可以一边对照书中的说明一边调试源代码。这个过程对理解程序的运行机制十分有帮助。本书适合有一定基础的程序员和编程语言爱好者阅读。作者简介:前桥和弥(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指针》等。

想要: 点击会收藏到你的 我的收藏,可以在这里查看

已收: 表示已经收藏

Tips: 注册一个用户 可以通过用户中心得到电子书更新的通知哦

目录

  1. 译者序
  2. 前言
  3. 第1章 引子
  4. 1.1 为什么要制作编程语言
  5. 1.2 自制编程语言并不是很难
  6. 1.3 本书的构成与面向读者
  7. 1.4 用什么语言来制作
  8. 1.5 要制作怎样的语言
  9. 1.5.1 要设计怎样的语法
  10. 1.5.2 要设计怎样的运行方式
  11. 补充知识 “用户”指的是谁?
  12. 补充知识 解释器并不会进行翻译
  13. 1.6 环境搭建
  14. 1.6.1 搭建开发环境
  15. 补充知识 关于bison与flex的安装
  16. 1.6.2 本书涉及的源代码以及编译器
  17. 第2章 试做一个计算器
  18. 2.1 yacc/lex是什么
  19. 补充知识 词法分析器与解析器是各自独立的
  20. 2.2 试作一个计算器
  21. 2.2.1 lex
  22. 2.2.2 简单正则表达式讲座
  23. 2.2.3 yacc
  24. 2.2.4 生成执行文件
  25. 2.2.5 理解冲突所代表的含义
  26. 2.2.6 错误处理
  27. 2.3 不借助工具编写计算器
  28. 2.3.1 自制词法分析器
  29. 补充知识 保留字(关键字)
  30. 补充知识 避免重复包含
  31. 2.3.2 自制语法分析器
  32. 补充知识 预读记号的处理
  33. 2.4 少许理论知识——LL(1)与LALR(1)
  34. 补充知识 Pascal/C中的语法处理诀窍
  35. 2.5 习题:扩展计算器
  36. 2.5.1 让计算器支持括号
  37. 2.5.2 让计算器支持负数
  38. 第3章 制作无类型语言crowbar
  39. 3.1 制作crowbar ver.0.1语言的基础部分
  40. 3.1.1 crowbar是什么
  41. 3.1.2 程序的结构
  42. 3.1.3 数据类型
  43. 3.1.4 变量
  44. 补充知识 初次赋值兼做变量声明的理由
  45. 补充说明 各种语言的全局变量处理
  46. 3.1.5 语句与结构控制
  47. 补充知识 elif、elsif、elseif的选择
  48. 3.1.6 语句与运算符
  49. 3.1.7 内置函数
  50. 3.1.8 让crowbar支持C语言调用
  51. 3.1.9 从crowbar中调用C语言(内置函数的编写)
  52. 3.2 预先准备
  53. 3.2.1 模块与命名规则
  54. 3.2.2 内存管理模块MEM
  55. 补充知识 valgrind
  56. 补充知识 富翁式编程
  57. 补充知识 符号表与扣留操作
  58. 3.2.3 调试模块DBG
  59. 3.3 crowbar ver.0.1的实现
  60. 3.3.1 crowbar的解释器——CRB_Interpreter
  61. 补充知识 不完全类型
  62. 3.3.2 词法分析——crowbar.l
  63. 补充知识 静态变量的许可范围
  64. 3.3.3 分析树的构建——crowbar.y与create.c
  65. 3.3.4 常量折叠
  66. 3.3.5 错误信息
  67. 补充知识 关于crowbar中使用的枚举型定义
  68. 3.3.6 运行——execute.c
  69. 3.3.7 表达式评估——eval.c
  70. 3.3.8 值——CRB_Value
  71. 3.3.9 原生指针型
  72. 3.3.10 变量
  73. 3.3.11 字符串与垃圾回收机制——string_pool.c
  74. 3.3.12 编译与运行
  75. 第4章 数组和mark-sweep垃圾回收器
  76. 4.1 crowbar ver.0.2
  77. 4.1.1 crowbar的数组
  78. 代码清单4-1 数组
  79. 4.1.2 访问数组元素
  80. 4.1.3 数组是一种引用类型
  81. 补充知识  “数组的数组”和 多维数组
  82. 4.1.4 为数组添加元素
  83. 4.1.5 增加(模拟)函数调用功能
  84. 4.1.6 其他细节
  85. 4.2 制作mark-sweep GC
  86. 4.2.1 引用数据类型的结构
  87. 4.2.2 mark-sweep GC
  88. 补充知识 引用和immutable
  89. 4.2.3 crowbar栈
  90. 4.2.4 其他根
  91. 4.2.5 原生函数的形式参数
  92. 4.3 实现GC本身
  93. 4.3.1 对象的管理方法
  94. 4.3.2 GC何时启动
  95. 4.3.3 sweep阶段
  96. 补充知识 GC现存的问题
  97. 补充知识 Coping GC
  98. 4.4 其他修改
  99. 4.4.1 修改语法
  100. 4.4.2 函数的模拟
  101. 4.4.3 左值的处理
  102. 4.4.4 创建数组和原生函数的书写方法
  103. 4.4.5 原生指针类型的修改
  104. 第5章 中文支持和Unicode
  105. 5.1 中文支持策略和基础知识
  106. 5.1.1 现存问题
  107. 5.1.2 宽字符(双字节)串和多字节字符串
  108. 补充知识 wchar_t肯定能表示1个字符吗?
  109. 5.1.3 多字节字符/宽字符之间的转换函数群
  110. 5.2 Unicode
  111. 5.2.1 Unicode的历史
  112. 5.2.2 Unicode的编码方式
  113. 补充知识 Unicode可以固定(字节)长度吗?
  114. 5.3 crowbar book_ver.0.3的实现
  115. 5.3.1 要实现到什么程度?
  116. 5.3.2 发起转换的时机
  117. 5.3.3 关于区域设置
  118. 5.3.4 解决0x5C问题
  119. 补充知识 失败的 #ifdef
  120. 5.3.5 应该是什么样子
  121. 补充知识 还可以是别的样子——Code Set Independent
  122. 第6章 制作静态类型的语言Diksam
  123. 6.1 制作Diksam Ver 0.1语言的基本部分
  124. 6.1.1 好Diksam的运行状态
  125. 6.1.2 什么是Diksam
  126. 6.1.3 程序结构
  127. 6.1.4 数据类型
  128. 6.1.5 变量
  129. 6.1.6 语句和流程控制
  130. 6.1.7 表达式
  131. 6.1.8 内建函数
  132. 6.1.9 其他
  133. 6.2 什么是静态的/执行字节码的语言
  134. 6.2.1 静态类型的语言
  135. 6.2.2 什么是字节码
  136. 6.2.3 将表达式转换为字节码
  137. 6.2.4 将控制结构转换为字节码
  138. 6.2.5 函数的实现
  139. 6.3 Diksam ver.0.1的实现——编译篇
  140. 6.3.1 目录结构
  141. 6.3.2 编译的概要
  142. 6.3.3 构建分析树(create.c)
  143. 6.3.4 修正分析树(fix_tree.c)
  144. 常量表达式的包装
  145. 为表达式添加类型
  146. 6.3.5 Diksam的运行形式——DVM_Executable
  147. 6.3.6 常量池
  148. 补充知识 YARV的情况
  149. 6.3.7 全局变量
  150. 6.3.8 函数
  151. 6.3.9 顶层结构的字节码
  152. 6.3.10 行号对应表
  153. 6.3.11 栈的需要量
  154. 6.3.12 生成字节码(generate.c)
  155. 6.3.13 生成实际的编码
  156. 6.4 Diksam虚拟机
  157. 1. 栈
  158. 2. 堆
  159. 3. 静态(static)空间
  160. 6.4.1 加载/链接DVM_Executable到DVM
  161. 1. 将函数添加到DVM_VirtualMachine中
  162. 2. 替换函数的索引 ####
  163. 3. 修正局部变量的索引值
  164. 4. 将全局变量添加到DVM_VirtualMachine中
  165. 6.4.2 执行——巨大的switch case
  166. 6.4.3 函数调用
  167. 第7章 为Diksam引入数组
  168. 7.1 Diksam中数组的设计
  169. 7.1.1 声明数组类型的变量
  170. 7.1.2 数组常量
  171. 补充知识 D语言的数组
  172. 7.2 修改编译器
  173. 7.2.1 数组的语法规则
  174. 7.2.2 TypeSpecifier结构体
  175. 7.3 修改DVM
  176. 7.3.1 增加指令
  177. 补充知识 创建Java的数组常量
  178. 补充知识 C语言中数组的初始化
  179. 7.3.2 对象
  180. 补充知识 ArrayStoreException
  181. 7.3.3 增加null
  182. 7.3.4 哎!还缺点什么吧?
  183. 第8章 将类引入Diksam
  184. 8.1 分割源文件
  185. 8.1.1 包和分割源代码
  186. 1. require
  187. 2. 动态加载
  188. 3. 包
  189. 4. rename
  190. 5. 开始执行
  191. 6. 关于全局变量
  192. 补充知识 #include、文件名、行号
  193. 8.1.2 DVM_ExecutableList
  194. 8.1.3 ExecutableEntry
  195. 8.1.4 分开编译源代码
  196. 8.1.5 加载和再链接
  197. 补充知识 动态加载时的编译器
  198. 8.2 设计Diksam中的类
  199. 8.2.1 超简单的面向对象入门
  200. 8.2.2 类的定义和实例创建
  201. 1. 引用成员时必须使用 this.
  202. 2. 成员的访问修饰符只有 public 和 private ,没有 protected
  203. 3. 构造方法要使用 constructor 修饰符
  204. 4. 没有 static 的字段和方法
  205. 8.2.3 继承
  206. 8.2.4 关于接口
  207. 8.2.5 编译与接口
  208. 8.2.6 Diksam怎么会设计成这样?
  209. 8.2.7 数组和字符串的方法
  210. 8.2.8 检查类的类型
  211. 8.2.9 向下转型
  212. 8.3 关于类的实现——继承和多态
  213. 8.3.1 字段的内存布局
  214. 8.3.2 多态——以单继承为前提
  215. 8.3.3 多继承——C++
  216. 8.3.4 Diksam的多继承
  217. 补充知识 无类型语言中的继承
  218. 8.3.5 重写的条件
  219. 8.4 关于类的实现
  220. 8.4.1 语法规则
  221. 8.4.2 编译时的数据结构
  222. 8.4.3 DVM_Executable中的数据结构
  223. 8.4.4 与类有关的指令
  224. 补充知识 方法调用、括号和方法指针
  225. 8.4.5 方法调用
  226. 8.4.6 super
  227. 8.4.7 类的链接
  228. 8.4.8 实现数组和字符串的方法
  229. 8.4.9 类型检查和向下转型
  230. 补充知识 对象终结器(finalizer)和析构函数(destructor)
  231. 第9章 应用篇
  232. 9.1 为crowbar引入对象和闭包
  233. 9.1.1 crowbar的对象
  234. 9.1.2 对象实现
  235. 9.1.3 闭包
  236. 9.1.4 方法
  237. 9.1.5 闭包的实现
  238. 9.1.6 试着跟踪程序实际执行时的轨迹
  239. 1. 普通的函数调用
  240. 2. 创建闭包
  241. 3. 调用闭包
  242. 4. 创建闭包中的闭包
  243. 5. 调用嵌套闭包
  244. 9.1.7 闭包的语法规则
  245. 9.1.8 普通函数
  246. 9.1.9 模拟方法(修改版)
  247. 9.1.10 基于原型的面向对象
  248. 9.2 异常处理机制
  249. 9.2.1 为crowbar引入异常
  250. 9.2.2 setjmp()/longjmp()
  251. 补充知识 Java和C#异常处理的不同
  252. 9.2.3 为Diksam引入异常
  253. 补充知识 catch的编写方法
  254. 9.2.4 异常的数据结构
  255. 9.2.5 异常处理时生成的字节码
  256. 9.2.6 受查异常
  257. 补充知识 受查异常的是与非
  258. 补充知识 异常处理本身的是与非
  259. 9.3 构建脚本
  260. 9.3.1 基本思路
  261. 9.3.2 YY_INPUT
  262. 9.3.3 Diksam的构建脚本
  263. 9.3.4 三次加载/链接
  264. 9.4 为crowbar引入鬼车
  265. 9.4.1 关于“鬼车”
  266. 9.4.2 正则表达式常量
  267. 9.4.3 正则表达式的相关函数
  268. 9.5 其他
  269. 9.5.1 foreach和迭代器(crowbar)
  270. 9.5.2 switch case(Diksam)
  271. 9.5.3 enum(Diksam)
  272. 9.5.4 delegate(Diksam)
  273. 9.5.5 final、const(Diksam)
  274. 附录
  275. 附录A crowbar语言的设计
  276. A.1 程序结构
  277. 构成程序的要素
  278. A.2 文字语法规则
  279. A.2.1 源文件的编码
  280. A.2.2 关键字
  281. A.2.3 空白字符的处理
  282. A.2.4 注释
  283. A.2.5 标识符
  284. A.2.6 常量
  285. A.2.7 运算符
  286. A.2.8 分隔符
  287. A.3 数据类型
  288. A.3.1 类型一览
  289. A.3.2 字符串类型
  290. A.3.3 数组类型
  291. A.3.4 对象类型
  292. A.3.5 函数类型
  293. A.3.6 原生指针类型
  294. A.3.7 迭代器
  295. A.3.8 异常
  296. A.4 表达式
  297. A.4.1 类型转换
  298. A.4.2 运算符一览
  299. A.5 语句
  300. A.5.1 表达式语句
  301. A.5.2 if语句
  302. A.5.3 while语句
  303. A.5.4 for语句
  304. A.5.5 foreach语句
  305. A.5.6 return语句
  306. A.5.7 break语句
  307. A.5.8 continue语句
  308. A.5.9 try语句
  309. A.5.10 throw语句
  310. A.5.11 global语句
  311. A.6 函数
  312. A.6.1 函数定义
  313. A.6.2 局部变量
  314. 附录B Diksam语言的设计
  315. B.1 程序结构
  316. B.1.1 构成程序的要素
  317. B.1.2 分割编译
  318. B.1.3 解决命名冲突
  319. B.1.4 关于全局变量的链接
  320. B.2 语法规则
  321. B.2.1 源文件的字符编码
  322. B.2.2 关键字
  323. B.2.3 空白字符的处理
  324. B.2.4 注释
  325. B.2.5 标识符
  326. B.2.6 常量
  327. B.3 数据类型
  328. B.3.1 基础类型
  329. B.3.2 类/接口
  330. B.3.3 派生类
  331. B.3.4 枚举类型
  332. B.3.5 delegate类型
  333. B.3.6 内建方法
  334. B.4 表达式
  335. B.4.1 单目表达式
  336. B.4.2 类型转换
  337. B.4.3 运算符一览
  338. B.5 语句
  339. B.5.1 声明语句
  340. B.5.2 表达式语句
  341. B.5.3 if语句
  342. B.5.4 switch语句
  343. B.5.5 while语句
  344. B.5.6 do while语句
  345. B.5.7 for语句
  346. B.5.8 return语句
  347. B.5.9 break语句
  348. B.5.10 continue语句
  349. B.5.11 try语句
  350. B.5.12 throw语句
  351. B.6 函数
  352. B.6.1 函数定义
  353. B.6.2 函数的签名声明
  354. B.6.3 局部变量
  355. B.7 类/接口的定义
  356. B.7.1 类定义
  357. B.7.2 接口定义
  358. B.7.3 字段定义
  359. B.7.4 方法定义
  360. B.7.5 方法重写
  361. B.7.6 构造器
  362. B.8 程序库
  363. B.8.1 函数
  364. B.8.2 内建类
  365. 附录C Diksam Virtual Machine 指令集
  366. C.1 范例
  367. C.2 指令一览表
  368. C.2 指令一览表
  369. 编程语言实用化指南——写在最后
  370. 参考文献
  371. 书中引用到的文献
  372. 其他推荐的书