【为何编写本书】
万维网(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获取。