立即领取|华润集团、宁德核电、东风岚图等 20+ 标杆企业数字化人才培养实践案例 了解详情
写点什么

多领域试水,WebAssembly 距离大规模应用还有多远?

  • 2022-07-12
  • 本文字数:5494 字

    阅读完需:约 18 分钟

多领域试水,WebAssembly 距离大规模应用还有多远?

采访嘉宾 | 于航

编辑 | 闫园园

 

2021 年 6 月 21 日,Scott Logic 发布了 2021 年 WebAssembly (以下简称 Wasm)用户报告。报告中显示 69% 的受访者认为 Wasm 将对未来的 Web 开发产生非常大的影响,同时受访者还预计 Wasm 将会对不同应用领域产生重要影响。



不难看出,作为一项相对年轻的技术,Wasm 本身还是吸引了不少眼球。但另一方面,也有开发者注意到,虽然 Wasm 目前在多个领域都有相应的落地实践,但距离大规模应用还是有一定差距。甚至,还有部分开发者提出 “ Wasm 的声音在这两年渐渐弱了”,那么究竟这门技术的现状如何?今年 Wasm 2.0 草案的发布是否会对其发展有所推动?展望未来 Wasm 的前景又是怎样?带着这些问题,InfoQ 采访了 PayPal Staff Engineer 、《 深入浅出 WebAssembly 》的作者于航。

快速发展中的 Wasm

 

在开始探讨 Wasm 现状之前,我们先来回顾下它的历史。

 

众所周知,当年 Brendan Eich 大神只用了 10 天时间便发明出了 JavaScript ,随后这门语言便一路蹿红,并且一直到现在 JavaScript 仍是互联网技术领域里最流行的编程语言之一。不过,即便如此,这门语言还是存在其自身的短板,其中,变量的动态类型就经常被大家诟病,虽然这也是它简单易用的原因之一,但相较于静态类型语言而言,这一点确实会带来额外的运行时性能开销。

 

因此,为了提升 Web 应用的性能,Wasm 应运而生,2015 年 Mozilla 在 asm.js 的基础上发布了 Wasm。不过,Wasm 的出现绝不是要成为一门新的编程语言,正如其官方定义提到,WebAssembly(缩写为 Wasm)是一种基于堆栈式虚拟机的二进制指令集。Wasm 被设计成为一种编程语言的可移植编译目标,并且可以通过将其部署在各类环境中(浏览器、k8s 等),以便为客户端及服务端应用程序提供服务。

 

  • 新的指令格式:本质上是一种虚拟 ISA,它基于堆栈式虚拟机的执行方式设计。同样的一段指令可以在二进制与文本两种格式之间互相转换。其中,文本格式被存放在以 .wat 结尾的文件中,其内部以 “S-表达式” 的形式组织各指令之间的具体执行顺序。二进制格式被存放在以 .wasm 结尾的文件中,该文件可以直接被浏览器、虚拟机等 Wasm 引擎解析和使用;

  • 可移植编译目标:由于 Wasm 指令被设计为在虚拟机上执行,因此无论操作系统和其所在的具体硬件指令集架构如何,它都可以在各种设备上运行。并且,作为编译目标,人们通常首先使用高级静态语言来编写相应的功能逻辑,然后再经由 Emscripten 等编译器来将这些高级语言源代码编译为对应的 Wasm 指令代码。


以上就是 Wasm 的诞生以及它的定义,“当下 Wasm 仍然处在快速发展的过程当中,截至其目前发展历史来看,其中有两个年份是比较关键的”,于航总结道:

 

第一个关键年份是 2017 年。2017 年 2 月,四大浏览器(Firefox、Chrome、Edge 和 Webkit)在 Wasm MVP(最小可用版本) 标准的设计上达成共识,“这是一个很好的现象,说明大家对 Wasm 这项技术的潜在价值是认可的”;2017 年 8 月,WebAssembly Working Group(以下简称 WWG) 成立,Wasm 正式成为 W3C 众多技术标准中的一员;2017 年末,Mozilla 宣布四大浏览器(引擎)完全支持 Wasm MVP 版本的特性。可以看到,2017 年 Wasm 发展很快,“这时候,大家看到了一种趋势,就是 Wasm 可能会对目前的 Web 技术格局产生影响”。

 

