简介¶
WebAssembly(简称 Wasm [1])是一种安全、可移植、低级代码格式,旨在实现高效执行和紧凑表示。其主要目标是在 Web 上启用高性能应用程序,但它不作任何 Web 特定的假设,也不提供 Web 特定的功能,因此也可以在其他环境中使用。
WebAssembly 是一种由 W3C 社区组 开发的开放标准。
本文档描述了 核心 WebAssembly 标准的 2.0 版(2024-09-13 草案)。预计将来会发布新的增量版本,其中包含附加功能,并取代本文档。
设计目标¶
WebAssembly 的设计目标如下:
快速、安全和可移植的语义
快速:以接近原生代码的性能执行,利用所有现代硬件共同的能力。
安全:代码经过验证,并在内存安全的 [2]、沙箱环境中执行,防止数据损坏或安全漏洞。
定义明确:以易于非正式和正式推理的方式完全和准确地定义有效程序及其行为。
独立于硬件:可以在所有现代架构、台式机或移动设备以及嵌入式系统中编译。
独立于语言:不偏袒任何特定语言、编程模型或对象模型。
独立于平台:可以嵌入浏览器、作为独立的 VM 运行,或集成到其他环境中。
开放:程序可以通过简单且通用的方式与其环境进行交互。
高效且可移植的表示
紧凑:具有二进制格式,该格式传输速度快,因为其大小比典型的文本或原生代码格式小。
模块化:程序可以分成更小的部分,这些部分可以单独传输、缓存和使用。
高效:可以通过快速单次传递进行解码、验证和编译,无论使用即时 (JIT) 还是提前 (AOT) 编译。
可流式传输:允许在看到所有数据之前尽快开始解码、验证和编译。
可并行化:允许将解码、验证和编译拆分为多个独立的并行任务。
可移植:不作任何在现代硬件中普遍支持的架构假设。
WebAssembly 代码也旨在易于检查和调试,尤其是在像 Web 浏览器这样的环境中,但此类功能超出了本规范的范围。
范围¶
从本质上讲,WebAssembly 是一种虚拟指令集架构 (虚拟 ISA)。因此,它有许多用例,可以嵌入到许多不同的环境中。为了包含它们的种类并实现最大程度的重用,WebAssembly 规范被分成几个文档,并分层。
本文档关注 WebAssembly 的核心 ISA 层。它定义了指令集、二进制编码、验证和执行语义,以及文本表示。但是,它没有定义 WebAssembly 程序如何与执行它们的特定环境交互,也没有定义如何从这种环境中调用它们。
相反,该规范通过其他文档进行补充,这些文档定义了与特定嵌入环境(如 Web)的接口。这些文档将分别为给定环境定义适合的 WebAssembly应用程序编程接口 (API)。
安全注意事项¶
WebAssembly 不提供对执行代码的计算环境的任何环境访问。任何与环境的交互,例如 I/O、资源访问或操作系统调用,只能通过调用 函数 来执行,这些函数由 嵌入器 提供,并导入到 WebAssembly 模块 中。嵌入器可以通过控制或限制它提供导入的哪些功能来建立适合各自环境的安全策略。此类考虑是嵌入器的责任,也是特定环境的 API 定义 的主题。
由于 WebAssembly 旨在被转换为直接在主机硬件上运行的机器代码,因此它可能容易受到硬件级别的旁路攻击。在对此问题感到担忧的环境中,嵌入器可能需要实施适当的缓解措施来隔离 WebAssembly 计算。
依赖项¶
WebAssembly 依赖于两个现有标准:
但是,为了使本规范自成一体,上述标准的相关方面被定义并形式化,作为本规范的一部分,例如 二进制表示 和 舍入 浮点值,以及 值范围 和 UTF-8 编码 Unicode 字符。
注意
上述标准是所有相关定义的权威来源。本规范中给出的形式化旨在与这些定义相匹配。描述的语法或语义中的任何差异应被视为错误。