引言
WebAssembly(缩写为 Wasm [1])是一种为高效执行和紧凑表示而设计的安全、可移植的底层代码格式。其主要目标是在 Web 上实现高性能应用程序,但它不作任何 Web 特定的假设,也不提供 Web 特定的功能,因此也可以在其他环境中使用。
WebAssembly 是由 W3C 社区组(W3C Community Group)开发的一个开放标准。
本文档描述了 WebAssembly 核心标准的 2.0 版本(草案 2025-06-24)。未来,它将被包含附加功能的新增量版本所取代。
设计目标
WebAssembly 的设计目标如下:
快速、安全、可移植的语义:
- 快速:利用所有当代硬件的通用能力,以接近本机的代码性能执行。
- 安全:代码经过验证,并在一个内存安全 [2] 的沙箱环境中执行,以防止数据损坏或安全漏洞。
- 定义明确:以一种易于非正式和正式推理的方式,完整而精确地定义了有效程序及其行为。
- 硬件无关:可以在所有现代架构上编译,无论是桌面设备、移动设备还是嵌入式系统。
- 语言无关:不优待任何特定的语言、编程模型或对象模型。
- 平台无关:可以嵌入到浏览器中,作为独立的虚拟机运行,或集成到其他环境中。
- 开放:程序可以以简单、通用的方式与它们的运行环境进行互操作。
高效、可移植的表示:
- 紧凑:其二进制格式比典型的文本或本机代码格式更小,因此传输速度快。
- 模块化:程序可以被分割成更小的部分,这些部分可以被分别传输、缓存和消费。
- 高效:可以通过快速的单次遍历完成解码、验证和编译,无论是采用即时(JIT)编译还是提前(AOT)编译。
- 可流式处理:允许在所有数据被接收之前,尽快开始解码、验证和编译。
- 可并行化:允许将解码、验证和编译分割成许多独立的并行任务。
- 可移植:不作任何在现代硬件上没有得到广泛支持的架构假设。
WebAssembly 代码还旨在易于检查和调试,尤其是在 Web 浏览器等环境中,但这些功能超出了本规范的范围。
[1] “WebAssembly”的缩写,不是首字母缩略词,因此不使用全大写。
[2] 任何程序都不能破坏 WebAssembly 的内存模型。当然,它不能保证编译到 WebAssembly 的不安全语言不会破坏其自身的内存布局,例如在 WebAssembly 的线性内存内部。
范围
WebAssembly 的核心是一种虚拟指令集架构(virtual ISA)。因此,它有许多用例,可以嵌入到许多不同的环境中。为了涵盖其多样性并实现最大程度的重用,WebAssembly 规范被分割并分层到几个文档中。
本文档关注 WebAssembly 的核心 ISA 层。它定义了指令集、二进制编码、验证和执行语义,以及一种文本表示。然而,它没有定义 WebAssembly 程序如何与它们执行的特定环境进行交互,也没有定义如何从这样的环境中调用它们。
取而代之的是,本规范由一些附加文档作为补充,这些文档定义了与特定嵌入环境(如 Web)的接口。这些文档将分别为给定的环境定义一个合适的 WebAssembly 应用程序编程接口(API)。
安全考量
WebAssembly 不提供对代码执行所在计算环境的任何环境访问权限。与环境的任何交互,例如 I/O、资源访问或操作系统调用,只能通过调用由嵌入器提供并导入到 WebAssembly 模块中的函数来执行。嵌入器可以通过控制或限制其提供给导入的功能,来为相应的环境建立合适的安全策略。这些考量是嵌入器的责任,也是特定环境 API 定义的主题。
由于 WebAssembly 被设计为直接在宿主硬件上转换为机器代码运行,因此它可能在硬件级别上受到侧信道攻击的威胁。在对此有顾虑的环境中,嵌入器可能需要采取适当的缓解措施来隔离 WebAssembly 计算。
依赖项
WebAssembly 依赖于两个现有标准:
- IEEE 754,用于浮点数据的表示和相应数值操作的语义。
- Unicode,用于导入/导出名称和文本格式的表示。
然而,为了使本规范自成一体,上述标准的相关方面在本规范中被定义和形式化,例如浮点值的二进制表示和舍入,以及 Unicode 字符的值范围和 UTF-8 编码。
注意
上述标准是所有相应定义的权威来源。本规范中给出的形式化旨在与这些定义相匹配。所描述的语法或语义中的任何差异都应被视为错误。