WebAssembly规范引言

78 阅读4分钟

引言

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 编码

注意

上述标准是所有相应定义的权威来源。本规范中给出的形式化旨在与这些定义相匹配。所描述的语法或语义中的任何差异都应被视为错误。