什么是 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)
    local.get 0
    f64.const 1
    f64.lt
    if (result f64)
      f64.const 1
    else
      local.get 0
      local.get 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 上的)。