文章摘要
WebAssembly自2017年发布以来已取得长足进步,从最初支持C/C++等低级语言,到逐步增加了共享内存、SIMD、异常处理、尾调用等核心功能。尽管功能不断增强,但目前在web开发中仍被视为二等语言,文章探讨了如何使其成为web开发的一等语言。
文章总结
WebAssembly为何仍是Web平台的二等公民?——来自Mozilla开发者博客的深度解析
本文基于作者在2025年WebAssembly CG会议上的演讲内容扩展而成。
WebAssembly的发展与现状
自2017年首次发布以来,WebAssembly已取得长足进步。初始版本已完美支持C/C++等低级语言,为Web平台带来了高效应用。此后,WebAssembly CG通过添加共享内存、SIMD、异常处理、尾调用、64位内存和GC支持等核心功能,显著扩展了其能力,使更多语言能够高效编译为WebAssembly。
尽管WebAssembly与原生代码的差距已大幅缩小,但其在Web平台的普及仍面临阻碍。核心问题在于:WebAssembly始终是Web平台的二等语言。虽然语言功能不断丰富,但其与Web平台的集成度仍不足。
二等公民的困境
代码加载复杂
JavaScript只需<script>标签即可加载,而WebAssembly必须通过复杂的JS API手动加载和实例化。虽然esm-integration提案允许通过JS模块系统导入.wasm文件,但根本问题仍未解决。Web API调用繁琐
JavaScript可直接调用console.log("hello"),而WebAssembly需通过JavaScript胶水代码间接访问。例如实现同等功能需要:- JavaScript端:处理内存转换、封装API调用
- WebAssembly端:导入内存和函数,手动编码字符串 这种绑定代码虽可通过工具自动生成,但增加了构建复杂度,且存在运行时开销。
开发者体验的鸿沟
- JavaScript开发者:从简单脚本到复杂功能的渐进学习曲线
- WebAssembly开发者:起步即面临工具链配置、跨语言调试等高门槛,导致其仅被资源充足的大公司采用
性能瓶颈实验
2020年TodoMVC基准测试显示:
- 传统JS胶水方案:处理DOM变更耗时X毫秒
- 实验性直接绑定方案:耗时降低45%
证明移除胶水代码可显著提升性能。
根本解决方案:WebAssembly组件模型
该提案旨在通过标准化组件解决以下问题: 1. 自包含可执行文件:语言无需生成配套JS代码 2. 多语言支持:统一各语言的Web平台接口 3. 直接Web API调用:浏览器原生支持,消除胶水代码
组件模型实践示例
```wit // 定义控制台接口 component { import std:web/console; }
// Rust实现
use std::web::console;
fn main() {
console::log("hello, world"); // 直接调用
}
``
浏览器通过