松本行弘:编程语言的设计与实现 PDF 文档
本书由 Ruby 之父松本行弘在《日经 Linux》杂志上的连载整合而成,主要介绍了新语言 Streem 的设计与实现过程。作者从设计 Streem 这门新语言的动机开始讲起,由浅入深,详细介绍了新语言开发中的各个环节,以及语言设计上的纠结与取舍,其中也不乏对其他编程语言的调查与思考,向读者展示了创建编程语言的乐趣。
本书适合各层次程序设计人员和编程爱好者阅读。
本书是 Ruby 之父松本行弘最新的作品。在书中作者讲述了从头开始设计一门新的流处理语言 Streem 的过程。凭借作者在业界的影响力,Streem 语言在开发阶段就已经在 GitHub 上收获了四千多 star。
虽然 Streem 语言依然在开发阶段,不适合在正式项目中使用,但是本书最大的价值并不在于Streem 语言本身。正如作者在文中所说,很多编程语言相关的书都是在介绍一门语言该如何使用,自制编程语言的书也仅仅涉及语言的实现,讲解语言为什么这样设计的书少之又少,而这本书就属于后者。从简单的如何为语言取名,到复杂的如何设计多线程、垃圾回收等,作者在书中事无巨细地介绍了语言设计的方方面面。对于想了解语言为什么会这样设计、语法为什么是这样的读者来说,本书是一本不可多得的宝贵资料。
封面
作译者简介
数字版权声明
扉页
版权页
译者序
前言
目录
第 1 章 创造一门什么样的语言
1-1 自己创造编程语言的意义
进入创造编程语言的世界
微机杂志的时代
个人创造编程语言的现状
提升个人品牌
乐趣第一
为什么创造新编程语言的人不多
没必要想得很难
1-2 语言处理器的结构
语言和语言处理器
语言处理器的结构
语言处理器的构成
编译器的构成
(1) 词法分析
(2) 语法分析
(3) 代码生成
(4) 优化
小结
1-3 虚拟机
用软件实现的 CPU 来运行
为什么以前的 Ruby 很慢
在虚拟机上灵活运用缓存
虚拟机的优点和缺点
虚拟机的实现技术
CISC 在虚拟机上有优势
栈与寄存器
指令格式
直接跳转
小结
1-4 编程语言设计入门(前篇)
创造人气语言的方法
心里的疑问
自己想用就足够了
1993 年有很多空闲时间
图书的策划成为契机
对 shell 脚本不满意
Python 过于普通
让脚本语言支持面向对象
对代码块结构的表现方式的思索
自动缩进的课题
自制 Emacs 的语言模式
是 else if 还是 elsif 还是 elif
开始实现
人气在于细节
1-5 编程语言设计入门(后篇)
设计原则
变量名
让局部变量变得更简洁
给脚本语言增加面向对象功能
单一继承对多重继承
单一继承的问题
Mix-in
Ruby 的模块
错误处理
对异常的关键字有讲究
代码块
反复推敲语法结构
扩大了使用范围
语言设计的秘诀
小结
第 2 章 新语言 Streem 的设计与实现
2-1 抽象的并发编程
多核化接过大旗
并行与并发编程
UNIX 的 fork 可以进行复制
创建进程的开销很大
进程间通信困难
通信开销小
并发控制变得复杂
Actor 模型
Erlang 的“进程”
容易共享数据
Go 的 goroutine
Clojure 的 STM
引入数据库的概念
小结
2-2 新语言 Streem
现在的 shell 脚本还不够理想
21 世纪的脚本语言
表达式
赋值
多条语句
Streem 程序的例子
不可变
单词计数
套接字编程
配管工作
管道的合并
通道缓冲
广播
小结
2-3 首先开发语法检查器
任务构成模式
生产者-消费者模式
轮询调度模式
广播模式
汇总模式
请求-应答模式
从反复试验的地方开始开发
Streem 语言也从语法检查器开始开发
软件构成
词法分析器的开发
语法定义的编写
lex 定义的语法
yacc 脚本的语法
用巴科斯范式定义语法
Streem 的语法
小结
2-4 事件循环
main 的原型
管道的构造
自行开发事件循环
I/O 事件的检测
epoll 系统调用
事件队列
处理函数的模式
原型的代码
今后的方向
小结
2-5 多线程与对象
多线程化
尝试多核化
再次挑战多核化
带优先级的队列
队列的实现
优先级的实现
并发控制
队列为空时的处理
多线程处理的调试
用结构体表示对象
GC
被“搁置”的语法分析也取得了进展
小结
2-6 缓存与符号
用缓存高速访问数据
设置多级缓存
数据更新时的问题
对管道的再次思考
在同一个内核中运行速度更快
要意识到缓存的存在
Lisp 的符号
初学者的困惑
其他语言中相当于符号的概念
Streem 中实现符号功能的方法
修改字符串生成函数
线程问题
符号垃圾问题
符号的 GC
小结
2-7 转换为抽象语法树
支持符号语法的新方法
语法分析动作
转换为抽象语法树
用结构体表示语法树的节点
直接执行语法树
遍历抽象语法树
灵活应用递归调用
用开源的方式开发
理想的语言处理器
今后的计划
小结
2-8 局部变量与异常处理
回到 30 年前
没有局部变量的世界
局部变量的引入
局部变量的实现
在 Streem 中实现局部变量
局部变量的嵌套
作用域嵌套的特殊情况
闭包(函数闭包)
闭包的实现
Streem 的闭包
编译时检查
错误检查
让“异常”产生
Swift 的 Optional
忽视错误
Streem 的异常处理的实现
小结
第 3 章 设计面向对象功能
3-1 各种各样的面向对象
Simula 的面向对象
开发者是和蔼可亲的人
Smalltalk 的面向对象
用 Smalltalk 表达 LOGO
Ruby 与 Smalltalk 相似吗
Actor 的面向对象
Erlang 也采用了 Actor 模型
CLOS 的面向对象
独立于类的方法
大规模的方法组合
Ruby 也借鉴了部分功能
C++的面向对象
Java 的面向对象
Ruby 的面向对象
3-2 Streem 的面向对象
Streem 中需要动态绑定
广义函数
减少类功能的增加所带来的副作用
不容易实现的 Refinement
广义函数与 Refinement
名称冲突
Streem 的对象
方法调用链
Lisp-1 和 Lisp-2
小结
3-3 再看 Streem 的语法
shift/reduce conflict
声明和执行语句
删除 break 语句
修改 if 语句
还有一些含混的地方
增加右侧赋值
修改函数调用
函数的直接调用
Lisp-1 和 Lisp-2
Lisp-2 的优缺点
Streem 和 Lisp-2
小结
3-4 模式匹配
Erlang 的模式匹配
与递归组合使用会很方便
使用尾递归进行优化
通过 case 和 if 语句实现模式匹配
通过 match 函数进行模式匹配
变量模式
通配符模式
字面量模式
数组模式
可变长度数组模式
结构体模式
命名空间模式
小结
第 4 章 实现 Streem 的对象
4-1 套接字编程
Streem 的套接字 API
Streem 网络服务器
Streem 网络编程的客户端
Streem 的功能扩展
什么是套接字
客户端套接字
套接字的使用方法(客户端)
服务器端套接字
套接字的使用方法(服务器)
任务的创建
小结
4-2 基本数据结构
可以用指针进行运算
自由转换的联合体
从数据结构看 C 的特点
应该把整数型合并为一个
浮点数也是一种数据类型
OCaml 的基本数据结构
Streem 不需要链表
Streem 的其他数据结构
本节修改的地方
小结
4-3 对象表示与 NaN Boxing
洁净室设计
引用的表示方法
现在的 Streem 用结构体来表示对象
IEEE 754
特殊的浮点数
NaN Boxing
布尔值的保存方法
整数的保存方法
浮点数的情况
指针的保存方法
字符串的保存方法
字符串的 GC
在 Streem 中引入 NaN Boxing
GC 的实现
小结
4-4 垃圾回收
自动释放内存空间
追踪法和引用计数法
标记清除法
复制法
GC 的性能指标
辅助的 GC 技巧
分代 GC
记录老年代对新生代对象的引用
增量 GC
引用计数法
Streem 的 GC
旧的对象不能引用新的对象
GC 的实现
未来 GC 的实现
小结
4-5 无锁算法
并发运行的陷阱
引入并发控制
锁的问题
什么是无锁
CPU 拥有原子操作指令
无锁队列
保证处理顺序
并发控制
无锁运算
小结
第 5 章 强化流编程
5-1 管道编程
数据统计
Web 服务与管道
HTTP 的软件构成
服务器端架构
电子游戏的示例
不可变与状态
引入嵌入式数据库的 kvs
kvs 的实现
khash
使用 khash 实现 kvs
并发控制
使用锁进行并发控制
事务的实现
小结
5-2 管道的构成要素
管道的构成要素
全局范围重命名
增加调试用的 strm_p()
管道编程的模式
使用归约进行单词计数
流的分叉与合流
需要进行流量控制
降低生产者的优先级
不考虑分配时的滞留
在目前使用的队列中增加对内存的考虑
修改为优先考虑内核的灵活使用
改善任务队列的实现
CAS
小结
5-3 CSV 处理功能
RFC4180
CSV 的变体
探索 GitHub
许可证
csv_parser
Streem 数组
CSV 格式
CSV 的任务化
检查字段数
多行记录
字段类型
表头处理
错误运行
小结
5-4 时间表示
时间与时刻
用字符串表示时刻
时刻的表示方法
时刻类型的结构体
UTC
时刻类型数据的生成
时差的计算方法
时刻操作的实现
用任意时区表示时刻
时刻字面量
时刻字面量的实现
CSV 的时刻支持
小结
5-5 统计基础的基础
总和与平均数
总和计算中的陷阱
Kahan 算法
平均数和方差(标准差)
流算法
用 Streem 计算标准差
偏差值
排序
很难进行大规模的排序
排序的应用
抽样
小结
5-6 随机数
真随机数和伪随机数
伪随机数的评估
线性同余法
梅森旋转法
Xorshift
伪随机数的初始值
/dev/random
伪随机数的基准测试
Streem 的随机数功能
随机数的各种类型
小结
5-7 数据流图
GUI 和 CUI(或者叫 CLI)
stag
画面构成
转义字符串
获取窗口大小
移动光标
绘制标题
绘制图表
graph_bar() 函数
调整窗口大小
光标的事后处理
今后的课题
Sixel 图像库
小结
下载地址:https://www.wenjiangs.com/wp-content/uploads/2024/04/jLdWSKuLEZ1FtGOG.zip
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论