这是使用 Rust 和 WebAssembly 的未发布文档,已发布的文档可在 Rust 和 WebAssembly 主文档网站上找到 。此处记录的功能可能在 Rust 和 WebAssembly 工具的已发布版本中不可用。

什么是 WebAssembly?

WebAssembly (wasm) 是一种简单的机器模型和可执行格式,具有 广泛的规范 。它旨在可移植、紧凑,并在接近原生速度的情况下执行。

作为一种编程语言,WebAssembly 由两种格式组成,它们表示相同的结构,但方式不同。

  1. .wat 文本格式(称为 wat,代表“WebAssembly Text”)使用 S 表达式,与 Scheme 和 Clojure 等 Lisp 家族语言有些相似。

  2. .wasm 二进制格式是更低级的,旨在直接被 wasm 虚拟机使用。它在概念上类似于 ELF 和 Mach-O。

作为参考,以下是用 wat 编写的阶乘函数

(module
  (func $fac (param f64) (result f64)
    get_local 0
    f64.const 1
    f64.lt
    if (result f64)
      f64.const 1
    else
      get_local 0
      get_local 0
      f64.const 1
      f64.sub
      call $fac
      f64.mul
    end)
  (export "fac" (func $fac)))

如果您好奇 wasm 文件是什么样的,可以使用 wat2wasm 演示 和上面的代码。

线性内存

WebAssembly 具有非常简单的 内存模型。wasm 模块可以访问单个“线性内存”,它本质上是一个字节的扁平数组。这个 内存可以按页面大小(64K)的倍数增长。它不能缩小。

WebAssembly 只是用于 Web 吗?

尽管它目前在 JavaScript 和 Web 社区中引起了广泛关注,但 wasm 并没有对它的宿主环境做出任何假设。因此,可以推测 wasm 将成为一种“可移植可执行”格式,将来将在各种环境中使用。然而,截至今天,wasm 主要与 JavaScript (JS) 相关,JS 有很多变体(包括 Web 和 Node.js 上的变体)。