什么是 WebAssembly?

WebAssembly(wasm)是一种简单的机器模型和具有广泛规范的可执行格式。它被设计成可移植的、紧凑的,甚至接近本机速度执行。

作为一种编程语言,WebAssembly由两种表示相同结构的格式组成:

  1. 使用 .wat 后缀 (wat 是 “WebAssembly Text”) 使用S表达式,与 Scheme 和 Clojure 等 Lisp 语言家族有些相似。

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

作为参考,以下是 wat 中的阶乘函数:

  1. (module
  2. (func $fac (param f64) (result f64)
  3. local.get 0
  4. f64.const 1
  5. f64.lt
  6. if (result f64)
  7. f64.const 1
  8. else
  9. local.get 0
  10. local.get 0
  11. f64.const 1
  12. f64.sub
  13. call $fac
  14. f64.mul
  15. end)
  16. (export "fac" (func $fac)))

如果你对 wasm 文件的风格感兴趣,可以将 wat2wasm demo 与上述代码一起使用。

线性存储器

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

WebAssembly 只能运行在浏览器吗?

尽管 wasm 目前在 JavaScript 和 Web 社区中引起了广泛的关注,但它并没有对其宿主环境做出任何假设。因此,推测 wasm 将成为一种“可移植的可执行文件”格式是有意义的,它将在未来的各种上下文中使用。然而,到目前为止,wasm 主要与 JavaScript(JS)相关,JavaScript 有多种 runtime(包括浏览器和 Node.JS)。