第二个关键年份是 2019 年。2019 年 3 月,Docker 创始人 Solomon Hykes 在 Twitter 上说了一段话,大概意思为“如果 WASM 和 WASI 早在 2008 年就存在,那么我们就不需要创建 Docker”。此话一出,在社区产生了非常大的反响,“这一次,Wasm 的潜在价值从 Web 逐渐开始向 out-of-web 的其他领域,比如云原生、AI 以及区块链等领域开始传播”;2019 年 12 月,W3C 宣布 Wasm 成为第 4 种 Web 语言,同时 Wasm 1.0 标准正式落地;也是在这一年,由个人和公司组成的团体——字节码联盟(Bytecode Alliance)也宣告成立,联盟旨在通过协作的方式,来共同实现 Wasm 及 WASI 相关标准,并通过提出新标准的方式来共同打造 Wasm 在浏览器之外的未来。“我们常见的一些 Wasm 虚拟机,比如 Wasmtime、Lucet 等也都是由他们负责设计和研发的。”

 

总结来看,在这两个关键年份集中发生了一些意义重大的事情,对这门技术的发展起到了重要的推动作用。

 

到了 2020 年和 2021 年,Wasm 本身标准方面并没有出现比较大的动作,或许也是由于此,导致部分开发者认为“ Wasm 渐渐没了声音”。不过,据于航介绍,其实在 2020 年和 2021 年 ,Wasm 本身也是在不断完善和发展中的:

 

在 Wasm 1.0 标准基础上,各类围绕 Wasm 的基础工具不断涌现,浏览器和基础设施加快了 Wasm 标准的实现速度。“这里有个改变值得关注,开发者的聚焦点开始逐渐从标准本身移向了 Wasm 在工业界的实践和应用。”

 

另外,WWG 也在不断推进 Wasm 2.0 相关特性的设计和落地,在此过程中,官方研究人员开始更多地去思考这门技术和开发者之间的关系。例如,对于开发者来说,Wasm 最初的官方文档比较晦涩难读,意识到这个问题之后,WWG 进行了相关调整和优化。“可以看出,Wasm 官方也逐步开始从关注技术本身转而去关注它的推广和应用。”

 

最后到了今年,Wasm 2.0 草案正式发布,包括很多处于 Phase 3 的提案也正在被实现。总体而言,最近这几年并没有像前几年一样,有看似特别重要的节点,但就一门新技术来说,它自身的发展仍然是在持续有序地进行的。“各类浏览器厂商也正以超预期的速度去整合那些试验性的 Wasm 特性,从中大家也可以看到它们在这门技术上的赌注”。

 

Wasm 应用现状:多点试水

 

