WebAssembly原理与核心技术
上QQ阅读APP看书,第一时间看更新

前言

为何编写本书

万维网(World Wide Web,简称Web)问世至今,一直在不断完善,与Web相关的技术也一直在不停演进。每一次新技术的出现,都会让这张无形却又无处不在的网变得更加强大和易用,给人们的生活带来巨大的变化,甚至变革。

Web技术始于1990年前后,标志事件是当时在欧洲核子研究中心(CERN)工作的Tim Berners-Lee发明了超文本传输协议(Hypertext Transfer Protocol,HTTP)和超文本标记语言(Hypertext Markup Language,HTML)。时至今日,这两项技术仍然是Web的基石。最初发布时,这两项技术都比较简单,比如HTTP协议只支持GET请求,HTML语言只支持少量标签。另外,在那个年代,因为没有好用的图形用户界面浏览器,这两项技术的推行也不是很顺利。

第一款“好用”的浏览器发布于1993年,名叫Mosaic,由Marc Andreessen和Eric Bina等人合作开发。他们两人于1994年和Jim Clark等人联合创办了后来风光无限的网景(Netscape)公司,该公司推出的Navigator浏览器也曾红极一时,对Web技术的普及和发展起到了非常大的推动作用。随后,微软公司推出了著名的IE浏览器,引发了第一次浏览器大战,并最终赢得了胜利。战败的网景公司将Navigator浏览器代码开源,创建了Mozilla基金会。该基金会于2004年正式发布了Firefox浏览器。顺便说一下,苹果公司于2003年正式发布Safari浏览器;Google公司于2008年正式发布Chrome浏览器并在第二次浏览器大战中独占鳌头。

随着浏览器的快速普及,最初的HTML语言已经无法满足网页作者和用户的需求。当时的HTML只能通过标签展现某些固定的样式,比如标题格式、段落格式、文字高亮、简单的列表。而网页作者们想要更多的控制权,比如改变文本字体和颜色、段落背景颜色、文字对齐方式。1994年,当时还在CERN工作的Hkon Wium Lie发布了层叠样式表(Cascading Style Sheet,CSS)草案,试图改变这一局势。在吸收了Bert Bos等人的意见之后,CSS规范于1996年年底发布。CSS规范很快得到了微软IE、网景Navigator以及Opera等主流浏览器的支持。我们今天能看到各种赏心悦目的网页,CSS规范功不可没。

虽然有了CSS规范之后网页好看了很多,但仍然是静态的。Web急需一种脚本语言,让网页“活”起来。这次打头阵的是网景公司。1995年,网景发布了Navigator 2.0浏览器,支持由该公司Brendan Eich设计的JavaScript脚本语言。微软公司紧随其后,在1996年发布的IE 3.0浏览器中支持JScript脚本语言。为了推动浏览器脚本语言的标准化,网景公司在1996年年底将JavaScript语言提交给了欧洲计算机制造商协会(ECMA)。该协会于1997年6月发布了ECMAScript 1.0规范。有了JavaScript脚本执行能力,浏览器从单纯的内容展示工具升级成了应用运行平台,开启了全新的Web时代。

在JavaScript发展的过程中,还涌现出了很多技术,比如DHTML(1997年)、JSON(2000年)、Ajax(2005年)等,这里就不一一介绍了。随着这些技术的出现,JavaScript越来越强大,很多原来无法想象的应用都可以运行在浏览器上了。然而,新的问题开始显露出来:JavaScript的运行速度太慢了。

2008年,Google公司推出了Chrome浏览器,并在其内部搭载了全新设计的JavaScript引擎V8。通过使用JIT编译等优化技术,V8引擎的运行速度快了很多。在Chrome的压力下,其他浏览器厂商也纷纷改进技术,使得JavaScript运行速度慢的问题暂时得以缓解。同时,V8引擎还激发了Node.js技术的诞生,让JavaScript语言重新回到后端领域,这里就不详细介绍了。

如前所述,Web技术从未停止发展的脚步。随着移动互联网的兴起,HTML5应运而生(2008年公开草案,2014年正式发布)。2015年,WebAssembly(简称Wasm)技术首次亮相。Wasm技术旨在将汇编语言和Web融合,让浏览器能够以接近本地程序的速度运行网页应用程序。如今,Wasm规范已经正式发布(写作本书时,版本为1.1),并且获得了各大浏览器的普遍支持。虽然诞生于Web,但是从设计之初,Wasm就避免和浏览器绑定在一起,这使得它可以应用于更多地方。相信在不久的未来,Wasm技术一定会大有所为。

你是否已经迫不及待地想要了解Wasm技术?本书将带你领略Wasm技术的方方面面,为迎接即将到来的Web新时代做好准备!

本书主要内容

本书共14章,分为4个部分,内容安排如下。

●第一部分(概述)

•第1章:介绍Wasm技术并准备编程环境。

●第二部分(二进制和文本格式)

•第2章:介绍Wasm模块整体结构和二进制编码格式。

