這是 Rust 和 WebAssembly 工作原理的未發佈文件,已發佈文件可見於 Rust 和 WebAssembly 文件主網站。在 Rust 和 WebAssembly 工具的發佈版本中可能無法使用在此記載的功能。

什麼是 WebAssembly?

WebAssembly (wasm) 是一個簡易的機器模型及可執行格式,並具有範例 規格。其設計目的為具備可攜性、精簡性,執行速度接近甚至等同原生速度。

WebAssembly 是一種程式語言,包含了兩種格式,用以表示相同的結構,儘管表達方式不同

  1. .wat 文字格式(簡稱為「WebAssembly Text」)使用 S-expression,與 Lisp 家族語言(例如 Scheme 和 Clojure)有些類似。

  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 上使用嗎?

雖然 WebAssembly 目前在 JavaScript 與 Web 社群中普遍受到關注,但 wasm 沒有對其寄存環境做出假設。因此可以推測 wasm 會在未來在各種情境中成為「可攜式可執行」格式。但到目前為止,wasm 主要與 JavaScript (JS) 有關,而且 JavaScript 有許多版本(包括 Web 和 Node.js)。