互联网
类型
7.5
豆瓣评分
可以朗读
语音朗读
245千字
字数
2019-08-01
发行日期
展开全部
主编推荐语
大师级程序员思维方式,Ruby之父全面公开新语言开发的全过程。
内容简介
本书由Ruby之父松本行弘在《日经Linux》杂志上的连载整合而成,主要介绍了新语言Streem的设计与实现过程。作者从设计Streem这门新语言的动机开始讲起,由浅入深,详细介绍了新语言开发中的各个环节,以及语言设计上的纠结与取舍,其中也不乏对其他编程语言的调查与思考,向读者展示了创建编程语言的乐趣。
目录
- 版权信息
- 内容提要
- 译者序
- 前言
- 第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图像库
- 小结
- 后记
展开全部
出版方
人民邮电出版社·图灵出品
图灵社区成立于2005年6月,由人民邮电出版社投资控股,以策划出版高质量的科技书籍为核心业务,主要出版领域包括计算机、电子电气、数学统计、科普等,通过引进国际高水平的教材、专著,以及发掘国内优秀原创作品等途径,为目标读者提供一流的内容。