回顾这门技术的整体发展脉络,与 Java、C++ 等历经几十年磨砺的技术相比,Wasm 还是比较年轻的,不过,这门技术本身受关注度颇高,也从侧面反映出它还是具有潜力的。目前,也已在多个领域有相应的落地,本次采访中,于航按照类别为大家进行了盘点:

 

  • 多媒体方面。由于在多媒体中包含的图像编解码等过程大都需要大量数学运算,因此像视频解码 ogv.js、Photon 引擎等开源库和应用都在其设计实现中使用了 Wasm 来加速 Web 上媒体资源软解码的速度:通过配合 Wasm 虚拟机本身的高性能,再结合多线程以及 SIMD 等技术,解码速度相较之前单纯使用 JavaScript 有着巨大的提升;除此之外,借助 Wasm 这样一种中间格式,以往用 C/C++ 编写的众多算法编解码库也都可以相对简单地被用在 Web 应用中。“多媒体可以说是目前凸显 Wasm 在 Web 平台上价值的最为重要的一类应用。”

  • 编程语言方面。自 Wasm 出现后,诸多新兴编程语言在设计之初就将它作为编译目标,比如 Walt、Grain 等。

  • Web 框架领域方面。众多基于 Wasm 的试验性框架出现,比如可以使用 Rust 构建前端应用的框架 Yew 和 Seed;可以使用 Go 构建前端应用的框架 Vecty 等等。“虽然这些框架处在不断发展中,但受限于目前 Wasm 字节码中还无法直接操作 DOM 这一问题,所以,它们的可用性还有待观察。”于航补充道。

  • 与仿真器相关的一系列应用方面,如 WasmBoy、Pinky 等等。这类应用主要依赖于 Wasm 的高性能,可以使得仿真器以较高的效率来在 Web 上模拟对应平台 ISA 指令的执行。

 

除了在浏览器内部的应用之外,Wasm 在浏览器之外的应用场景也很多:

 

  • 云原生领域,有 Krustlet、Embly、Kubeless 等。其中,Krustlet 使得 Kubernetes 可以支持调度 Wasm 类型的 Kubelet;Embly 和 Kubeless 则是两个基于 Wasm 的 Serverless 框架。

  • 游戏引擎领域,大家非常熟悉的 Unity 和 Unreal Engine 尝试用 Wasm 技术将大型 3D 游戏移植到 Web 端。同时,Ammo.js、Defold 等一些基于 Wasm 构建的新兴游戏开发引擎也陆续出现。

 

不仅在上述“热点”领域,Wasm 还在物联网、操作系统、AI、密码学等领域均有相应的落地实践,同时作为技术设施的编译器和虚拟机应用也比较常见。不过于航也表示,这些领域的实践更多是一种“有限”实践,换句话说,本质上还没有为该领域做出突出贡献。

 

所以,目前来看 Wasm 应用试水的领域还是很广泛的,但距离大规模的应用还有一定的距离,那么是否是这门技术本身存在一定的局限性呢?对此,于航认为眼下的应用现状与技术本身其实并无直接关系,具体原因还需要从不同角度来分析:

 

一方面,还是在于大部分互联网公司对于新技术的采用是非常谨慎的,并且通常情况下,不会轻易改变自己原有的技术栈。个中缘由不难理解,老的技术栈由于发展时间较长,遇到问题可以相对轻松地找到对应解决方案,“即使在技术性能上稍微有些损耗,但这些损耗往往可以通过简单地横向扩展就得以解决,简单来讲就是用钱就可以解决。”

 

同时,对于互联网公司来说,采用新技术则需要考虑多方面因素:第一,团队现有人员的技术栈是否可以以较低成本使用这个新技术;第二,新技术的采用对现有组织架构的影响;第三,采用新技术带来的价值是否能够抵消它带来的潜在风险等等。

 

在这种背景下,对大多数公司来说,现阶段对 Wasm 还是持有一个相对谨慎的态度,更多的先尝试将其用在相对较小、较初期的业务中。

 

解读 Wasm 2.0 草案

 

今年 4 月, Wasm 2.0 草案正式发布,虽然作为一个草案,它不一定会得到 W3C 及其成员的认可,甚至随时可能被其他文件更新、替换或弃用,但技术本身自带的热度还是使得这份草案关注度颇高。相比 Wasm 1.0,Wasm 2.0 草案中加入了很多值得关注的新特性,比如引用类型(Reference Types)、固定宽度的 SIMD(Fixed-width SIMD)、批量内存操作(Bulk Memory Operations) 等等。这里,于航也为大家详细解读了 2.0 草案:

 

  • 引用类型(Reference Types)增加了新的名为 externref 的类型,它可用于直接引用宿主环境中的值。并且,新增加的如 ref.func、table.set 等指令很大程度上增加了 Wasm VM 与宿主环境的互操作性,为后续的 Exception Handling 和 GC 提案做了铺垫。



  • 固定宽度的 SIMD(Fixed-width SIMD) 提案为 Wasm 提供了固定 128 位的 SIMD 支持。这使得在处理一些特殊场景时,Wasm 可以利用向量化的能力,在一个指令下完成多个结果的计算过程。

  • 批量内存操作(Bulk Memory Operations)提案提供了用于优化 memcpy 与 memset 这两个常用的内存操作函数的指令,新增加的 memory.copy 指令可以更加高效地操作内存。

 

