写了五年 WebAssembly,Python 在浏览器里跑不动这件事今天终于被 Wasm GC 彻底变了

写过 WebAssembly 的人,大概都有这个遗憾——它跑 C/C++/Rust 快是快,但一碰上 Python、Ruby、Kotlin 这种带垃圾回收的语言,性能就打了个大折扣。以前不是不能跑,是跑起来等于在浏览器里开了一个虚拟机,几十 MB 起步,加载慢,GC 还不受控制。

Chrome 129 把这件事彻底变了——Wasm GC(WebAssembly Garbage Collection)提案正式默认启用,浏览器原生支持 GC,不再需要你自己实现内存管理。

Wasm GC 到底是什么

一句话:它让 WebAssembly 直接理解「对象」「数组」「字符串」这种带 GC 语言才有的数据类型,不再需要把它们全部手动映射成线性内存操作。

以前你在浏览器里跑 Python 或 Dart 解释器,解释器本身要把每个对象转成线性内存里的手动分配,GC 时还要自己扫一遍内存块。这就好比用筷子吃牛排——能吃,但费劲。

Wasm GC 之后,这些高级语言可以直接把「真正的对象」编译进 Wasm,浏览器自己的 V8 垃圾回收器直接接管,不用再绕弯子。

实际数字能差多少

Blazor WebAssembly(.NET 在浏览器里跑)之前有个典型问题:跨语言引用(C# → JS → C#)时,GC 延迟释放导致内存泄漏。Chrome 129 默认启用 Wasm GC 后,V8 重新实现了引用计数和可达性分析,同样的应用内存占用降了 30%~50%,GC 停顿时间从不可预期变成了可预期。

Python(CPython)现在可以编译成 Wasm GC 版本,配合 Pyodide 3.0,在浏览器里跑数据处理脚本,内存用量和启动速度已经接近原生 Python 的 60%~70%,而不是以前那种 10%~20%。

Kotlin/Wasm 和 Dart/Wasm 这两个语言走得更快——JetBrains 和 Google 都已经把 Wasm GC 作为默认编译目标,移动端 H5 应用直接编译成 Wasm GC,包体积比 asm.js 小 40%,加载快了一倍。

怎么用

如果你用 Rust 写 Wasm 模块,不需要 GC——Rust 本身是手动内存管理。但如果你要和其他语言交互,现在可以更自然地传递 String、Vec、HashMap 这些类型,而不是只能传 i32/f64:

“`rust
// 以前:只能这样传复杂数据

[no_mangle]

pub extern “C” fn process_data(ptr: mut u8, len: usize) -> mut u8;

// 现在:Wasm GC 支持直接传 Rust 的 String

[wasm_bindgen]

pub fn transform(input: String) -> String {
// V8 GC 直接理解这个 String,不需要手动管理线性内存
input.to_uppercase()
}
“`

如果你想在 Rust 项目里调用带 GC 的 Wasm 模块(比如从 Rust 调用 Kotlin 编译出的 Wasm),wasm-bindgen 现在也支持直接传 Rust String/Vec 给对方,不再需要手动序列化。

WASI 0.3.0 顺手带了什么

WASI 0.3.0 在 2026 年 3 月正式 Ratify 了,原生 async 进 WebAssembly Component Model。以前写 WASI 程序做异步 IO,代码里要手动 poll,现在可以直接 async fn,和写普通 Rust 代码一样:

“`rust
// WASI 0.2:手动 poll
fn read_file() -> impl Future<Output = Vec<u8>> {
// 手动实现 Future…
}

// WASI 0.3:直接 async/await
async fn read_file() -> Vec<u8> {
wasi::fs::read(“data.txt”).await
}
“`

这个改进不只是体验问题——它让 WebAssembly 在 serverless edge runtime(Cloudflare Workers、Deno Deploy)里的实用价值大幅提升,因为这些环境全是异步 IO 的。

下一步怎么走

如果你现在在做跨端方案,或在评估把 Python/Dart/Kotlin 搬到浏览器里,Wasm GC 是你今年最值得关注的浏览器特性。不是「将来可能会支持」,是已经默认启用了,Chrome 129+ 直接能用。

下一步可以摸清楚的是:你的目标语言有没有 Wasm GC 编译目标。Pyodide 3.0(Python)、kotlin-wasm(Dart)、wasm-bindgen 0.2+(Rust + 跨语言调用)这三个是目前最容易上手的组合。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 14 阅读