凌云的博客

行胜于言

WebAssembly 介绍[译]

分类:wasm| 发布时间:2024-12-26 08:56:00

介绍

原文:WebAssembly Introduction

WebAssembly(缩写为 Wasm[1])是一种安全、可移植、低级别的代码格式,旨在实现高效执行和紧凑表示。 它的主要目标是支持 Web 上的高性能应用程序,但它并未做出任何 Web 特定的假设,也没有提供 Web 特定的功能,因此它也可以在其他环境中使用。

WebAssembly 是由 W3C 社区组 开发的开放标准。

本文档描述了 WebAssembly 核心标准的版本 2.0(草案 2024-12-18)。 预计未来将会有新的增量版本发布,包含更多的功能,逐步取代当前版本。

设计目标

WebAssembly 的设计目标如下:

  • 快速、安全和可移植的语义
    • 快速:执行速度接近本地代码,充分利用所有现代硬件的通用能力。
    • 安全:代码经过验证并在内存安全[2]的沙箱环境中执行,防止数据损坏或安全漏洞。
    • 明确定义:完全且精确地定义有效程序及其行为,易于从非正式和正式角度推理。
    • 硬件独立:可以在所有现代架构上进行编译,无论是桌面设备、移动设备还是嵌入式系统。
    • 语言独立:不偏向任何特定的编程语言、编程模型或对象模型。
    • 平台独立:可以嵌入浏览器中,作为独立虚拟机运行,或集成到其他环境中。
    • 开放:程序可以以简单和通用的方式与其环境互操作。
  • 高效且可移植的表示
    • 紧凑:采用二进制格式,比典型的文本或原生代码格式更小,传输速度更快。
    • 模块化:程序可以拆分为更小的部分,这些部分可以单独传输、缓存和使用。
    • 高效:可以在一次快速的解码、验证和编译过程中完成,无论是使用即时编译(JIT)还是提前编译(AOT)。
    • 可流式处理:允许在数据全部接收之前,尽早开始解码、验证和编译。
    • 可并行化:允许将解码、验证和编译过程分割成多个独立的并行任务。
    • 可移植:不依赖于任何不广泛支持的架构假设,适用于现代硬件。

WebAssembly 代码还旨在便于检查和调试,尤其是在像网页浏览器这样的环境中,但此类功能超出了本规范的讨论范围。

注解:

  • [1] “WebAssembly”的缩写,不是首字母缩略词,因此不使用全大写。
  • [2] 没有程序能够破坏 WebAssembly 的内存模型。当然,它不能保证编译为 WebAssembly 的不安全语言不会破坏其自身的内存布局,例如在 WebAssembly 的线性内存中。

适用范围

从本质上讲,WebAssembly 是一种虚拟指令集架构(虚拟 ISA)。 因此,它具有多种用途,可以嵌入到许多不同的环境中。 为了涵盖这些多样性并实现最大程度的重用,WebAssembly 规范被分为多个文档,并按层次进行组织。

本文档关注的是 WebAssembly 的核心 ISA 层。 它定义了指令集、二进制编码、验证和执行语义,以及文本表示。 然而,它并没有定义 WebAssembly 程序如何与其执行的特定环境交互,也没有定义它们如何从该环境中被调用。

相反,本规范通过其他文档加以补充,这些文档定义了与特定嵌入环境(如 Web)的接口。 每个文档将定义一个适用于特定环境的 WebAssembly 应用程序接口(API)。

安全性考虑

WebAssembly 不提供对执行代码的计算环境的直接访问。 与环境的任何交互,如输入输出、资源访问或操作系统调用,必须通过调用嵌入者提供的函数,这些函数被导入到 WebAssembly 模块中。 嵌入者可以通过控制或限制其为导入提供的功能能力,建立适合特定环境的安全策略。 这些安全性考虑是嵌入者的责任,并且是特定环境 API 定义的内容。

由于 WebAssembly 旨在被转换为直接在宿主硬件上运行的机器代码,因此它可能容易受到硬件层面的侧信道攻击。 在存在此类风险的环境中,嵌入者可能需要采取适当的缓解措施,以隔离 WebAssembly 的计算过程。

依赖关系

WebAssembly 依赖于两个现有的标准:

  • IEEE 754,用于浮点数据的表示以及相应数值操作的语义。
  • Unicode,用于表示导入/导出名称和文本格式。

然而,为了使本规范自包含,本规范对上述标准相关方面进行了定义和重整(如浮点值的二进制表示和舍入、Unicode 字符的值范围和 UTF-8 编码)。