同时,本次草案中,大家还会关注到仍有一些在讨论中的提案,包括:分支提示(Branch Hinting)、尾部调用优化(Tail Call)、异常处理(Exception Handling)、线程功能(Threads)、宽松 SIMD(Relaxed SIMD)等等。于航提到,他对这些新提案还是相当期待的,因为这些特性可以继续优化 WebAssembly 在各个场景中的使用体验。展开来说:

 

  • 分支提示(Branch Hinting)、线程功能(Threads)、宽松 SIMD(Relaxed SIMD)、尾部调用优化(Tail Call)都是为了提升 Wasm 字节码在特定情况下的执行性能,最终为了尽可能地让 Wasm 的执行效率能够最大化。

  • 异常处理(Exception Handling)是为了解决支持异常处理的源语言在编译到 Wasm 时,对异常处理的兼容性问题。

 

“本次草案的发布,更多的是为下一步 GC 等复杂提案的实现打下坚实基础,”于航谈到,他认为就现阶段来看,2.0 草案的发布不会改变语言的写法,甚至对于对于上层用户来说,可能不会有太大感知,但是这次草案的最大意义正是为后续 Wasm 体验的改进做了很多铺垫,“大部分人可能会觉得这几个提案无关痛痒,但本质上它们是后续几个大提案实现的重要前提”。

 

Wasm 前景如何?

 

回到开头,在 2021 年 Wasm 用户报告中,不少开发者曾预计 Wasm 将会对 Web 开发以及不同应用领域产生重大影响。那么经过上述分析到底 Wasm 的前景如何呢?本次采访的最后,于航谈到判断 Wasm 的前景的话还需要大家持续关注以下两个方面:

 

第一,官方提案的进度。对于开发者来说,可以每周或者每个月去跟进 GitHub 上相关提案的推进进度,如果这些提案在不断推进,意味着对于这门技术是个很好的迹象,“至少能够说明 Working Group 作为一个核心的官方团队,是重视这个事情的。”

 

第二,基础设施厂商的实现进度。毕竟对于 Wasm 厂商和基础设施厂商来说,如果它们愿意花更多精力来实现 Working group 新的提案,前提一定是看好这门技术的,也能从侧面说明 Wasm 的发展前景。

 

“大家可能会担心,觉得现阶段看不到 Wasm 的更多落地,但我觉得落地还是要关注加入 WWG 的大公司的实践情况。”于航谈到,不过,也可以预见的是,随着这门技术标准和相关生态的逐渐完善,参与制定的互联网领头公司,比如 Google 等势必会率先在自己的业务场景中采用 Wasm 这门技术,届时,在这些巨头的影响下,没有直接参与标准制定的公司或者规模较小的公司也会逐渐将 Wasm 进行落地实践。

 

嘉宾介绍:

 

于航

PayPal Staff Engineer

 

曾先后在 Tapatalk、饿了么等国内外企业工作。目前在 PayPal 负责 “Compliance Insights” 相关的技术研发和管理工作。曾多次作为 QConGMTC、TLC 等技术大会的优秀讲师、优秀出品人。2018 年底出版名为《深入浅出 WebAssembly》的国内第一本 Wasm 技术书籍,随后陆续推出了《深入 C 语言与程序运行原理》等多个在线技术专栏。个人擅长的主要技术领域为:Web 前端基础架构、Wasm、C/C++ 系统软件设计与开发、X86-64 汇编等。同时也擅长演讲、跨团队协作及中小型技术团队管理。


