松本行弘:编程语言的设计与实现

松本行弘:编程语言的设计与实现

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

大师级程序员思维方式,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年由人民邮电出版社·图灵出品出版,作者[日] 松本行弘。

得书感谢您对《松本行弘:编程语言的设计与实现》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
智能可穿戴设备的设计与实现 电子书
本书以智能可穿戴设备开发平台为依托,并结合编者的实际开发经验编写而成,内容包括:可穿戴设备的现状、平台简介和实验说明;IAR-EWARM软件的安装和使用方法,用AndroidStudio开发软件开发可穿戴设备APP;Android入门基础知识;编程实现让APP通过蓝牙和设备进行通信;可穿戴设备模块综合设计。  本书结构清晰,讲解细致,注重学生实践能力的培养。通过学习,读者可对智能可穿戴设备的设计与
自然语言处理与Java语言实现 电子书
本书介绍了自然语言处理的原理与Java编程语言的技术实现,主要包括多种语言的文本处理、分布式算法与代码实现、自然语言处理相关系统构建等内容。
Vue.js设计与实现 电子书
1.Vue.js官方团队成员霍春阳倾力打造;2.基于Vue.js3深入解析Vue.js设计细节;3.Vue.js作者尤雨溪作序推荐;4.本书提供源代码下载;5.业界大咖联袂推荐...
高性能MVVM框架的设计与实现:San 电子书
揭秘支撑百度三大业务的MVVM框架设计,领悟高性能跨端全栈设计思想。
R语言编程:基于tidyverse 电子书
一本基于tidyverse入门R语言编程的书。