Hacker News 中文摘要

RSS订阅

WASM 3.0 完成 -- WASM 3.0 Completed

文章摘要

Wasm 3.0标准于2025年9月17日正式发布,这是继Wasm 2.0之后的重大更新。新版本引入了多项重要特性,包括64位地址空间支持,使内存和表地址类型从i32扩展至i64,理论上将可用地址空间从4GB提升至16EB。尽管在Web环境中仍受限于16GB,但这一更新为Wasm应用带来了更大的灵活性和扩展能力。

文章总结

Wasm 3.0 正式发布 - WebAssembly

2025年9月17日,由Andreas Rossberg发布。

三年前,Wasm 2.0标准基本完成,引入了向量指令、批量内存操作、多返回值等新特性。如今,Wasm W3C社区组和工作组再次取得重大进展,正式发布了Wasm 3.0作为新的“现行”标准。

Wasm 3.0是一个大幅度的更新,包含多个重要特性,其中一些已经开发了六到八年。以下是主要更新内容:

  1. 64位地址空间:内存和表现在可以声明使用i64作为地址类型,而不仅仅是i32。这将Wasm应用的可用地址空间从4GB扩展到理论上16EB(取决于硬件)。虽然Web环境仍会限制64位内存为16GB,但这一新特性对非Web生态系统尤其重要,使其能够支持更大的应用和数据集。

  2. 多内存支持:Wasm应用现在可以在单个模块中声明和访问多个内存对象,包括直接在它们之间复制数据。这为工具如wasm-merge提供了全面支持,并为安全、缓冲或检测等新用途铺平了道路。

  3. 垃圾回收:Wasm增加了对垃圾回收的支持,允许编译器声明运行时数据结构的布局,由Wasm运行时自动管理内存分配和生命周期。Wasm GC是低级的,不提供内置对象系统或闭包,而是专注于内存管理。

  4. 类型化引用:GC扩展建立在Wasm类型系统的重大扩展之上,支持更丰富的引用形式,避免额外的运行时检查。新的call_ref指令使得无需运行时类型或边界检查即可进行安全的间接函数调用。

  5. 尾调用:尾调用是一种立即退出当前函数的调用方式,避免占用额外的栈空间。Wasm尾调用完全通用,适用于静态和动态选择的被调用者。

  6. 异常处理:Wasm 3.0提供了原生异常处理,允许声明异常标签及其关联的负载数据,并基于标签选择性地捕获异常。

  7. 宽松向量指令:Wasm 3.0引入了“宽松”向量指令变体,允许在某些边缘情况下具有实现依赖的行为,以最大化性能。

  8. 确定性配置文件:为了弥补宽松向量指令的语义模糊性,Wasm标准现在为每个具有非确定性结果的指令指定了确定性默认行为,确保在需要确定性执行语义的环境中(如区块链或可重放系统)的完全确定性、可重现性和可移植性。

  9. 自定义注释语法:Wasm文本格式增加了通用语法,用于在Wasm源代码中放置注释。这些注释可以由下游标准具体指定,提供了一种以人类可读和可写形式表示自定义部分信息的方式。

此外,Wasm在JavaScript中的嵌入受益于JS API的新扩展:

  • JS字符串内置函数:JavaScript字符串值可以作为externrefs传递给Wasm,新的原始库函数可以直接在Wasm中访问和操作这些外部字符串值。

这些新特性使得Wasm在编译高级编程语言方面有了更好的支持,促使Java、OCaml、Scala、Kotlin、Scheme和Dart等新语言纷纷采用Wasm作为目标平台。

Wasm 3.0是首个使用新SpecTec工具链生成的标准版本,确保了更高的规范可靠性。目前,Wasm 3.0已在大多数主流浏览器中发布,独立引擎如Wasmtime的支持也在顺利进行中。

评论总结

  1. 64位内存性能与限制

    • 观点:64位内存的引入可能带来性能问题,特别是在32位WASM代码运行时,64位主机的地址空间可能无法完全避免边界检查。
    • 引用
      • "There's the potential for performance regressions there because they could exploit the larger address space of 64bit hosts to completely elide bounds checks when running 32bit WASM code." (jsheard)
      • "I'm definitely excited to see 64 bit as a default part of the spec. A lot of web apps have been heavily restricted by this." (jjcm)
  2. 垃圾回收(GC)与异常处理

    • 观点:WASM的GC功能虽然低级别,但可能被误解为可以直接支持高级语言如Python/Java等,实际上仍需要围绕编译器抽象编写代码。
    • 引用
      • "Wasm GC is low-level as well: a compiler targeting Wasm can declare the memory layout of its runtime data structures in terms of struct and array types." (j0e1)
      • "This is not a silver bullet. Cpp, or rust are probably still going to be the way to go." (preommr)
  3. 异常处理与重启机制

    • 观点:异常处理功能是否支持重启机制(如Common Lisp和Scheme)尚不明确。
    • 引用
      • "Does anyone know whether the exception handling implementation supports restartable exceptions like Common Lisp's and Scheme's?" (aag)
  4. 内存限制与标准化

    • 观点:16GB的Web内存限制是否为技术原因或仅为标准化选择,以及JS堆大小限制是否同步放宽,仍需明确。
    • 引用
      • "Is there a technical reason for the web limit to be 16 GB specifically? Or is it just a round number picked so that the limit could be standardized?" (modeless)
  5. 组件模型与WASM 3.0

    • 观点:组件模型工作是否与WASM 3.0发布相关,尚不明确。
    • 引用
      • "Is the component model work related to the 3.0 release in any way?" (pbiswal)
  6. WASM在微控制器上的应用

    • 观点:WASM在微控制器上的应用可能受限于64KiB页大小,特别是在内存有限的设备上。
    • 引用
      • "Does WASM still have 64 KiB pages? I get why for desktops, but there are use-cases for running WASM on microcontrollers where that's either inconvenient or outright impossible." (boricj)

总结:评论主要围绕64位内存性能、垃圾回收与异常处理、内存限制、组件模型及WASM在微控制器上的应用展开讨论,各方观点不一,部分功能的具体实现和影响仍需进一步明确。