Hacker News 中文摘要

RSS订阅

让WebAssembly成为Web的一流语言 -- Making WebAssembly a first-class language on the Web

文章摘要

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平台的集成度仍不足。

二等公民的困境

  1. 代码加载复杂
    JavaScript只需<script>标签即可加载,而WebAssembly必须通过复杂的JS API手动加载和实例化。虽然esm-integration提案允许通过JS模块系统导入.wasm文件,但根本问题仍未解决。

  2. 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"); // 直接调用 } `` 浏览器通过