技术发展态势喜人,多项关键性提议都进入了新阶段,并且获得了社区与工具链的广泛深入支持。同时,其应用场景呈现出蓬勃扩展的态势,吸引着越来越多组织和个人开发者群体投入 WebAssembly 的开发之中。下文我们将首先回溯 WebAssembly 在 2023 年各项关键技术特性的进展,继而前瞻探讨新的一年它有望展现的发展趋势和前景。本文是 “2023 InfoQ 年度技术盘点与展望” 系列文章之一,由 InfoQ 编辑部制作呈现。
WebAssembly GC (Garbage Collection,垃圾回收) 特性引入的目的之一是为了更加高效地支持一些需要垃圾回收处理的高级语言,比如 TypeScript、Java、Kotlin、Python、PHP 和 C# 等。在没有引入 WebAssembly GC 特性之前,如果要将这些语言移植到 WebAssembly,一般的做法是将相应语言的虚拟机(如 JavaScript runtime、Python runtime 等)以及目标 app 一起编译成 WebAssembly 目标代码,由 wasm runtime 来执行该语言的虚拟机,然后再由该虚拟机来执行目标 app。由于这种方式不容易将目标 app 转成机器码以 AOT(Ahead of Time Compilation)或 JIT(Just in Time Compilation)方式来执行,虚拟机一般只能以解释器的方式执行目标 app,所以性能受到很大的限制。另一方面,将虚拟机编译到 wasm 目标代码,也可能大大增加目标代码的体积。引入了 WebAssembly GC 特性之后,人们可以开发出新的编译器,将某种高级语言的 app 直接编译成基于 WebAssembly GC 操作的目标代码,不需要将虚拟机一起编译进来。这样一方面目标 app 可以用 AOT 或 JIT 方式来执行,另一方面基于 GC opcode 的操作也非常高效(比如对结构成员的访问、对数组元素的访问等),因此可以极大提升性能,并减少目标代码体积。WebAssembly GC 依赖于 Reference Types 和 Typed Function References (或简称 Func Ref) 两个特性,在基本数据类型 (i32、 i64、 f32、 f64 和 v128) 的基础上引入了多种和引用相关的数据类型,包括 structref、 arrayref、 i31ref、 funcref、 externref 等,规定了类型之间的继承和等价关系,并且引入很多新的 opcode 来操作这些数据类型,从而满足多种高级语言的需求。其中 Reference Types 已经在 2021 年正式写入规范,而 GC MVP 提议和 Func Ref 提议在 2023 年也得到了较大的发展,在经过了大量讨论和修改后趋于完善和稳定,目前都进入了阶段四即标准化阶段。另外开源项目 WAMR (wasm-micro-runtime)、v8、Kotlin 以及开源编译框架 Binaryen 等都在持续跟进支持 GC 特性。WAMR 已经基本实现了 interpreter、AOT 以及 LLVM JIT 几种执行模式对绝大部分 GC MVP 特性的支持(注:开发分支),并被应用到了开源 Wasmnizer-ts 项目上面,后者旨在将 TypeScript 语言编译成基于 WebAssembly GC 的目标代码,以提升性能、减少模块尺寸并方便移植到各个架构,有兴趣可以参考 https://github.com/web-devkits/Wasmnizer-ts。
网友评论