写点什么

WebAssembly 是什么?

  • 2019-08-16
  • 本文字数:1796 字

    阅读完需:约 6 分钟

WebAssembly是什么?

导语 相信不少人听说过 WebAssembly,它是由 Google、Microsoft、Mozilla、Apple 等几家大公司合作发起的一个关于面向 Web 的通用二进制和文本格式的项目。现在就让我们一步步揭开 WebAssembly 的神秘面纱,并亲自动手将 WebAssembly 应用在实际业务中。

WebAssembly(wasm)到底是什么

WebAssembly到底是何方神圣?来自官方的定义如下:



翻译成中文的话,WebAssembly(wasm)就是一个可移植、体积小、加载快并且兼容 Web 的全新格式。


实际上,WebAssembly 是一种新的字节码格式,旨在成为高级语言的编译目标,目前可以使用 C、C++、Rust、Go、Java、C#等编译器(未来还有更多)来创建 wasm 模块(见下图)。该模块以二进制的格式发送到浏览器,并在专有虚拟机上执行,与 JavaScript 虚拟机共享内存和线程等资源。



wasm 模块总是与 JavaScript“胶水”代码一起使用,在必要的时候可以执行一些有用的操作。WebAssembly 可以看做是对 JavaScript 的加强,弥补 JavaScript 在执行效率上的缺陷。


为什么要有 WebAssembly

自从 Brendan Eich 创造了 JavaScript 语言以来,一直都没有静态变量类型。由于 JavaScript 的动态变量,上一秒可能是 Array,下一秒就变成了 Object,那么引擎所做的优化就失去了作用,这也是导致运行效率降低的原因。


为了解决这个问题,WebAssembly 的前身,asm.js 诞生了。但是无论 asm.js 对静态类型的问题解决的再好,它始终逃不过要经过 Parser 和 ByteCode Compiler,这也是 JavaScript 代码在引擎执行过程中最耗时的两步。


因此在 2015 年,我们迎来了 WebAssembly。WebAssembly 是 C、C++、Rust、Go、Java、C#等语言的编译目标,经过编译器编译之后的二进制代码,无需经过 Parser 和 ByteCode Compiler 这两步,比 asm.js 更快。WebAssembly 强制使用静态类型,在语法上完全脱离 JavaScript,同时具有沙盒化的执行环境,安全性更好。


WebAssembly 的优势

让我们分别对比下 WebAssembly 版本和原生 JavaScript 版本的递归无优化的 Fibonacci 函数,下图是这两个函数在值为 45、48、50 时的性能对比:



显而易见 WebAssembly 几乎比 JavaScript 快一倍,这对于需要高计算量、对性能要求高的应用场景如图像/视频解码、图像处理、3D/WebVR/AR 等,优势非常明显。我们可以将现有的用 C、C++等语言编写的库直接编译成 WebAssembly 运行到浏览器上,并且可以作为库被 JavaScript 引用。那就意味着我们可以将很多后端的工作转移到前端,减轻服务器的压力,这是 WebAssembly 最为吸引人的特性。


让我们再用个动图直观感受下 WebAssembly 与 JavaScript 的运行速度,相比之下 WebAssembly 确实快很多。如果想自己跑跑看或是看源码的开发者,可以移驾 Guy Bedford 的 repo - Wasm Demo



除此之外,WebAssembly 还会引入 GC / DOM / Web API 等一系列特性,DOM 和 Web API 很重要,这意味着 WebAssembly 可直接和 html 以及浏览器进行交互,从技术角度来看可以完全取代 JavaScript。

WebAssembly 能取代 js 吗

自从有了 WebAssembly 以来,一直有一股声音说可以取代 JavaScript 了。他们的观点是传统的解释型语言在执行时免不了要进行词法分析 -> 语法分析 -> 预解析 -> 解释执行等过程,性能太差。但是现代浏览器的 JS 引擎在进化的过程中引入了许多优化手段如字节码缓存,可以省掉每次解释执行时重新遍历语法树的过程,虚拟机可直接取指 -> 解码 -> 运行。Chrome V8 的 JIT 在运行过程中直接生成并缓存机器码,下次执行时可由计算机直接执行,连解码的过程都省掉了。虽然 JavaScript 跟 C、C++等静态语言相比执行速度还有很大差距,但是大多数 Web 应用的性能瓶颈已经不是 JavaScript 语言本身了,反而是网络资源的加载,这一点 WebAssembly 并无优势。


