编辑推荐
大师级程序员思维方式,Ruby之父全面公开新语言开发的全过程。
内容简介
本书由Ruby之父松本行弘在《日经Linux》杂志上的连载整合而成,主要介绍了新语言Streem的设计与实现过程。作者从设计Streem这门新语言的动机开始讲起,由浅入深,详细介绍了新语言开发中的各个环节,以及语言设计上的纠结与取舍,其中也不乏对其他编程语言的调查与思考,向读者展示了创建编程语言的乐趣。
作者简介
作者松本行弘,Ruby语言发明者,亦是亚洲首屈一指的编程语言发明者。现兼任网络应用通信研究所(NaCl)研究员、乐天技术研究所研究员、Heroku首席架构师等。昵称“Matz”。讨厌东京,喜欢温泉。
章节目录
版权信息
内容提要
译者序
前言
第1章 创造一门什么样的语言
1-1 自己创造编程语言的意义
进入创造编程语言的世界
微机杂志的时代
个人创造编程语言的现状
提升个人品牌
乐趣第一
为什么创造新编程语言的人不多
没必要想得很难
1-2 语言处理器的结构
语言和语言处理器
语言处理器的结构
语言处理器的构成
编译器的构成
小结
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图像库
小结
后记
松本行弘:编程语言的设计与实现是2019年由人民邮电出版社·图灵出品出版,作者[日] 松本行弘。
得书感谢您对《松本行弘:编程语言的设计与实现》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。