内容简介
WebAssembly是栈式虚拟机和字节码技术的*新应用,在Web开发、后端开发、区块链等领域大显身手,越来越受欢迎。
本书是WebAssembly入门和进阶的必读书,它不仅对WebAssembly的工作原理、核心技术和规范进行了全面的剖析和解读,而且给出了实现WebAssembly解释器和AOT编译器的思路和代码。
本书共14章,分为四个部分:
第壹部分 WebAssembly概述(第1章)
主要介绍了WebAssembly的概念、发展历史以及阅读本书需要做的准备工作。
第二部分 二进制和文本格式(第2~4章)
详细讲解了WebAssembly的二进制格式、文本格式以及指令集。
第三部分 虚拟机和解释器(第5~11章)
详细讲解了WebAssembly的解释器和虚拟机的工作原理以及实现思路,包括操作数栈、内存、函数调用、控制指令、链接和实例化、错误处理和验证等。
第四部分 WebAssembly进阶(第12~14章)
深入地讲解了AOT编译器的实现思路和WebAssembly的提案等内容。
通过阅读本书,读者不仅可以理解WebAssembly核心原理,还可以学习如何实现WebAssembly解释器和AOT编译器。即收获了“鱼”,又学会了“渔”。
前言
第一部分 概述
第1章 Wasm介绍3
1.1 Wasm简史3
1.2 Wasm简介6
1.3 准备工作10
1.4 你好Wasm11
1.5 本章小结13
第二部分 二进制和文本格式
第2章 二进制格式17
2.1 二进制格式介绍17
2.1.1 Wasm二进制格式总体结构18
2.1.2 索引空间21
2.1.3 实体类型23
2.2 二进制格式分析25
2.2.0 魔数和版本号25
2.2.1 类型段26
2.2.2 导入段28
2.2.3 函数段30
2.2.4 表段30
2.2.5 内存段31
2.2.6 全局段32
2.2.7 导出段33
2.2.8 起始段34
2.2.9 元素段35
2.2.10 代码段35
2.2.11 数据段37
2.2.12 自定义段38
2.3 二进制格式解码39
2.3.1 LEB128介绍39
2.3.2 解码基本类型41
2.3.3 解码向量类型44
2.3.4 处理tag44
2.3.5 解码代码项和表达式45
2.3.6 解码整体结构45
2.3.7 处理错误情况47
2.4 实现dump命令48
2.5 本章小结50
第3章 指令集51
3.1 指令集介绍51
3.1.1 操作码51
3.1.2 助记符53
3.1.3 立即数54
3.1.4 操作数57
3.2 指令分析58
3.2.1 数值指令58
3.2.2 变量指令60
3.2.3 内存指令61
3.2.4 结构化控制指令62
3.2.5 跳转指令64
3.2.6 函数调用指令65
3.3 指令解码66
3.4 完善dump命令69
3.5 本章小结70
第4章 文本格式71
4.1 基本结构71
4.1.1 类型域72
4.1.2 导入和导出域73
4.1.3 函数域75
4.1.4 表域和元素域75
4.1.5 内存域和数据域76
4.1.6 全局域77
4.1.7 起始域77
4.2 指令78
4.2.1 普通形式78
4.2.2 折叠形式79
4.3 本章小结81
第三部分 虚拟机和解释器
第5章 操作数栈85
5.1 操作数栈85
5.2 虚拟机87
5.2.1 指令循环88
5.2.2 指令分派88
5.3 参数指令89
5.3.1 drop指令90
5.3.2 select指令90
5.4 数值指令91
5.4.1 常量指令92
5.4.2 测试指令92
5.4.3 比较指令93
5.4.4 一元算术指令95
5.4.5 二元算术指令96
5.4.6 类型转换指令99
5.5 本章效果103
5.6 本章小结105
第6章 内存107
6.1 内存介绍107
6.2 内存实现108
6.3 内存指令109
6.3.1 size和grow指令110
6.3.2 加载指令111
6.3.3 存储指令113
6.4 本章效果115
6.5 本章小结117
第7章 函数调用(上)119
7.1 函数调用介绍119
7.2 函数调用实现122
7.2.1 增强操作数栈123
7.2.2 添加调用栈124
7.2.3 增强虚拟机126
7.2.4 call指令127
7.3 局部变量指令129
7.3.1 local.get指令130
7.3.2 local.set指令130
7.3.3 local.tee指令131
7.4 全局变量指令132
7.4.1 global.get指令132
7.4.2 global.set指令133
7.5 本章效果134
7.6 本章小结135
第8章 控制指令137
8.1 控制指令介绍137
8.1.1 跳转标签138
8.1.2 跳转标签索引139
8.1.3 块类型141
8.2 控制指令实现142
8.2.1 block和loop指令142
8.2.2 if指令144
8.2.3 br指令146
8.2.4 br_if指令148
8.2.5 br_table指令149
8.2.6 return指令150
8.2.7 unreachable和nop指令151
8.3 本章效果152
8.4 本章小结153
第9章 函数调用(下)155
9.1 本地函数调用155
9.1.1 本地函数介绍155
9.1.2 统一两种函数158
9.1.3 调用本地函数159
9.1.4 链接本地函数161
9.1.5 测试本节代码162
9.2 间接函数调用163
9.2.1 间接函数调用介绍163
9.2.2 实现表165
9.2.3 初始化表166
9.2.4 call_indirect指令167
9.2.5 测试本节代码168
9.3 本章小结169
第10章 链接和实例化171
10.1 定义实例接口171
10.2 实现实例接口174
10.2.1 函数174
10.2.2 表176
10.2.3 全局变量177
10.2.4 虚拟机177
10.3 实例化模块178
10.4 本章效果180
10.5 本章小结183
第11章 错误处理和验证185
11.1 各种错误186
11.1.1 解码错误186
11.1.2 结构错误188
11.1.3 实例化错误189
11.1.4 运行时错误190
11.2 验证整体结构190
11.3 验证函数字节码192
11.3.1 数据结构193
11.3.2 操作数栈194
11.3.3 控制栈195
11.3.4 验证指令197
11.4 本章效果198
11.5 本章小结199
第四部分 进阶
第12章 编译为Wasm203
12.1 控制指令203
12.2 参数指令207
12.3 变量指令208
12.4 内存指令210
12.5 数值指令213
12.6 本章小结215
第13章 AOT编译器217
13.1 AOT介绍217
13.2 编译模块219
13.3 编译函数220
13.3.1 内部函数221
13.3.2 外部函数222
13.3.3 导出函数222
13.3.4 辅助方法223
13.4 编译指令224
13.4.1 参数指令224
13.4.2 变量指令225
13.4.3 内存指令226
13.4.4 数值指令227
13.4.5 结构化控制指令228
13.4.6 跳转指令230
13.4.7 函数调用指令231
13.5 本章效果233
13.6 本章小结234
第14章 提案和前景235
14.1 提案235
14.1.1 多块内存237
14.1.2 内存块操作237
14.1.3 引用类型239
14.1.4 尾递归调用241
14.1.5 异常处理242
14.1.6 多线程支持244
14.1.7 其他提案247
14.2 前景248
附录A Wasm指令表249
附录B 二进制格式253
附录C WAT语法255