欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

WebAssembly入门:将字节码带入Web世界

来源:本站整理 作者:佚名 时间:2017-04-21 TAG: 我要投稿

WebAssembly(WA)是一种新兴技术,FortiGuard实验室在这篇文章里汇总了与之相关的一些常见问题。
一、何为WebAssembly
WebAssembly是针对Web设计的一种低级语言,这种可移植的二进制格式旨在提高Web应用的运行速度。这种语言的设计初衷是获得比JavaScript(JS)更快的解析速度(最高提高20倍)和执行速度。
二、WebAssembly的公布时间
WebAssembly社区小组于2015年4月成立,其使命是“为Web设计一种全新的、可移植的、能够高效加载及易于编辑的轻量级格式,以促进跨浏览器协作”。
三、从何处入手
首先你必须使用Binaryen设置Emscripten SDK,将C/C++代码或Rust代码转化为WA的“.wasm”二进制文件,或者使用与Lisp类似的S-表达式将代码转化为“.wast”(或“.wat”)文本格式,如图1所示。

图1. 从源代码到Web的处理过程
你可以从这个在线工具开始学习,快速查看代码片段。
在页面右侧的反汇编输出中,你可以看到头两行代码如下所示:
0000000: 0061 736d                                  ; WASM_BINARY_MAGIC
0000004: 0b00 0000                                  ; WASM_BINARY_VERSION
第一行与魔术数字“0x6d736100”有关,这个数字代表的是“\0asm”。第二行显示的是版本号,这里版本号为“0xb”。由于当前WA的版本号是0xd,因此这个在线工具生成的字节码不能用于当前版本的Web浏览器,不过这段代码还是值得一看的。当WebAssembly最终发布时,其版本号会被设定为0x1。
四、WebAssembly如何工作
目前WebAssembly需要通过JavaScript加载和编译。主要包括以下四个步骤:
1、加载wasm字节码。
2、将wasm字节码编译为模块。
3、实例化模块。
4、运行函数。
翻译过来就是:
fetch('your_code.wasm').then(response => response.arrayBuffer()
).then(bytes => WebAssembly.instantiate(bytes, {})
).then(instance => instance.exports.your_exported_function ()
从上述代码可知,“WebAssembly.instantiate”可以同时用于编译和实例化模块。
五、WebAssembly的使用场景
作为asm.js的下一代改进版,WebAssembly使用了JavaScript中一个非常受限的指令子集,该子集最适合作为C编译器的编译目标。WebAssembly不包含JavaScript对象,也不直接访问文档对象模型(Document Object Model,DOM)。从本质上来讲,WebAssembly只允许对类型数组进行算术运算和操作。
一些初步样例表明,使用wasm实现的斐波那契数生成算法比对应的JS实现性能上更优,有超过350%的性能提升。
目前,WebAssembly只是在简单模仿JS的功能,但人们计划扩展WebAssembly的使用场景,以处理JS中难以处理的事情,同时不增加语言的复杂度。比如,人们计划使WebAssembly默认支持SIMD(Single Instruction,Multiple Data,单指令流多数据流)、线程、共享内存等等功能。
许多流行视频游戏编辑器已经准备就绪,开始将WebAssembly技术与WebGL 2.0相结合,将部分3D功能引擎移植到这个全新平台上。你可以试一下Epic出品的Zen Garden,体验这种全新技术。
六、这是否就是JavaScript的末日
WebAssembly会促进JavaScript的发展,而不是导致其灭亡,它可以为Web中的关键功能带来语言上的多样性并提高性能。WebAssembly不单单给JS带来性能上的提升,同时也造福了Web浏览器。
可以预想的是,五年后,我们使用JS的方式将大大不同。目前,我们在很多场景中都难以使用JS代码完成任务,大部分功能都需要借助复杂库来实现。
由于WebAssembly的易用性和简单性,我们预测会有越来越多的代码从C++或Python转化为JS,甚至直接转化为WebAssembly。这意味着你不需要去学习一门全新的语言。JS虚拟机还是会存在,但对应工具会不断发展,以获取更优的性能。
七、WebAssembly与基于MS ActiveX/Adobe Flash/Orcale Java Applet/MS Silverlight/Google NaCl构建的富因特网应用之间有何区别
由于不同的公司各自推出了不同的标准,因此富因特网应用(Rich Internet Application, RIA)无法形成标准的开放格式。
比如,微软在自家的IE浏览器中推广ActiveX技术。该技术让开发者能够通过COM组件将打包功能重新集成到Web页面中。
Google推出了Native Client,让开发者将一些C/C++代码打包集成到浏览器中,然而,只有Chrome支持这项技术,达不到广义上的可移植要求。
几年前,Mozilla发布了asm.js,打开了性能优化的大门。他们最早提出了使用JS中的严格子集。通过限制语言的功能性,他们能够预测虚拟机的下一步反应,从而通过移除某些不必要的检查操作以提高性能。但这种技术也会影响语言的动态行为。
所有的这些技术构成了今天WA诞生的基础。WebAssembly运行在JS虚拟机内部,使用了JS的部分功能,这意味着它不仅能够与运行最新Web浏览器的设备兼容,也能做到向前兼容。为了实现这一点,设计人员正在开发一个polyfill,核心思想是将每个函数转换为语义上等效的JS代码,虽然这样做会影响运行性能,但至少能解决代码的运行问题。
八、WebAssembly长什么样
顾名思义,WebAssembly的最终形式是一种低级字节码,可以转换为汇编代码,但与通常的CPU汇编代码不同。
我们来看看“Hello world”这个例子(值得一提的是,虽然“Hello world”是大多数程序员相当熟悉的一个程序,但这个程序并不是特别适合这门语言,因为WA默认情况下没有集成打印功能,这也是为什么以下代码必须通过JS从标准库中导入该功能,然后传递所需的参数)。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载