而且,当要开发一个新的功能时,无论你是选择用 C、C++、Rust 还是 Java,开发成本都要比 JavaScript 高。遇到不兼容 WebAssembly 的浏览器(见下图),你还得考虑降级为用 JavaScript 实现,这无疑增加了业务复杂性。


写在最后

虽然 WebAssembly 还在持续不断地发展,但已经有不少开发者积极拥抱并把它应用于实际业务中,相信 WebAssembly 和 JavaScript 可以长期共存,充分发挥各自的优势一起大放光彩。

参考资料


2019-08-16 18:497773

评论

发布
暂无评论
发现更多内容

运维人少,如何批量管理上百个微服务、上千条流水线?

阿里巴巴云原生

阿里云 云原生 云效

59 人参会,探讨新年发展!龙蜥社区技术委员会、运营委员会会议圆满结束

OpenAnolis小助手

操作系统 国产操作系统 龙蜥社区

小程序开放平台:开启企业数字化新时代

FinFish

小程序管理平台 开放平台 小程序开放平台

ai制图软件有哪些?这5款自动生成绘画工具值得推荐!

彭宏豪95

人工智能 在线白板 办公软件 AIGC AI绘画

解决过期苹果App应用的方法

使用Selenium执行JavaScript脚本:探索Web自动化的新领域

霍格沃兹测试开发学社

Selenium Headless模式:无头浏览器的使用与优势

霍格沃兹测试开发学社

可观测性平台如何助推保险行业数智化转型与升级

博睿数据

运维人少,如何批量管理上百个微服务、上千条流水线?

阿里云云效

阿里云 云原生 云效

iPaaS平台能帮助企业解决什么问题?

RestCloud

数据集成 应用集成 ipaas

龙蜥社区第 22 次运营委员会圆满结束!

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

使用selenium轻松实现元素拖拽

霍格沃兹测试开发学社

产学研用全覆盖!信通院、中兴通讯、复旦大学等 12 家厂商共同成立龙蜥社区系统运维联盟(SOMA)

OpenAnolis小助手

操作系统 国产操作系统 龙蜥社区

Optimism Hackathon: 加速 AI 与 Blockchain Data 发展

Footprint Analytics

大数据 gamefi #人工智能

走进龙芯中科交流会圆满结束!深入探讨未来合作规划 | 理事长走进系列

OpenAnolis小助手

操作系统 国产操作系统 龙蜥社区

龙蜥社区第四届理事大会圆满召开!中兴、英特尔、浪潮成为副理事长单位!龙蜥高级顾问团成立!

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

使用Selenium模拟鼠标滚动操作的技巧

霍格沃兹测试开发学社

谈谈我对 AIGC 趋势下软件工程重塑的理解

阿里巴巴云原生

阿里云 云原生 AIGC

Lambda 表达式及线程安全最佳实践

伤感汤姆布利柏

GOPS全球运维大会2024深圳站亮点抢先看!

博睿数据

龙蜥系统运维联盟第二次会议圆满召开,深度探讨联盟发展方向

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

走进浪潮信息,深入探讨社区发展规划交流会圆满结束 | 理事长走进系列

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

详解CloudBees CI,助力Jenkins用户顺利迁移并构建高效CI/CD平台

龙智—DevSecOps解决方案

ci 持续集成 CD

龙蜥社区荣获 2023 年度龙芯“十佳基础软件合作伙伴”奖

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

走进 Intel,深度探讨合作发展规划交流会圆满结束 | 理事长走进系列

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

龙智亮相2024国际集成电路展览会暨研讨会(IIC Shanghai),分享芯片研发及管理解决方案与技术实践

龙智—DevSecOps解决方案

芯片研发

使用Docker快速搭建Web服务器Nginx

霍格沃兹测试开发学社

龙年新目标!龙蜥安全联盟第三次月会圆满结束

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

龙蜥操作系统荣登开放原子开源基金会“2023 生态开源项目”奖项榜单

OpenAnolis小助手

开源 操作系统 国产操作系统 龙蜥社区

WebAssembly是什么?_语言 & 开发_Paul_InfoQ精选文章