•第3章:介绍Wasm指令集和指令编码格式。

•第4章:介绍Wasm文本格式。

●第三部分(虚拟机和解释器)

•第5章:介绍Wasm操作数栈以及参数和数值指令。

•第6章:介绍Wasm内存和内存指令。

•第7章:介绍Wasm函数调用机制,以及直接函数调用指令和变量指令。

•第8章:介绍Wasm控制指令。

•第9章:介绍本地函数调用机制,以及Wasm表和间接函数调用指令。

•第10章:介绍Wasm导入和导出机制,以及链接和实例化逻辑。

•第11章:介绍Wasm各个语义阶段可能出现的错误,以及验证规则。

●第四部分(进阶)

•第12章:以Rust语言为例,介绍如何将高级语言编译为Wasm模块。

•第13章:介绍AOT编译技术,以及如何将Wasm模块编译为Go语言插件。

•第14章:介绍Wasm目前存在的一些不足之处,以及后续版本的改进方向。

本书读者对象

本书适合有一定编辑基础且对Web前沿技术或高级语言虚拟机技术感兴趣的读者。书中有少量Rust示例代码,都比较简单易懂,即使不了解Rust语言也不影响阅读。本书将使用Go语言实现Wasm解释器,但并没有用到特别高深的技术,加之Go语言语法比较简单,相信对于有C系列语言(比如C/C++/C#、Java、JavaScript等)基础的读者来说,书中的代码不难理解。总的来说,本书主要面向以下这几类读者。

·想要深入了解Wasm技术的Web前后端程序员。

·想要深入了解Wasm技术的区块链(尤其是智能合约平台)程序员。

·想要深入了解Wasm技术,并把它应用在其他领域的程序员。

·对高级语言虚拟机原理和实现感兴趣的读者。

·对解释器、AOT编译器原理和实现感兴趣的读者。

·想找中小型项目练手的Go语言初学者或者初、中级程序员。

·想阅读Wasm规范但觉得内容枯燥的读者。

如何阅读本书

本书延续了我“自己动手”系列丛书的风格,每章均配有精心安排的代码。本书将带领读者循序渐进地实现Wasm,每一章的代码都建立在前一章代码的基础之上,但又都可以单独编译和运行。建议读者从第1章开始,按顺序阅读本书,编写或修改每一章的代码。当然,直接跳到感兴趣的章节进行阅读,必要时再学习其他章节,也是可以的。本书的源代码可以从https://github.com/zxh0/wasmgo-book获取。

主要参考资料

Wasm是一种相对新的技术,但是网上已经有很多相关的资料和优秀的文章。下面列出一些主要的参考资料,供读者学习与参考。

●Wasm官网

https://webassembly.org/

●相关规范

•WebAssembly Core Specification[1]

•WebAssembly JavaScript Interface Specification[2]

•WebAssembly Web API Specification[3]

•asm.js Specification[4]

●相关论文

•Bringing the web up to speed with WebAssembly[5]

•Emscripten:An LLVM-to-JavaScript Compiler[6]

•JavaScript:The First 20 Years[7]

勘误和支持

由于技术水平和表达能力所限,本书并非尽善尽美,如有不合理之处,恳请读者批评指正。由于写作时间仓促,Wasm规范也在快速变化,书中难免会存在一些疏漏,还请读者谅解。

本书的勘误将通过GitHub(https://github.com/zxh0/wasmgo-book/blob/master/errata.md)发布和更新。如果读者发现书中的错误,对内容有改进建议,或者有任何问题,都可以在本书的GitHub项目上提交Issue。另外,欢迎大家加入本书读者微信群与我以及其他读者进行交流,微信群二维码将在本书GitHub项目主页不定期更新。

致谢

写书是一件耗时费力的事情,如果没有家人、同事和朋友的支持与帮助,这本书恐怕还要再过很长时间才能写完(或者永远都写不完)。这里我要感谢家人的理解,在写作期间,我有数不清的时间把自己关在小书房里,这些时间本应该用来陪伴家人。还要感谢同事和好友们的帮忙,感谢你们抽出时间阅读本书初稿并提出宝贵意见,虽然无法在此一一列出你们的名字,但你们是最棒的。特别感谢我的好朋友武岳抽空为本书绘制鼹鼠图,这些图很可爱,我很喜欢。最后要感谢机械工业出版社华章公司的编辑们,你们认真负责的工作保证了本书的质量,与你们合作非常愉快。

[1] 参考链接:https://webassembly.github.io/spec/core/bikeshed/index.html。

[2] 参考链接:https://webassembly.github.io/spec/js-api/index.html。

[3] 参考链接:https://webassembly.github.io/spec/web-api/index.html。

[4] 参考链接:http://asmjs.org/spec/latest/。

[5] 参考链接:https://dl.acm.org/doi/10.1145/3140587.3062363。

[6] 参考链接:https://github.com/kripken/Relooper/blob/master/paper.pdf。

[7] 参考链接:https://zenodo.org/record/3710954#.Xt0Eo54zbt0。