我判断,今年WebAssembly会流行起来
2022 年,WebAssembly(通常简称为 Wasm)一跃成为众人瞩目的焦点。出现了新的 Wasm 初创公司,老牌公司也宣布支持 Wasm了。字节码联盟推出了多项 Wasm 标准。云原生计算基金会举办了两次 WasmDay 活动。最大的 Wasm 用户之一 Figma 被 Adobe 以惊人的 200 亿美元收购。
Wasm 的核心是一种二进制格式。许多不同的语言可以编译成相同的格式,而这种二进制格式可以在各种各样的操作系统和架构上运行。Java 和 .NET 在这方面很相似,但 Wasm 有一个主要区别:Wasm 运行时并不信任它执行的二进制文件。
Wasm 应用程序被隔离在沙箱中,并且只允许访问用户明确允许的资源(如文件或环境变量)。Wasm 具有许多其他令人满意的特性(例如非凡的性能),但正是这种安全模型使 Wasm 在从浏览器到边缘和物联网甚至云端的各种环境中发挥作用。
如果说 2022 年有什么值得注意的 Wasm 趋势的话,那就是 Wasm 现在在浏览器以外的地方比在浏览器内获得了同样多的成功。而这一趋势是 2023 年的大部分内容的基础。随着 Wasm 出现在从嵌入式设备到大数据中心的各个地方,2023 年有望成为 Wasm 年。以下是我对 2023 年 Wasm 生态系统的五个预测。
组件模型将成为分水岭
标准很少是一个生态系统中最令人激动的部分。而像“组件模型”这样的名字,唤起兴奋确实是一场艰苦的战斗。但在这个无聊的名字背后,是 Wasm 给软件世界带来的最重要的创新。
组件模型描述了一种 Wasm 二进制文件之间相互交互的方式。更具体地说,这两个组件可以告诉对方它们提供什么服务以及需要满足什么期望。然后,Wasm 模块可以利用彼此的能力。这为软件开发人员提供了一种构建应用程序的新方法。开发人员可以声明他们的应用程序需要哪些组件,而不是在他们喜欢的源语言中寻找库,或者更抽象地说是他们的应用程序需要哪些功能,然后 Wasm 运行时可以代表用户组装正确的组件集。
Dan Gohman 是 Wasm 最勤劳的贡献者之一,他写过一篇很棒的概述文章[1]。Fermyon 的 Joel Dice 也为那些对内部结构比较好奇的人写了一篇技术概述[2]。
组件模型正在迅速成熟,并且已经出现了参考实现。2023 年将是组件模型开始重新定义我们如何编写软件的一年。
Serverless 将成为 Wasm 的切入点
在过去的几年里,无服务器的前景已经很明朗了。AWS Lambda 以函数即服务(FaaS)的形式让我们看到了一种全新且直接的编程模型。然而,尽管无服务器概念背后的势头正在增强,但底层技术的运营成本还是很高。而这笔费用已经转嫁给了用户。此外,虽然 FaaS 应用程序的启动时间比容器快,但它们仍然达不到当今对 Web 性能的期望。速度还有提升的空间。
Wasm 已经改变了无服务器环境的潜力。凭借近乎即时的启动时间、较小的二进制文件大小以及平台和架构的中立性,Wasm 二进制文件可以用运行当今无服务器基础设施所需资源的一小部分来执行。
如果整个经济正进入不确定时期,那么很高兴知道 Wasm 将帮助我们减少开支,同时还推进开发人员最喜欢的无服务器功能模型。Wasm 更快的启动时间和适度的资源消耗所需的计算能力远远低于基于容器的系统,并且比 Lambda 等 FaaS 系统更便宜。
正是意识到 Wasm 可以改变无服务器环境,Fermyon 才创建了 Spin[3]。Spin 是一种面向开发人员的工具,用于引导、构建、测试和部署无服务器功能。Spin 的核心是其基于 Wasm 的运行时。它是开源的,已经得到 Fermyon Cloud 和 Microsoft Azure 的 AKS 的支持,2023 年还会有更多支持。
更小、更快、更便宜、更好。这就是 Wasm 在 2023 年向无服务器世界提供的组合。
Wasm 应用程序将存储在 DockerHub 和容器注册表中
包管理。从编程语言到操作系统,再到像 Kubernetes 这样的集群编排器,它是一切事物的必要特性。每次我们发明一项新技术时,我们似乎注定要(重新)发明一个管理该技术资产的系统。
2022 年初,我们看到了几种相互竞争的 Wasm 对象管理方法,但没有一个成功。一小部分工程师坚持将 OCI Registry(又名 Docker Registry)作为存储 Wasm 的系统。但事实是 OCI Registry 格式不支持非容器工件。它用于存储 Docker 镜像。
然后 OCI Registries 的一个重大转变改变了局面。OCI(Open Container Initiative)是一个小型标准机构,致力于管理 OCI 容器(或我们过去称为 Docker 容器)标准。OCI 定义了容器格式、安全模型和运行时。它还定义了容器镜像如何在注册中心和客户端之间移动。
临近 2022 年底,OCI Registries 工作组宣布了一种正式的方式来存储容器镜像以外的东西。这可能包括诸如 Helm 图表、照片或(你猜对了)Wasm 应用程序之类的东西。这个新功能被称为“工件存储”。
当 DockerHub 宣布支持这个新的工件存储规范时,在 Wasm 生态系统中引起了反响:我们可以简单地将我们的应用程序存储在像 DockerHub 这样的 OCI 注册表中,而不是重新发明轮子。必须在 Wasm 生态系统中完成新的工作才能使这成为现实,这项工作正在进行中。2023 年将是 Wasm 应用程序在 OCI 注册表中落地生根的一年。
所有大型编程语言都将支持 Wasm
语言支持是 Wasm 成功的一个关键因素。随着每一种新的语言可以编译到 Wasm,一个新的开发者社区就可以获得 Wasm 的好处。排名前 20 名的编程语言几乎都在添加 Wasm 的支持。
2022 年,我们看到 Wasm 的三个巨大飞跃。Python 首先添加了支持,然后是 Ruby。10月,长期以来在浏览器中拥抱 Wasm 的 .NET,为 Wasm 添加了更深层次的支持,使其能够在浏览器之外运行。
今年又有三种语言取得了一些进展,2023 年将标志着这些语言可以投入使用。这三种语言是Kotlin、Dart,当然还有世界上最流行的编程语言:JavaScript。
Kotlin 和 Dart 社区都在积极构建 Wasm 编译目标。不过,两者都在等待一个特定的 Wasm 标准的成熟——描述垃圾收集的标准,这是一种语言运行时中的设施,允许在程序执行时清理内存。我们的预测是,Wasm-GC[4] 提案将在 2023 年初可用并得到支持,因此 Kotlin 和 Dart 将很快发布 Wasm 编译器。
JavaScript 是如此重要,以至于它值得一个特别的预测。
JavaScript 将成为最流行的 Wasm 语言
在所有语言中,JavaScript 与 Wasm 的关系最为复杂。正如最初设想的那样,Wasm 将在浏览器中与 JavaScript 交互。事实上,Wasm 最初的承诺是它将浏览器语言支持扩展到 JavaScript 之外。
但面对现实世界的用例,想法改变了。
由于 Wasm 在浏览器之外,许多开发人员希望能够在任何可以运行 Wasm 的地方运行他们的 JavaScript 代码。而要做到这一点,最好的办法是使其能够在 Wasm 运行时内部运行 JavaScript(而不是像在浏览器中那样在其旁边)。在2022年,我们看到几个新的 Wasm 项目专注于将 JS 带到新的运行时。这些项目中的大多数都使用了一个伟大的开源项目,名为QuickJS[5]。
QuickJS 有很多优点,最重要的是它完全符合最新的 JavaScript 标准。但它并不是被设计成最快或最强大的 JavaScript 引擎。它非常容易嵌入,以至于许多早期的 Wasm 项目已经找到了将解释器编译为 Wasm ,然后在 Wasm 运行时中运行 JavaScript 的方法。
但是,有一个主流的 JavaScript 运行时进入了这个战场。来自 Mozilla 的 SpiderMonkey 引擎,以其性能和健壮性而闻名,正在进入 Wasm 世界。它因在 Mozilla Firefox 浏览器中的使用而最为著名,它也可以在浏览器之外使用。作为一个可以持续优化其执行的脚本的运行时间,SpiderMonkey 引擎将是 Wasm 世界中最快的 JS 引擎。早期的数据表明,由于可以在此环境中进行优化,在 Wasm 版本的 SpiderMonkey 中运行的 JavaScript 可能比浏览器中的 JS 执行速度快 13 倍。
JavaScript 是世界上最流行的编程语言。而随着 QuickJS 和 SpiderMonkey 等 Wasm 运行时的出现,Wasm 的潜力突然被一个巨大的开发者社区所接受。是的,C 是第一个支持 Wasm 的编程语言。Rust 也有相当大的立足点。当然,我们也看到 Python 和 Ruby 的发展。但是,JavaScript 将像火箭一样射入 Wasm 的平流层。
结论:2023 年是 Wasm 年
我对 Wasm 生态系统内部将发生的事情做了五个大胆的预测。而随着这些里程碑的实现,Wasm 作为浏览器之外的通用技术将变得更加有用。在文章的开头,我提出 2023 年有望成为 Wasm 年。鉴于这五个预测,很容易看出原因:新功能、巧妙的用例、与Docker Hub的集成以及广泛的语言支持,这些都使这项对开发者友好的技术具有广阔的前景。
相关链接:
https://blog.sunfishcode.online/what-is-a-wasm-component/ https://www.fermyon.com/blog/webassembly-component-model https://developer.fermyon.com/spin/index https://github.com/WebAssembly/gc/blob/main/proposals/gc/Overview.md https://bellard.org/quickjs/
推荐阅读: