Author:Unknown
No description
Tags
Support Statistics
¥.00 ·
0times
Text Preview (First 20 pages)
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
(This page has no text content)
Page
3
(This page has no text content)
Page
4
版权信息 书名:WebAssembly标准入门 作者:柴树杉,丁尔男 排版:红枫 出版社:人民邮电出版社 出版时间:2019-01-01 ISBN:9787115500595 — · 版权所有 侵权必究 · —
Page
5
内容提要 WebAssembly是一种新兴的网页虚拟机标准,它的设计目标包括 高可移植性、高安全性、高效率(包括载入效率和运行效率)、尽可 能小的程序体积。本书详尽介绍了WebAssembly程序在JavaScript环境下 的使用方法、WebAssembly汇编语言和二进制格式,给出了大量简单 易懂的示例,同时以C/C++和Go语言开发环境为例,介绍了如何使用 其他高级语言开发WebAssembly模块。 本书适合从事高性能Web前端开发、跨语言Web应用开发的技术 人员学习参考,也可以作为WebAssembly 标准参考手册随时查阅。
Page
6
序 某一天,有朋友向我推荐了一项新技术——WebAssembly。我认 为这是一项值得关注的技术。 说WebAssembly是一门编程语言,但它更像一个编译器。实际上 它是一个虚拟机,包含了一门低级汇编语言和对应的虚拟机体系结 构,而WebAssembly这个名字从字面理解就说明了一切——Web的汇编 语言。它的优点是文件小、加载快、执行效率非常高,可以实现更复 杂的逻辑。 其实,我觉得出现这样的技术并不令人意外,而只是顺应了潮 流,App的封闭系统必然会被新一代Web OS取代。但现有的Web开发 技术,如JavaScript,前端执行效率和解决各种复杂问题的能力还不 足,而WebAssembly的编译执行功能恰恰能弥补这些不足。 WebAssembly标准是在谋智(Mozilla)、谷歌(Google)、微软 (Microsoft)、苹果(Apple)等各大厂商的大力推进下诞生的,目前 包括Chrome、Firefox、Safari、Opera、Edge在内的大部分主流浏览器 均已支持WebAssembly。这使得WebAssembly前景非常好。 WebAssembly是Web前端技术,具有很强的可移植性,技术的潜在 受益者不局限于传统的前端开发人员,随着技术的推进,越来越多的 其他语言的开发者也将从中受益。如果开发者愿意,他们可以使用 C/C++、Go、Rust、Kotlin、C#等开发语言来写代码,然后编译为 WebAssembly,并在Web上执行,这是不是很酷?它能让我们很容易将
Page
7
用其他编程语言编写的程序移植到Web上,对于企业级应用和工业级 应用都是巨大利好。 WebAssembly的应用场景也相当丰富,如Google Earth,2017年10 月Google Earth开始在Firefox上运行,其中的关键就是使用了 WebAssembly;再如网页游戏,WebAssembly能让HTML5游戏引擎速度 大幅提高,国内一家公司使用WebAssembly后引擎效率提高了300%。 WebAssembly作为一种新兴的技术,为开发者提供了一种崭新的 思路和工作方式,未来是很有可能大放光彩的,不过目前其相关的资 料和社区还不够丰富,尽管已经有一些社区开始出现了相关技术文 章,CSDN上也有较多的文章,但像本书这样全面系统地介绍 WebAssembly技术的还不多,甚至没有。本书的两位作者都是有10多年 经验的一线开发者,他们从WebAssembly概念诞生之初就开始密切关 注该技术的发展,其中柴树杉是Emscripten(WebAssembly的技术前身 之一)的首批实践者,丁尔男是国内首批工程化使用WebAssembly的 开发者。 2018年7月,WebAssembly社区工作组发布了WebAssembly 1.0标 准。现在,我在第一时间就向国内开发者介绍和推荐本书,是希望开 发者能迅速地了解和学习新技术,探索新技术的价值。 蒋涛 CSDN创始人、总裁 极客帮创始合伙人
Page
8
本书结构 第0章回顾了WebAssembly的诞生背景。 第1章针对不熟悉JavaScript的读者,介绍本书将使用到的部分 JavaScript基础知识,包括console对象、箭头函数、Promise、 ArrayBuffer等。对JavaScript很熟悉的读者可以跳过本章。 第2章通过两个简单的小例子展示WebAssembly的基本用法。 第3章和第4章分别从外部和内部两个角度详细介绍WebAssembly, 前者着重于相关的JavaScript对象,后者着重于WebAssembly虚拟机的内 部运行机制。因为WebAssembly跨越了两种语言、两套运行时结构, 所以读者阅读第3章时可能会感到不明就里——为什么多数指令中没有 操作数?所谓的“栈式虚拟机”到底是什么?类似的疑问都将在第4章 中得到解答。在写作本书时,我们期望读者读完第4章后复读第3章 时,能有豁然开朗的感觉。 第5章介绍WebAssembly汇编的二进制格式。若想尝试自己实现 WebAssembly虚拟机或者其他语言到WebAssembly的编译器,掌握二进 制汇编格式是必需的。即使不开展类似的项目,通过阅读本章也可以 加深对WebAssembly虚拟机架构的整体认识,厘清各种全局索引的相 互关系。 第 6 章和第 7 章分别以 C/C++和 Go 语言为例,介绍如何使用高 级语言来开发WebAssembly应用。WebAssembly全手工编写.wat文件实 现大型模块的机会并不会很多。在实际工程中,WebAssembly作为一
Page
9
门类汇编语言,更多的是作为其他语言的编译目标而存在。目前 C/C++、Rust、Go、Lua、Kotlin、C#均已支持WebAssembly,可以预 见这一支持列表将越来越长。 附录列出了现有的200多条WebAssembly指令及其作用。
Page
10
致谢 感谢蒋涛先生为本书作序,感谢所有为WebAssembly标准诞生作 出努力的朋友。其中特别感谢Emscripten和asm.js的作者,没有他们的 灵感,WebAssembly标准就不可能诞生。感谢WebAssembly工作组的专 家,是他们的工作让我们看到了草案1.0的成果。感谢各大浏览器厂商 为WebAssembly提供的支持。最后,感谢人民邮电出版社的杨海玲编 辑,没有她,本书就不可能出版。谢谢大家!
Page
11
资源与支持 本书由异步社区出品,社区(https://www.epubit.com/)为您提供 相关资源和后续服务。 配套资源 本书提供书中的源代码,要获得以上配套资源,请在异步社区本 书页面中点击 ,跳转到下载界面,按提示进行操作即可。注 意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取 码进行验证。 提交勘误 作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在 疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。 当您发现错误时,请登录异步社区,按书名搜索,进入本书页 面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本 书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获 赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖 品。
Page
12
与我们联系 我们的联系邮箱是contact@epubit.com.cn。 如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮 件标题中注明本书书名,以便我们更高效地做出反馈。 如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技 术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异 步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission 即可)。 如果您是学校、培训机构或企业,想批量购买本书或异步社区出 版的其他图书,也可以发邮件给我们。 如果您在网上发现有针对异步社区出品图书的各种形式的盗版行 为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行 为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我 们持续为您提供有价值的内容的动力之源。
Page
13
关于异步社区和异步图书 “异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出 版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异 步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高 品质技术文章和视频课程。更多详情请访问异步社区官网 https://www.epubit.com。 “异步图书”是由异步社区编辑团队策划出版的精品IT专业图书 的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业 编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出 版领域包括软件开发、大数据、AI、测试、前端、网络技术等。 异步社区
Page
14
微信服务号
Page
15
第0章 WebAssembly诞生背景 一切可编译为WebAssembly的,终将被编译为WebAssembly。 ——Ending WebAssembly是一种新兴的网页虚拟机标准,它的设计目标包括: 高可移植性、高安全性、高效率(包括载入效率和运行效率)、尽可 能小的程序体积。 0.1 JavaScript简史 只有了解了过去才能理解现在,只有理解了现在才可能掌握未来 的发展趋势。JavaScript语言因为互联网而生,紧随着浏览器的出现 而问世。JavaScript语言是Brendan Eich为网景(Netscape)公司的 浏览器设计的脚本语言,据说前后只花了10天的时间就设计成型。为 了借当时的明星语言Java的东风,这门新语言被命名为JavaScript。 其实Java语言和JavaScript语言就像是雷锋和雷峰塔一样没有什么关 系。 JavaScript语言从诞生开始就是严肃程序员鄙视的对象:语言设 计垃圾、运行比蜗牛还慢、它只是给不懂编程的人用的玩具等。当然 出现这些观点也有一定的客观因素:JavaScript运行确实够慢,语言 也没有经过严谨的设计,甚至没有很多高级语言标配的块作用域特 性。
Page
16
但是到了2005年,Ajax(Asynchronous JavaScript and XML)方 法横空出世,JavaScript终于开始火爆。据说是Jesse James Garrett 发明了这个词汇。谷歌当时发布的Google Maps项目大量采用该方法标 志着Ajax开始流行。Ajax几乎成了新一代网站的标准做法,并且促成 了Web 2.0时代的来临。作为Ajax核心部分的JavaScript语言突然变得 异常重要。 然后是2008年,谷歌公司为Chrome浏览器而开发的V8即时编译器 引擎的诞生彻底改变了JavaScript低能儿的形象。V8引擎下的 JavaScript语言突然成了地球上最快的脚本语言!在很多场景下的性 能已经和C/C++程序在一个数量级(作为参考,JavaScript比Python要 快10~100倍或更多)。 JavaScript终于手握Ajax和V8两大神器,此后真的是飞速发展。 2009年,Ryan Dahl创建Node.js项目,JavaScript开始进军服务器领 域。2013年,Facebook公司发布React项目,2015年发布React Native 项目。目前JavaScript语言已经开始颠覆iOS和Android等手机应用的 开发。 回顾整个互联网技术的发展历程,可以发现在Web发展历程中出现 过各种各样的技术,例如,号称跨平台的Java Applet、仅支持IE浏览 器的ActiveX控件、曾经差点称霸浏览器的Flash等。但是,在所有的 脚本语言中只有JavaScript语言顽强地活了下来,而且有席卷整个软 件领域的趋势。 JavaScript语言被历史选中并不完全是偶然的,偶然之中也有着 必然的因素。它的优点同样不可替代。 简单易用,不用专门学习就可以使用。 运行系统极其稳定,想写出一个让JavaScript崩溃的程序真是一 个挑战。 紧抱HTML标准,站在Ajax、WebSocket、WebGL、WebWorker、 SIMD.js等前沿技术的肩膀之上。 因为Web是一个开放的生态,所以如果一个技术太严谨注定就不会 流行,XHTML就是一个活生生的反面教材。超强容错是所有Web技术流 行的一个必备条件。JavaScript刚好足够简单和稳定、有着超强的容 错能力、语言本身也有着极强的表达力。同时,Ajax、WebSocket、
Page
17
WebGL、WebWorker等标准的诞生也为JavaScript提供了更广阔的应用 领域。 0.2 asm.js的尝试 JavaScript是弱类型语言,由于其变量类型不固定,使用变量前 需要先判断其类型,这样无疑增加了运算的复杂度,降低了执行效 能。谋智公司的工程师创建了Emscripten项目,尝试通过LLVM工具链 将C/C++语言编写的程序转译为JavaScript代码,在此过程中创建了 JavaScript子集asm.js,asm.js仅包含可以预判变量类型的数值运 算,有效地避免了JavaScript弱类型变量语法带来的执行效能低下的 问题。根据测试,针对asm.js优化的引擎执行速度和C/C++原生应用在 一个数量级。 图0-1给出了ams.js优化的处理流程,其中上一条分支是经过高度 优化的执行分支。 图0-1 因为增加了类型信息,所以asm.js代码采用定制优化的 AOT(Ahead Of Time)编译器,生成机器指令执行。如果中途发现语 法错误或违反类型标记的情况出现,则回退到传统的JavaScript引擎 解析执行。
Page
18
asm.js中只有有符号整数、无符号整数和浮点数这几种类型。图 0-2展示了asm.js中几种数值类型之间的关系。 图0-2 而字符串等其他类型则必须在TypedArray中提供,同时通过类似指 针的技术访问TypedArray中的字符串数据。 asm.js的高明之处就是通过JavaScript已有的语法和语义为变量 增加了类型信息: var x = 9527; var i = a | 0; // int32 var u = a >>> 0; // uint32 var f = +a; // float64 以上代码中a|0表示一个整数,而a >>> 0表示一个无符号整数,+a 表示一个浮点数。即使不支持asm.js的引擎也可以产生正确的结果。 然后通过ArrayBuffer来模拟真正的内存:
Page
19
var buffer = new ArrayBuffer(1024*1024*8); var HEAP8 = new Int8Array(buffer); 基于HEAP8模拟的内存,就可以采用类似C语言风格计算的字符串 长度。而C语言的工作模型和冯·诺伊曼计算机体系结构是高度适配 的,这也是C语言应用具有较高性能的原因。下面是asm.js实现的 strlen函数: function strlen(s) { var p = s|0; while(HEAP8[p]|0 != 0) { p = (p+1)|0 } return (p-s)|0; } 所有的asm.js代码将被组织到一个模块中: function MyasmModule(stdlib, foreign, heap) { "use asm"; var HEAP8 = new Int8Array(heap); function strlen(s) { // ... } return { strlen: strlen, }; } asm.js模块通过stdlib提供了基本的标准库,通过foreign可以传 入外部定义的函数,通过heap为模块配置堆内存。最后,模块可以将 asm.js实现的函数或变量导出。模块开头通过"use asm"标注内部是 asm.js规格的实现,即使是旧的引擎也可以正确运行。 asm.js优越的性能让浏览器能够运行很多C/C++开发的3D游戏。同 时,Lua、SQLite等C/C++开发的软件被大量编译为纯JavaScript代 码,极大地丰富了JavaScript社区的生态。asm.js诸多技术细节我们 就不详细展开了,感兴趣的读者可以参考它的规范文档。 0.3 WebAssembly的救赎
Page
20
在整个Web技术变革的过程之中,不断有技术人员尝试在浏览器中 直接运行C/C++程序。自1995年起包括Netscape Plugin API(NPAPI) 在内的许多知名项目相继开发。微软公司的IE浏览器甚至可以直接嵌 入运行本地代码的ActiveX控件。同样,谷歌公司在2010年也开发了一 项Native Clients技术(简称NaCL)。然而这些技术都太过复杂、容 错性也不够强大,它们最终都未能成为行业标准。 除尝试直接运行本地代码这条路之外,也有技术人员开始另辟蹊 径,将其他语言直接转译为JavaScript后运行,2006年,谷歌公司推 出Google Web Toolkit(GWT)项目,提供将Java转译成JavaScript的 功能,开创了将其他语言转为JavaScript的先河。之后的 CoffeeScript、Dart、TypeScript等语言都是以输出JavaScript程序 为最终目标。 在众多为JavaScript提速的技术中,Emscripten是与众不同的一 个。它利用LLVM编译器前端编译C/C++代码,生成LLVM特有的跨平台中 间语言代码,最终再将LLVM跨平台中间语言代码转译为JavaScript的 asm.js子集。这带来的直接结果就是,C/C++程序经过编译后不仅可在 旧的JavaScript引擎上正确运行,同时也可以被优化为机器码之后高 速运行。 2015年6月谋智公司在asm.js的基础上发布了WebAssembly项目, 随后谷歌、微软、苹果等各大主流的浏览器厂商均大力支持。 WebAssembly不仅拥有比asm.js更高的执行效能,而且由于使用了二进 制编码等一系列技术,WebAssembly编写的模块体积更小且解析速度更 快。目前不仅C/C++语言编写的程序可以编译为WebAssembly模块,而 且Go、Kotlin、Rust等新兴的编程语言都开始对WebAssembly提供支 持。2018年7月,WebAssembly 1.0标准正式发布,这必将开辟Web开发 的新纪元!
Comments 0
Loading comments...
Reply to Comment
Edit Comment