WebAssembly简介:Web应用程序中本机代码的魔力

现代Web开发的世界是令人兴奋的发现:每年都会出现新技术,有望改变我们构建Web项目的方式。数十年来,JavaScript一直是Web交互的中坚力量,将Web开发从 “构建页面并使页面漂亮” 变为 “让用户说“哇!””。现在,出现了一个新的挑战者-WebAssembly(简称为“ Wasm”)。

尽管许多Web开发人员对JavaScript 及其生态系统都非常满意 ,但是相当多的同行经常批评JavaScript的缺点。多年来,开发人员社区为解决这些问题进行了许多尝试-像React,Angular和Vue这样的框架确实改善了JavaScript工作流程及其功能。

但是,WebAssembly可能具有重塑整个Web开发前景的潜力-就像1995年首次引入JavaScript一样。在本文中,我们将探讨WebAssembly是什么,为什么具有突破性以及如何使用。

什么是WebAssembly?

WebAssembly以上关于重塑整个Web开发潜力的句子是一个严肃的主张,因此您的眉毛可能会怀疑地抬起头来。像所有尖端技术一样,WebAssembly通常会在Web开发人员之间引起混乱。为了更好地定义该术语,我们首先要解决WebAssembly实际上不是什么:

  • WebAssembly不是一种编程语言。
  • WebAssembly不仅是 “ Web中的C ”。
  • WebAssembly本身并不是Web技术,即使它被称为 Web Assembly。

顺便说一句,让我们定义一下这个术语: WebAssembly是基于堆栈的虚拟机的二进制指令格式。 这个定义虽然简短,但仍可为我们提供一些关键点:

  • 它是一台 虚拟机 -一种处理器,其目的是在考虑可移植性的情况下将代码编译为实际的体系结构。
  • 二进制 指令通过两个符号的系统表示。
WebAssembly简介:Web应用程序中本机代码的魔力

WebAssembly架构

随着Web开发的进展,对这种技术的需求成比例增长:越来越多的Web开发人员需要一种可以完成工作的工具,同时还要满足许多要求:

  1. 快速: 比JavaScript更快,并且(理想情况下)与本地代码相当。
  2. 安全: 不得引入新漏洞。
  3. 跨平台: 在各种台式机和移动操作系统上的性能均相同。
  4. 零配置: 可以正常工作。
  5. 开发就绪 (即提供/支持开发和调试工具)。

尽管有很多技术试图赢得这场比赛,但所有这些技术都失败了-除了JavaScript。一些参赛者包括ActiveX,Flash,Google的Native Client和asm.js,但是由于WebAssembly是本文的重点,因此您可以得出结论,他们并没有达到期望。

为什么WebAssembly这么重要?

编程语言虽然功能强大,但其真正潜力在于其生态系统。JavaScript是该论点的一个引人注目的例子:由于使用了npm之类的强大工具,它设法超越了“只是另一种编程语言”的地位。

但是,即使npm有时也无法提供您想要的答案。假设您正在寻找可以解决问题的库,但是您只会找到用JavaScript以外的语言编写的库。在使用WebAssembly之前,您将不得不自己将该库移植到JavaScript上-现在,您可以将其直接用于几乎相同的功能。

我们已经确定WebAssembly承诺跨平台(甚至包括浏览器)的统一二进制格式。可以说,这是该技术最令人兴奋的新颖之处,类似于浏览器即应用程序范式的出现。

Wasm的发展重点之一是垃圾收集支持。引入该功能并提供对Web API的本机支持后,开发人员最终将能够使用JavaScript以外的其他语言来创建Web应用程序-C,C ,Go,Rust,Java,Python …谁知道,甚至如果PHP实现了完整的功能,类型系统!

WebAssembly还提供可预测的性能-减少浏览器性能差异的能力。

WebAssembly与JavaScript

尽管开发人员社区通常心胸开阔,但有时很难抗拒再开始“ 我最喜欢的技术比您喜欢的技术更好!” 辩论。JavaScript和WebAssembly也不例外,因此一些Web开发人员试图使这些技术看起来像是对立的力量。这是一个重要的要点: JS和WASM之间的关系是共生的,而不是对抗的。

