第0章 WebAssembly诞生背景 1
0.1 JavaScript简史 1
0.2 asm.js的尝试 2
0.3 WebAssembly的救赎 5
第1章 JavaScript语言基础 7
1.1 console对象 7
1.2函数和闭包 9
1.3 Promise对象 12
1.4二进制数组 13
第2章 WebAssembly快速入门 17
2.1准备工作 17
2.1.1 WebAssembly兼容性 17
2.1.2 WebAssembly文本格式与wabt工具集 19
2.2首个例程 21
2.3 WebAssembly概览 22
2.3.1 WebAssembly中的关键概念 23
2.3.2 WebAssembly程序生命周期 24
2.3.3 WebAssembly虚拟机体系结构 25
2.4你好,WebAssembly 25
2.4.1 WebAssembly部分 26
2.4.2 JavaScript部分 27
2.5 WebAssembly调试及代码编辑环境 28
第3章 JavaScript中的WebAssembly对象 31
3.1 WebAssembly对象简介 31
3.2全局方法 32
3.2.1 WebAssembly.compile() 32
3.2.2 WebAssembly.instantiate() 33
3.2.3 WebAssembly.validate() 34
3.2.4 WebAssembly.compileStreaming() 35
3.2.5 WebAssembly.instantiateStreaming() 35
3.3 WebAssembly.Module对象 36
3.3.1 WebAssembly.Module() 36
3.3.2 WebAssembly.Module.exports() 37
3.3.3 WebAssembly.Module.imports() 38
3.3.4 WebAssembly.Module.customSections() 39
3.3.5缓存Module 40
3.4 WebAssembly.Instance对象 41
3.4.1 WebAssembly.Instance() 41
3.4.2 WebAssembly.Instance.prototype.exports 42
3.4.3创建WebAssembly.Instance的简洁方法 43
3.5 WebAssembly.Memory对象 44
3.5.1 WebAssembly.Memory() 44
3.5.2 WebAssembly.Memory.prototype.buffer 44
3.5.3 WebAssembly.Memory.prototype.grow() 47
3.6 WebAssembly.Table对象 50
3.6.1 WebAssembly.Table() 51
3.6.2 WebAssembly.Table.prototype.get() 52
3.6.3 WebAssembly.Table.prototype.length 54
3.6.4在WebAssembly内部使用表格 55
3.6.5多个实例通过共享表格及内存协同工作 57
3.6.6 WebAssembly.Table.prototype.set() 60
3.6.7 WebAssembly.Table.prototype.grow() 61
3.7小结及错误类型 61
第4章 WebAssembly汇编语言 65
4.1 S-表达式 65
4.2数据类型 66
4.3函数定义 67
4.3.1函数签名 67
4.3.2局部变量表 68
4.3.3函数体 68
4.3.4函数别名 68
4.4变量 69
4.4.1参数与局部变量 69
4.4.2变量别名 70
4.4.3全局变量 70
4.5栈式虚拟机 72
4.5.1栈 72
4.5.2 WebAssembly栈式虚拟机 72
4.5.3栈式调用 73
4.6函数调用 75
4.6.1直接调用 75
4.6.2间接调用 76
4.6.3递归 78
4.7内存读写 79
4.7.1内存初始化 79
4.7.2读取内存 80
4.7.3写入内存 81
4.7.4获取内存容量及内存扩容 82
4.8控制流 83
4.8.1 nop和unreachable 83
4.8.2 block指令块 83
4.8.3 if指令块 85
4.8.4 loop指令块 86
4.8.5指令块的label索引及嵌套 86
4.8.6 br 87
4.8.7 br_if 89
4.8.8 return 90
4.8.9 br_table 90
4.9导入和导出 91
4.9.1导出对象 91
4.9.2导入对象 93
4.10 start()函数及指令折叠 96
4.10.1 start()函数 96
4.10.2指令折叠 97
第5章 WebAssembly二进制格式 99
5.1 LEB128编码 99
5.1.1 LEB128编码原理 99
5.1.2无符号数的LEB128编码 100
5.1.3有符号数的LEB128编码 101
5.2头部和段数据 101
5.2.1头部 101
5.2.2段类型列表 101
5.2.3段数据结构 102
5.3内存段和数据段 104
5.3.1内存段 104
5.3.2数据段 105
5.4表格段和元素段 106
5.4.1表格段 107
5.4.2元素段 108
5.5开始段和函数索引 108
5.5.1开始段 109
5.5.2函数索引 110
5.6全局段 111
5.6.1全局变量索引 111
5.6.2全局段编码方式 112
5.7函数段、代码段和类型段 113
5.7.1函数段、代码段和类型段之间的关系 113
5.7.2更简单的例子 114
5.7.3函数段 115
5.7.4类型段 116
5.7.5代码段 117
5.8导入段和导出段 118
5.8.1例子 118
5.8.2类型段 119
5.8.3导入段 119
5.8.4导出段 120
5.9自定义段 121
5.9.1自定义段结构 122
5.9.2模块的名字 122
5.9.3全局变量的名字 123
5.9.4函数的名字 124
5.9.5局部变量的名字 124
5.10补充说明 126
第6章 Emscripten和WebAssembly 127
6.1安装环境 127
6.1.1 emsdk命令安装 127
6.1.2 Docker环境安装 128
6.1.3验证emcc命令 129
6.2你好,Emscripten! 129
6.2.1生成wasm文件 130
6.2.2浏览器环境 130
6.2.3自动生成HTML测试文件 132
6.3 C/C++内联JavaScript代码 133
6.3.1 EM_ASM宏 133
6.3.2 EM_ASM_宏 134
6.3.3 EM_ASM_*宏 135
6.3.4函数参数 137
6.3.5注意问题 138
6.4 C/C++调用JavaScript函数 139
6.4.1 C语言版本的eval()函数 139
6.4.2打造带参数的eval()函数 141
6.4.3打造可变参数的eval()函数 143
6.4.4 eval()函数返回字符串 146
6.5 JavaScript调用C导出函数 149
6.5.1调用导出函数 149
6.5.2辅助函数ccall()和cwrap() 152
6.6运行时和消息循环 155
6.6.1 Emscripten运行时 155
6.6.2消息循环 158
6.7补充说明 162
第7章 Go语言和WebAssembly 163
7.1你好,Go语言 163
7.2浏览器中的Go语言 166
7.3使用JavaScript函数 168
7.4回调Go函数 170
7.5 syscall/js包 172
7.6 WebAssembly模块的导入函数 175
7.7 WebAssembly虚拟机 178
7.8补充说明 180
附录 指令参考 181