2018-于航-《深入浅出 WebAssembly》

参考地址:https://ngte.cowtransfer.com/s/0973a01be80b40

第 1 章 漫谈 WebAssembly 发展史…. 1

1.1 JavaScript 的发展和弊端…. 1

1.1.1 快速发展与基准测试…. 1 1.1.2 Web 新时代与不断挑战…. 8 1.1.3 无法跨越的“阻碍”…. 11 1.1.4 Chrome V8 引擎链路…. 17

1.2 曾经尝试——ASM.js 与 PNaCl. 28

1.2.1 失落的 ASM.js. 28 1.2.2 古老的 NaCl 与 PNaCl. 42

1.3 新的可能——WebAssembly.. 57

1.3.1 改变与颠覆…. 57 1.3.2 一路向前,WCG 与 WWG.. 85

第 2 章 WebAssembly 核心原理(基于 MVP 标准)…. 90

2.1 应用与标准 Web 接口…. 90

2.1.1 编译与初始化…. 90 2.1.2 验证模块…. 106 2.1.3 遇到错误…. 106 2.1.4 内存分配…. 108 2.1.5 表…. 112

2.2 深入设计模型——堆栈机…. 118

2.2.1 堆栈式虚拟机…. 119 2.2.2 逆波兰表达式…. 125 2.2.3 Shunting-yard 算法…. 126 2.2.4 标签与跳转…. 130 2.2.5 条件语句…. 135 2.2.6 子程序调用…. 137 2.2.7 变量…. 138 2.2.8 栈帧…. 139 2.2.9 堆…. 140

2.3 类型检查…. 141

2.3.1 数据指令类型…. 142 2.3.2 基本流程控制…. 144 2.3.3 基于表达式的控制流…. 149 2.3.4 类型堆栈的一致性…. 151 2.3.5 不可达代码…. 155

2.4 二进制编码…. 156

2.4.1 字节序——大端模式与小端模式…. 157 2.4.2 基于 LEB-128 的整数编码…. 161 2.4.3 基于 IEEE-754—2008 的浮点数编码…. 163 2.4.4 基于 UTF-8 的字符串编码…. 167 2.4.5 模块数据类型…. 168 2.4.6 虚拟指令与编码…. 169 2.4.7 类型构造符…. 174

2.5 模块…. 175

2.5.1 段…. 175 2.5.2 索引空间…. 185 2.5.3 二进制原型结构…. 186

2.6 内存结构…. 196

2.6.1 操作运算符…. 197 2.6.2 寻址…. 197 2.6.3 对齐…. 198 2.6.4 溢出与调整…. 203

第 3 章 动态链接与 SIMD(基于 MVP 标准)…. 204

3.1 动态链接(Dynamic Linking)…. 204

3.1.1 ELF.. 206 3.1.2 符号重定向(Symbol Relocation)…. 212 3.1.3 GOT(Global Offset Table,全局偏移表)…. 225 3.1.4 PLT(Procedure Lookup Table,过程查询表)…. 229 3.1.5 基于表的 Wasm 模块动态链接…. 233

3.2 单指令多数据流(SIMD)…. 237

3.2.1 SIMD 应用…. 239 3.2.2 并行与并发…. 243 3.2.3 费林分类法…. 244 3.2.4 SIMD.js & TC39.. 246 3.2.5 WebAssembly 上的 SIMD 扩展…. 248

第 4 章 深入 LLVM 与 WAT.. 250

4.1 LLVM——底层虚拟机…. 250

4.1.1 传统的编译器架构…. 251 4.1.2 LLVM 中间表示层…. 252 4.1.3 基于 LLVM 的编译器架构…. 254 4.1.4 LLVM 优化策略…. 256 4.1.5 LLVM 命令行工具…. 261 4.1.6 WebAssembly 与 LLVM… 268

4.2 基于 LLVM 定义新的编程语言…. 272

4.2.1 图灵完备与 DSL.. 276 4.2.2 简易词法分析器…. 280 4.2.3 RDP 与 OPP 算法…. 287 4.2.4 AST(抽象语法树)…. 295 4.2.5 简易语法分析器…. 296 4.2.6 生成 LLVM-IR 代码…. 303 4.2.7 链接优化器…. 307 4.2.8 编译到目标代码…. 308 4.2.9 整合 IO 交互层…. 312

4.3 WAT.. 315

4.3.1 S-表达式…. 317 4.3.2 WAT/Wasm 与 Binary-AST.. 318 4.3.3 其他与设计原则…. 320