若对更多关于 WebAssembly 的实践感兴趣,QCon 全球软件开发大会(北京站)「玩转 WebAssembly」专场,将从前后端等多重视角探讨 WebAssembly 的落地进展,帮你用上、用好 WebAssembly。此外,大会还设置了研发效能、前端新基建、前端前沿技术、业务架构、Rust 实战等共计 30 个专题,大会具体日程已上线,扫描二维码了解更多。感兴趣的同学可以直接联系票务经理:17310043226(微信同电话)



2022-07-12 11:588987

评论

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

ChaosBlade Java 场景性能优化,那些你不知道的事

阿里巴巴中间件

阿里云 云原生 ChaosBlade

数字化改变了什么?WeLink在实践中给出答案

路过的憨憨

观测云产品更新|应用性能新增服务清单功能;用户访问监测 Session 查看器调整;事件新增移动端跳转选项等

观测云

可观测性 观测云

黄东旭:开发者的“技术无感化”时代,从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022

PingCAP

TiDB

面对当下最热的多模态,为什么这些业界和学界专家说“不必追热点”

小红书技术REDtech

Fuzzing(模糊测试)的前世今生(中)

云起无垠

新变化新营销 这些知识点你得Get!(文末有PPT福利首次放送)

字节跳动数据平台

大数据 营销 12 月 PK 榜

专访 | 罗成:开源并非“只可远观”

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

让对外合作更高效,就用WeLink跨企业沟通

路过的憨憨

Proxyless Mesh 在 Dubbo 中的实践

阿里巴巴中间件

阿里云 云原生 dubbo

如何借助低代码开发平台 YonBuilder 填补应用开发 “产能缺口”?

YonBuilder低代码开发平台

开发者 低代码

焱融全闪系列科普| 为什么 SSD 需要 NVMe?

焱融科技

云计算 高性能 nvme 文件存储 全闪存储

云原生中的标准化

穿过生命散发芬芳

云原生 12月月更

AngularJS进阶(十三)JS利用正则表达式校验手机号

No Silver Bullet

正则表达式 AngularJS 12月月更

直播 | 数据仓库?数据湖?停止纠结,流批融合的极速 Lakehouse来了!

StarRocks

#数据库

Fuzzing(模糊测试)的前世今生(上)

云起无垠

【Meetup 预告】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除

No Silver Bullet

表格 AngularJS 12月月更

如何远程Debug内网(或者防火墙后)的Java服务

石臻臻的杂货铺

Java debug 后端

HIFIVE音加加 × 火山引擎:正版曲库+智能视频创作SDK,短视频全链路需求一站式解决!

HIFIVE音加加

短视频 火山引擎 HIFIVE音加加 视频配乐 版权音乐

子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2

StoneDB

MySQL HTAP 数据库· StoneDB 12 月 PK 榜

Fuzzing(模糊测试)技术,你真的了解吗?

云起无垠

升维数智化底座 迈向高质量发展

用友BIP

初识华为云数据库GaussDB(for Cassandra

路过的憨憨

华为云数据库GaussDB(for Influx)揭秘:数据分级存储

路过的憨憨

技术分享 | 将覆盖反馈融入黑盒模糊测试技术提升测试效率

云起无垠

AngularJS进阶(十)AngularJS改变元素显示状态

No Silver Bullet

AngularJS 12月月更 元素状态

Fuzzing(模糊测试)的前世今生(下)

云起无垠

网络安全 漏洞挖掘 Fuzzing 模糊测试

OpenMLDB v0.6 新版本运维功能增强

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

OpenMLDB 实时引擎性能测试报告

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

如何快速构建研发效能度量的指标体系?

Kyligence

数据分析 指标

多领域试水,WebAssembly 距离大规模应用还有多远?_大前端_闫园园_InfoQ精选文章