前言
为什么要写这本书
自从JavaScript(后面简称JS)脚本语言于1995年诞生以来,人们便一直在使用该语言以及HTML与CSS来编写和开发以浏览器为主的Web应用。近年来,随着JS的不断流行,以及Node.js的出现,JS也开始逐渐向除Web前端之外的其他领域发力,比如开发后端应用、机器学习应用乃至硬件编程等领域。但就JS本身而言,所不能无视的是它是一种弱类型语言,因此,相比于C/C++等强类型语言,尽管Chrome V8、SpiderMonkey等JS引擎已经通过诸如JIT等多种技术手段来优化JS脚本代码的整体执行效率,但引擎每一次版本优化的迭代速度(所花费的时间)却远远跟不上当今各类Web应用的复杂程度变化。因此,发明一种能够从根本上解决该问题的技术便显得迫在眉睫。
曾昙花一现的ASM.js、NaCl与PNaCl等技术都尝试以其各自的方式来优化Web应用的执行效率,但由于其所存在的诸如“浏览器兼容性不佳”以及“性能优化不彻底”等问题,导致它们最终并没有被广泛推广。而在2015年出现的WebAssembly(简称Wasm)技术,便是在吸取了前者经验教训的基础上而被设计和发明出来的。现在,我们可以看到该项技术所具有的潜力——W3C成立了专门的WWG工作组来负责Wasm技术的标准迭代与实现,四大主流浏览器(Google Chrome、FireFox、Edge和Safari)已经全部实现WebAssembly技术在其MVP标准中制定的所有特性,C/C++、Go和Rust等高级语言已经逐渐开始支持编译到Wasm格式。这一系列的发展和变化都说明了人们对该项技术所寄予的厚望。
如今世间百态,万物的发展速度越来越快,而前端技术领域也同样如此,正在转向技术融合的道路——从2000年专门指代PC网页技术的Web前端,到2010年左右包含有H5技术的前端,再到融合了移动端甚至部分后端技术的“大前端”。“前端”一词所指代的技术实体正变得越来越模糊,已经不单单是指我们所熟知的JS、HTML与CSS了,正如大学里生物学专业与化学专业两者融合后所形成的“生物化学专业”一样。技术本身并无好坏之分,只有能否适用于某些业务场景。而技术的融合则正好能够发挥各项技术本身所具备的优势,达到“1+1>2”的效果。WebAssembly技术便正是如此。
在写作本书的过程中,笔者曾与WWG的核心成员Alon、Ben和JF等专家进行了多次交流,以力求保证书中各个技术细节的正确性。但Wasm技术发展非常之快,比如Emscripten工具链每天都会有众多的“commit”被提交到主分支中,新版本的发布也是以“周”甚至“天”为单位进行的。因此,书中所述内容并不保证会在今后的半年甚至一年时间里都具有时效性。而对于相关内容的时效性变化,笔者也会在对应于本书的Github仓库(详见“勘误和支持”部分)中及时进行标注。作为国内第一本介绍WebAssembly的技术书籍,希望本书的内容能够为国内互联网基础技术的发展做出微小的贡献。虽然现阶段我们还无法完全地自主创新,或者参与到各项国际技术标准的制定过程中,但唯有紧跟其脚步,才能够伺机超越。
本书特色
作为市面上第一本深入介绍WebAssembly技术的相关书籍,笔者尝试由浅入深地来介绍与Wasm 技术相关的各种底层理论知识,以及相关编译器工具链的内部实现结构与使用方法。WebAssembly 技术从其第一版 MVP 标准诞生至今,时间过去并不久,但抽象的英文官方文档并不适合各类Web前端开发工程师直接进行阅读。从另一个方面来看,虽然我们可以在国内如“百度”等中文搜索引擎上找到部分与Wasm实践相关的介绍文章,但它们大都不会深入该技术标准的背后,探寻该技术的底层设计本质。因此,本书力求从一些简单的实践入手,深入理论,再到复杂的具有实际业务价值的综合实践,深入浅出地介绍Wasm技术发展至今,其背后所涉及的各种底层设计原理与实现、相关工具链以及未来发展方向等多方面内容。
由于WebAssembly并不是一种单方面的前端或后端技术,因此在本书中,我们将会随着内容的深入逐渐接触到除Web前端技术之外的诸如编译原理、V8引擎、LLVM以及Linux动态链接等多方面内容。笔者将会用最简单和直观的方式,由浅入深地介绍这些平日里可能很少接触到的技术与特性。
另外,作为市面上首本与WebAssembly相关的纯技术类书籍,笔者只能从自己所接触到的Wasm相关技术中,按照各个知识点的相关性与重要性来编排内容。相信读者在读完整本书后,一定会对Wasm技术背后的实现原理以及相关技术有进一步的理解。
读者对象
Web前端开发人员。
C/C++开发人员。
对WebAssembly技术感兴趣的人员。
本书内容
本书分为8章。
第1章:本书的开篇,主要介绍WebAssembly技术的发展历程,从PNaCl到ASM.js再到WebAssembly,以及这些技术的基本应用方法与性能对比。
第2章:介绍WebAssembly的标准上层API、底层堆栈机的设计原理,以及对MVP标准理论的深入解读。
第3章:介绍与WebAssembly标准相关的进阶内容,如单指令多数据流(SIMD)、动态链接技术等。
第4章:由浅入深地介绍LLVM工具链与WAT可读文本格式的相关内容。
第5章:从理论走向实践,从本章开始介绍基于Emscripten工具链开发WebAssembly应用的基本流程,以及工具链的一些基本常用功能和特性。
第6章:介绍基于Emscripten工具链实现的C/C++语言动态关系绑定技术。
第7章:从基础走向深入,继续介绍Emscripten工具链所提供的一些如WebGL支持、虚拟文件系统、应用优化以及事件系统等高级应用特性。
第8章:构建一个具有实际业务价值的WebAssembly应用,并介绍现阶段Wasm生态的发展情况,以及在Post-MVP标准中制订的一些WebAssembly未来发展规划。
勘误和支持
作为市面上首本介绍WebAssembly相关技术的书籍,本书在内容组织与编排上全部由笔者一人完成。由于笔者的知识水平有限,以及编写时间仓促,书中难免会出现一些错误或不准确的地方,恳请读者批评指正。如果你有更多的宝贵意见,欢迎在笔者的 Github 仓库“Book-DISO-WebAssembly”下创建“issue”,留下你的问题、意见或建议,笔者会在第一时间给予答复。
致谢
首先要感谢的是Emscripten工具链的作者Alon,在编写Emscripten实践部分时,通过邮件与他沟通了很多技术细节上的内容。Alon 是 Mozilla 的技术研究员,他主要负责维护和开发Emscripten与Binaryen两个重要的WebAssembly工具链。Alon平日工作繁忙,非常感谢他能够抽出时间为我指导技术,以及本书内容组织方面的事情,并为本书写了序言。
其次要感谢的是我的女朋友,工作本已十分繁忙,而写书路漫漫,这期间曾遇到过无数次难以下笔、不知所措的时刻,而她却总是能在关键时刻鼓励我陪我共渡难关。在写书的半年多时间里,基本上所有的双休日都是在家中或咖啡馆度过的,没有时间陪伴,希望能够和你一同见证本书出版的时刻。
还要感谢的是我的好友以及家人。早早地立下写书的誓言,正是因为有了你们每天的监督,我才能督促自己完成每天规定的任务,最终完成本书所有章节的编写。
最后要感谢的是本书的策划编辑张春雨,2017年上海QCon全球软件开发大会之后,他通过微信找到了作为讲师的我,并给予我这次写书的机会。但十分抱歉的是,由于我的日程和时间安排不当,导致本书的出版比预定时间晚了近三个月。但张老师并没有放弃我,这里真的要说一声:“感谢您对我的信任”。
关于源码
关于本书第3章、第4章和第5章中所涉及的相关源代码示例,读者可以在笔者Github账号(https://github.com/Becavalier)下的“Cinderella”和“Book-DISO-WebAssembly”仓库中找到完整的代码文件。其他章节中所涉及的部分源代码文件,也会被同时整理并放置到上面的“Book-DISO-WebAssembly”仓库中。
轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。
○提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
○交流互动:在页面下方 读者评论 处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/35217