在许多情况下,WebAssembly可以解决JavaScript的缺点:一个示例是将JavaScript用作编译目标(例如,通过asm.js)。显然,这是一个坏主意,因为与解析和编译JavaScript有关的资源成本。但是,WebAssembly在这种情况下的性能要好得多-它的二进制格式速度可以加快启动和执行的速度。

通常,WebAssembly代码与JavaScript代码相比要轻一些,而它们始终具有相同的功能。另一方面,WebAssembly模块通常比较重,并且与JavaScript模块相比,更难拆分。

仅通过性能数字来比较这些技术是很诱人的,因此这是另一个有趣的发现: JavaScript和WebAssembly具有相同的峰值性能。 但是,仅仅因为性能提升(如果有)而选择一种技术是另一种技术是短视的-还有很多其他因素在起作用。

但是,尼克·菲茨杰拉德(Nick Fitzgerald)在他最近的研究中使用Rust和WebAssembly氧化源地图概述了一个警告 :与JavaScript相比,WebAssembly提供的性能更加可预测,因为JavaScript可能会受到反优化的影响,该过程迫使JavaScript执行流向退回口译员。

WebAssembly与JavaScript基准测试

可以通过以下方式实现图像旋转功能来证明这种奇怪现象 canvas:让用户旋转4K图像并在不同的浏览器下对其进行测试。以下是Google Chrome实验室的发现:

  • 浏览器1花费了400毫秒来旋转图像。
  • 浏览器2花费了500毫秒。
  • 浏览器3耗时2.5秒。
  • 浏览器4用了8秒。

看看这些数据,很容易得出这样的结论: “啊哈,浏览器4是不良工程的一个很好的例子!” 但是,我们需要记住,不同的浏览器进行了不同的优化,因此浏览器4不是Netscape Navigator v0。 7-它只是一个功能强大的浏览器。在其他情况下,也许浏览器1是最慢的浏览器。

如下图所示,另一方面,在WebAssembly中重写此代码已帮助这些浏览器获得大致相同的性能,最重要的是,它们的性能变得可预测-任何开发团队都会对此表示赞赏。我们还可以看到JavaScript和WebAssembly的最高性能确实是相等的。

WebAssembly简介:Web应用程序中本机代码的魔力

使用语言的速度

我们还应该注意,JavaScript和WebAssembly在性能上的等同性将来可能会消失:WebAssembly将很快获得对线程和simd(单个指令,多个数据的支持 ,这将使其胜过JavaScript)。

WebAssembly的缺点和警告

WebAssembly简介:Web应用程序中本机代码的魔力

当然,WebAssembly不是灵丹妙药,它的缺点之一与手动内存管理有关:但是,等等,这在许多语言中都是完全正常的功能!因此,它本身并不一定是缺点 。但是,对于某些JavaScript开发人员而言,当他们开始自己管理内存资源时,这可能是整个范例的转变。

另一个警告:WebAssembly代码在浏览器中被沙箱化,这意味着其功能仅限于JavaScript级别。尽管如此,我们仍可以使用某些浏览器来模仿本地应用程序的功能。这是C 功能过渡到WebAssembly和JavaScript的方式:

  • 文件系统→Cookie,LocalStorage,IndexedDB。
  • 网络→XHR,提取,WebSocket。
  • 随机→Math.random()。
  • 异步→轮询 setTimeout()。
  • 3D→画布,WebGL。

WebAssembly学习资源

在本文的这一点上,WebAssembly终于发挥了魔力,您渴望开始学习它。这就是要注意的问题:您本身并不学习WebAssembly;相反,您将学习一种可以编译为该语言的语言。Rust就是一个很好的例子,它还具有出色的入门 资源。

为了快速入门,您可以使用WasmFiddle- 顾名思义,它是一个代码游乐场,它使您可以在不使用 防护服的情况下试验WebAssembly。

结论

WebAssembly有望在我们开发Web应用程序的方式中引入模式转变。在Google和Mozilla等网络巨头的支持下,它的未来看起来更加光明。

  1. 减少 加载时间。
  2. 提高 执行/计算速度。
  3. 在网络应用中使用 C / C 代码。

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/13920.html

发表评论

登录后才能评论