写点什么

多领域试水,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:589237

评论

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

英特尔傅彬:PC创新演进之路,英特尔全力以赴

E科讯

【论文解读】Faster sorting algorithm

合合技术团队

人工智能 算法 论文 解读

云测 | 打造终端智能测试平台,助力企业迈向高效质量管理

TRaaS

小程序 支付宝小程序 测试 支付宝

跨平台时代,小程序成为全域业务的关键枢纽

没有用户名丶

TDengine 3.1.1.0 来啦!更新如下

TDengine

时序数据库 #TDengine

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

西柚子

LP 流动性质押 DAPP 模式系统开发

l8l259l3365

Databend 玩转 Local 模式

Databend

飞桨产品经理教你如何应用PaddleX

飞桨PaddlePaddle

数据通信网络之IPv6以太网多层交换

timerring

数据通信网络

优雅!比OpenAI更认真的文本嵌入模型

ZA技术社区

保险科技 AIGC 众安科技 文本嵌入模型

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

OpenAnolis小助手

开源 操作系统 龙蜥社区 运营委员会 开放原子

Mac电脑多功能文件搜索推荐 HoudahSpot中文版

胖墩儿不胖y

搜索工具 文件搜素 文件搜索软件

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

鳄鱼视界

Rhino 7 for Mac(犀牛3D建模软件) 7.33永久激活版

mac

windows Rhino 7 苹果mac 三维构建软件

数据赋能健康发展,数造科技为某省妇幼医院搭建医疗数据科研平台

数造万象

sip中继

cts喜友科技

SIP

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

威廉META

vivo数据中心网络链路质量监测的探索实践

vivo互联网技术

数据中心 网络故障排除

英特尔傅彬:Thunderbolt和USB不是竞争关系,而是携手共进

E科讯

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