可移植性

WebAssembly 的 二进制格式 旨在在各种操作系统和指令集体系结构上高效执行,在 Web 上在 Web 之外

高效执行的假设

尽管 有限、局部、非确定性,但无法提供以下特征的执行环境仍然可以执行 WebAssembly 模块。 在某些情况下,它们可能需要模拟主机硬件或操作系统不提供的行为,以便 WebAssembly 模块如同支持该行为一样执行。 这有时会导致性能低下。

随着 WebAssembly 标准化的推进,我们预计将正式确定这些要求,以及 WebAssembly 如何适应 WebAssembly 最初设计时不存在的新平台。

WebAssembly 可移植性假定执行环境提供以下特征

  • 8 位字节。
  • 以字节内存粒度寻址。
  • 支持未对齐内存访问或可靠的陷阱,允许软件模拟。
  • 32 位和可选的 64 位的二进制补码有符号整数。
  • IEEE 754-2008 32 位和 64 位浮点数,除了 一些例外
  • 小端字节序。
  • 可以使用 32 位指针或索引高效寻址的内存区域。
  • wasm64 还支持 大于 4 GiB 的线性内存,使用 64 位指针或索引
  • 在 WebAssembly 模块与在同一台机器上执行的其他模块或进程之间强制执行安全隔离。
  • 提供对所有执行线程(即使在以非并行方式执行时)的前进保证的执行环境。
  • 当自然对齐时,提供 8、16 和 32 位访问的无锁原子内存运算符。 至少必须包含原子比较和交换运算符(或等效的 load-linked/store-conditional)。
  • wasm64 还要求当自然对齐时,提供 64 位访问的无锁原子内存运算符。

API

WebAssembly 不指定任何 API 或系统调用,只指定一个 导入机制,其中可用的导入集由主机环境定义。 在 Web 环境中,功能通过 Web 平台 定义的 Web API 访问。 非 Web 环境可以选择实现标准 Web API、标准非 Web API(例如 POSIX)或发明自己的 API。

源代码级别

可以通过对标准 API(例如 POSIX)进行编程并在编译时(通过 #ifdef)或运行时(通过 特性检测 和动态 加载/链接)依赖编译器和/或库将标准接口映射到主机环境的可用导入来实现 C/C++ 级别的可移植性。