采访嘉宾 | 于航
编辑 | 闫园园
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” 相关的技术研发和管理工作。曾多次作为 QCon、GMTC、TLC 等技术大会的优秀讲师、优秀出品人。2018 年底出版名为《深入浅出 WebAssembly》的国内第一本 Wasm 技术书籍,随后陆续推出了《深入 C 语言与程序运行原理》等多个在线技术专栏。个人擅长的主要技术领域为:Web 前端基础架构、Wasm、C/C++ 系统软件设计与开发、X86-64 汇编等。同时也擅长演讲、跨团队协作及中小型技术团队管理。
若对更多关于 WebAssembly 的实践感兴趣,QCon 全球软件开发大会(北京站)「玩转 WebAssembly」专场,将从前后端等多重视角探讨 WebAssembly 的落地进展,帮你用上、用好 WebAssembly。此外,大会还设置了研发效能、前端新基建、前端前沿技术、业务架构、Rust 实战等共计 30 个专题,大会具体日程已上线,扫描二维码了解更多。感兴趣的同学可以直接联系票务经理:17310043226(微信同电话)
评论