WebAssembly标准入门 (Unknown) (z-library.sk, 1lib.sk, z-lib.sk)
Author: Unknown
代码
No Description
📄 File Format:
PDF
💾 File Size:
2.2 MB
8
Views
0
Downloads
0.00
Total Donations
📄 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开发 的新纪元!
The above is a preview of the first 20 pages. Register to read the complete e-book.
Recommended for You
Loading recommended books...
Failed to load, please try again later