描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121352171
对于想进一步了解语言和浏览器引擎原理的开发者来说,这是一本非常好的进阶学习书籍。
WebAssembly带来多语言生态、超Android|iOS的原生性能,是穿透JavaScript*后障碍的银弹。
从原理入手,深入到渲染引擎、编译器,详细介绍各项特性,通过实例介绍WebAssembly开发调试。
第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 整合I/O 交互层 312
4.3 WAT 315
4.3.1 S-表达式 316
4.3.2 WAT/Wasm 与Binary-AST 318
4.3.3 其他与设计原则 320
第5 章 Emscripten 基础应用 321
5.1 利器——Emscripten 工具链 321
5.1.1 Emscripten 发展历史 321
5.1.2 Emscripten 组成结构 323
5.1.3 Emscripten 下载、安装与配置 325
5.1.4 运行测试套件 329
5.1.5 编译到ASM.js 330
5.2 连接C/C 与WebAssembly 332
5.2.1 构建类型 333
5.2.2 Emscripten 运行时环境 341
5.2.3 在JavaScript 代码中调用C/C 函数 350
5.2.4 在C/C 代码中调用JavaScript 函数 362
第6 章 基于Emscripten 的语言关系绑定 381
6.1 基于Embind 实现关系绑定 383
6.1.1 简单类 388
6.1.2 数组与对象类型 390
6.1.3 高级类元素 392
6.1.4 重载函数 406
6.1.5 枚举类型 407
6.1.6 基本类型 408
6.1.7 容器类型 410
6.1.8 转译JavaScript 代码 412
6.1.9 内存视图 415
6.2 基于WebIDL 实现关系绑定 416
6.2.1 指针、引用和值类型 419
6.2.2 类成员变量 421
6.2.3 常量“const”关键字 422
6.2.4 命名空间 423
6.2.5 运算符重载 424
6.2.6 枚举类型 425
6.2.7 接口类 428
6.2.8 原始指针、空指针与void 指针 430
6.2.9 默认类型转换 433
第7 章 探索Emscripten 高级特性 436
7.1 加入优化流程 436
7.1.1 使用编译器代码优化策略 441
7.1.2 使用GCC 压缩代码 443
7.1.3 使用IndexedDB 缓存模块对象 445
7.1.4 其他优化参数 452
7.2 使用标准库与文件系统 453
7.2.1 使用基于musl 和libc 的标准库 454
7.2.2 虚拟文件系统结构 457
7.2.3 打包初始化文件 459
7.2.4 基本文件系统操作 460
7.2.5 懒加载 469
7.2.6 Fetch API 473
7.3 处理浏览器事件 478
7.3.1 事件注册函数 479
7.3.2 事件回调函数 480
7.3.3 通用类型与返回值类型 481
7.3.4 常用事件 483
7.4 基于EGL、OpenGL、SDL 和OpenAL 的多媒体处理. 486
7.4.1 使用EGL 与OpenGL 处理图形 487
7.4.2 使用SDL 处理图形 493
7.4.3 使用OpenAL 处理音频 496
7.5 调试WebAssembly 应用 499
7.5.1 编译器的调试信息 499
7.5.2 使用调试模式 501
7.5.3 手动跟踪 502
7.5.4 其他常用编译器调试选项 504
第8 章 WebAssembly 综合实践、发展与未来 505
8.1 DIP 综合实践应用 505
8.1.1 应用描述 505
8.1.2 滤镜与卷积 506
8.1.3 基本组件类型与架构 510
8.1.4 编写基本页面骨架(HTML 与CSS) 511
8.1.5 编写核心卷积函数(C ) 512
8.1.6 编写主渲染循环与“胶水”代码(JavaScript) 514
8.1.7 使用Emscripten 编译并运行应用 519
8.1.8 性能对比 520
8.2 WebAssembly 常用工具集 521
8.2.1 Cheerp 521
8.2.2 Webpack 4 523
8.2.3 Go 和Rust 的WebAssembly 实践 525
8.2.4 Binaryen 528
8.2.5 WasmFiddle 529
8.2.6 Wabt 530
8.2.7 AssemblyScript 530
8.3 WebAssembly 未来草案 530
8.3.1 GC(垃圾回收) 531
8.3.2 Multi-Thread(多线程)与原子操作 531
8.3.3 异常处理 531
8.3.4 多返回值扩展 531
8.3.5 ES 模块 531
8.3.6 尾递归 532
8.3.7 BigInts 的双向支持 532
8.3.8 自定义注释语法 532
I’m very excited to see this book, which covers in great detail a wide range of topics regarding WebAssembly. At this point in time WebAssembly is around one year old – if we count from when it shipped in all major browsers – so it’s still fairly young, and the industry is just starting to figure out how revolutionary it is going to be. The potential is there for huge impact, and good documentation is necessary for that.
Why is WebAssembly’s potential impact so large? For several reasons:
? WebAssembly helps make the Web fast: WebAssembly is designed for small download size, fast startup, and predictably fast execution. The improvement compared to JavaScript can be very significant, over 2x in many cases, and especially in startup, where the speedup can be 10x.
? WebAssembly makes the Web competitive with native: WebAssembly is designed as a compiler target for multiple languages. That includes C and C , and in many areas of software the best implementations are in those languages, for example, game engines like Unity and Unreal, design software like AutoCAD, etc. It would take many years to write comparable products in JavaScript; instead, by compiling them to WebAssembly, the Web can be on par with native platforms today.
? WebAssembly also fills an industry need outside the Web: WebAssembly is fast, portable, sandboxed, has multiple excellent open source implementations, and just like the Web itself it is an industry standard expected to be supported for the long term. As a result, it’s not surprising that WebAssembly is starting to be used outside of browsers, for example in the blockchain and content delivery network (CDN) spaces.
Looking back, it’s remarkable that our industry has gotten to this point. Just a few years ago, there was no cross-browser collaboration on getting native code to run on the Web. Instead, there were multiple options, including Native Client, Adobe Alchemy, and ASM.js, each with its own advantages and disadvantages. I believe it was the momentum of ASM.js that got the industry to focus on fixing things: ASM.js started out in Firefox, and by virtue of being a subset of JavaScript it immediately ran in all browsers – just not as efficiently. That led top companies in the video game industry and elsewhere to adopt ASM.js, together with Emscripten, the open source compiler to JavaScript that I started in 2010, and which could emit ASM.js. That adoption led to ASM.js support in Edge and later Chrome, at which point there was consensus that the industry should produce a proper standard in this space, which turned into WebAssembly. As the spec was designed and implementations started to appear, we added WebAssembly support to Emscripten, which allowed people to compile to both ASM.js and WebAssembly by just flipping a switch, making it easy for people to use the new technology. Finally, as of May 2018 Emscripten emits WebAssembly by default, and today WebAssembly has robust and stable support both in all major browsers and in the toolchain projects that emit it.
It’s been a complicated path to get here, but the future looks bright. It is especially worth noting that WebAssembly is expected to add features like multithreading, SIMD, GC, and others, which will open up even more interesting opportunities.
Alon Zakai
Alon is a researcher at Mozilla, where he works on compile-to-Web technologies. Alon co-created WebAssembly and ASM.js, and created the Emscripten and Binaryen open source projects which are part of the primary WebAssembly compiler toolchain.
译文:
我很高兴能够看到这本书的出版,作者在书中详细地介绍了有关WebAssembly的各种主题。在这本书即将出版之际,WebAssembly差不多一岁了——如果从所有主流的Web浏览器开始支持WebAssembly算起,那么这项技术仍然相当年轻,业界也才刚刚开始意识到它将多么具有革命性。WebAssembly所拥有的潜力将会在未来对IT行业产生巨大的影响,但在此之前,我们需要有优秀的文档。
为什么WebAssembly的潜在影响力会如此之大?有以下几个原因。
? WebAssembly让Web应用运行更快。WebAssembly是一种新的格式,文件体积更小,启动速度更快,运行速度也更快。与使用JavaScript构建的Web应用相比,性能提升非常明显。在大部分情况下,运行速度提升两倍以上,特别是在启动速度方面,速度提升可以达到10倍。
? WebAssembly让Web应用能够与原生应用展开竞争。WebAssembly是多种编程语言的编译器目标,包括C和C 。基于这些编程语言实现的优秀软件,如游戏引擎Unity、Unreal,设计软件AutoCAD等,如果使用JavaScript开发在功能上与这些软件旗鼓相当的产品可能需要很多年时间。但如果将它们编译成WebAssembly,
——赵锦江,阿里巴巴高级前端技术专家(花名“勾股”,开源项目Vue.js团队的一员,曾任W3C HTML中文兴趣组联合主席)
作为一种面向未来的技术,WebAssembly很有可能是解决JavaScript痼疾的一颗“银色子弹”。作为一名JavaScript工程师,很有必要率先对WebAssembly进行深入了解。非常可惜的是,WebAssembly涉及过多的计算机系统相对底层的机制,没有系统学习过C 、编译原理等内容的JavaScript程序员会感到无从下手。本书很好地填补了这一空白,作者首先假设读者只具备*浅显的C 知识,由浅入深地带你走入WebAssembly的世界。在武侠小说的体系中,武功通常被分为“招式”和“内力”两种。招式可以让习武者快速拉开自己与普通人之间的差距,但是高手过招,看似不起眼的内力才是*重要的。如果你只擅长JavaScript一种招式并且内力不足,那么在阅读这本书的过程中会倍感吃力。如果坚持下来,*终自身的“内力”会得到显著增强,你将学到很多虽然对眼下工作并无帮助,但是会让你的编程人生收获颇多的知识。
——王泽,白鹭引擎首席架构师
本书从原理入手,深入到渲染引擎、编译器,详细介绍WebAssembly的各项特性,同时通过实例介绍如何使用WebAssembly进行开发调试。对于想进一步了解语言和浏览器引擎原理的开发者来说,这是一本非常好的进阶学习书籍。
——徐川,InfoQ中国主编
WebAssembly是一项很棒的技术。Web平台*次有了不弱于Android和iOS的原生性能,*次混入了多语言生态。它解决了Web平台的两个痛点:一个是性能;一个是单语言生态。而这些对于未来Web的发展都是具有深远影响的。因此,掌握WebAssembly技术,也是未来Web开发的一个趋势。但由于WebAssembly技术的复杂性,理解和掌握这项技术并不是一件容易的事情。这本书从WebAssembly的设计和原理出发,由浅入深,*后转入实践和应用,帮助Web开发人员充分理解WebAssembly的知识体系。它几乎涵盖了理解WebAssembly所需要的所有知识,是WebAssembly领域不可多得的好书。
——郭力恒,广发证券前端架构师(QCon讲师,曾在腾讯、迅雷等互联网公司担任资深前端开发工程师,负责多项产品的研发)
评论
还没有评论。