第 5 章 Emscripten 基础应用…. 322

5.1 利器——Emscripten 工具链…. 322

5.1.1 Emscripten 发展历史…. 322 5.1.2 Emscripten 组成结构…. 324 5.1.3 Emscripten 下载、安装与配置…. 326 5.1.4 运行测试套件…. 330 5.1.5 编译到 ASM.js. 331

5.2 连接 C/C++与 WebAssembly.. 333

5.2.1 构建类型…. 334 5.2.2 Emscripten 运行时环境…. 342 5.2.3 在 JavaScript 代码中调用 C/C++函数…. 351 5.2.4 在 C/C++代码中调用 JavaScript 函数…. 363

第 6 章 基于 Emscripten 的语言关系绑定…. 382

6.1 基于 Embind 实现关系绑定…. 384

6.1.1 简单类…. 389 6.1.2 数组与对象类型…. 391 6.1.3 高级类元素…. 393 6.1.4 重载函数…. 407 6.1.5 枚举类型…. 408 6.1.6 基本类型…. 409 6.1.7 容器类型…. 411 6.1.8 转译 JavaScript 代码…. 413 6.1.9 内存视图…. 416

6.2 基于 WebIDL 实现关系绑定…. 417

6.2.1 指针、引用和值类型…. 420 6.2.2 类成员变量…. 422 6.2.3 常量“const”关键字…. 423 6.2.4 命名空间….. 424 6.2.5 运算符重载…. 425 6.2.6 枚举类型…. 426 6.2.7 接口类…. 429 6.2.8 原始指针、空指针与 void 指针…. 431 6.2.9 默认类型转换…. 434

第 7 章 探索 Emscripten 高级特性…. 437

7.1 加入优化流程…. 437

7.1.1 使用编译器代码优化策略…. 442 7.1.2 使用 GCC 压缩代码…. 444 7.1.3 使用 IndexedDB 缓存模块对象…. 446 7.1.4 其他优化参数…. 453

7.2 使用标准库与文件系统…. 454

7.2.1 使用基于 musl 和 libc++的标准库…. 455 7.2.2 虚拟文件系统结构…. 458 7.2.3 打包初始化文件…. 460 7.2.4 基本文件系统操作…. 461 7.2.5 懒加载…. 470 7.2.6 Fetch API. 474

7.3 处理浏览器事件…. 479

7.3.1 事件注册函数…. 480 7.3.2 事件回调函数…. 481 7.3.3 通用类型与返回值类型…. 482 7.3.4 常用事件…. 484

7.4 基于 EGL、OpenGL、SDL 和 OpenAL 的多媒体处理…. 487

7.4.1 使用 EGL 与 OpenGL 处理图形…. 488 7.4.2 使用 SDL 处理图形…. 494 7.4.3 使用 OpenAL 处理音频…. 497

7.5 调试 WebAssembly 应用…. 500

7.5.1 编译器的调试信息…. 500 7.5.2 使用调试模式…. 502 7.5.3 手动跟踪…. 503 7.5.4 其他常用编译器调试选项…. 505

第 8 章 WebAssembly 综合实践、发展与未来…. 506

8.1 DIP 综合实践应用…. 506

8.1.1 应用描述…. 506 8.1.2 滤镜与卷积…. 507 8.1.3 基本组件类型与架构…. 511 8.1.4 编写基本页面骨架(HTML 与 CSS)…. 512 8.1.5 编写核心卷积函数(C++)…. 513 8.1.6 编写主渲染循环与“胶水”代码(JavaScript)…. 515 8.1.7 使用 Emscripten 编译并运行应用…. 520 8.1.8 性能对比…. 521

8.2 WebAssembly 常用工具集…. 522

8.2.1 Cheerp.. 522 8.2.2 Webpack 4.. 524 8.2.3 Go 和 Rust 的 WebAssembly 实践…. 526 8.2.4 Binaryen.. 529 8.2.5 WasmFiddle. 530 8.2.6 Wabt. 531 8.2.7 AssemblyScript. 531

8.3 WebAssembly 未来草案…. 531

8.3.1 GC(垃圾回收)…. 532 8.3.2 Multi-Thread(多线程)与原子操作…. 532 8.3.3 异常处理…. 532 8.3.4 多返回值扩展…. 532 8.3.5 ES 模块…. 532 8.3.6 尾递归…. 533 8.3.7 BigInts 的双向支持…. 533 8.3.8 自定义注释语法…. 533

上一页