WebAssemblyとは?

WebAssembly (wasm) とは単純な機械モデルと広範な仕様を伴った実行可能形式のことです。wasmはポータブルかつコンパクトで、ネイティブと同じかそれに近いスピードで実行されるように設計されています。

プログラミング言語として、WebAssemblyは方法は異なっているが同じ構造を表現する二つのフォーマットから成ります:

  1. .watテキストフォーマット ("WebAssembly Text"からwatと呼ばれます) はS式を使い、SchemeやClojureのようなLispファミリー言語との類似性があります。
  1. .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 demoを上のコードに使うことができます。

線形メモリ

WebAssemblyはとても単純なメモリモデルを持っています。wasmモジュールは一つの本質的にバイトのフラットな配列である「線形メモリ」にアクセスすることができます。このメモリはページサイズ (64K) の倍数で拡張することができます。縮小することはできません。

WebAssemblyはウェブだけのためのもの?

今のところ一般にJavaScriptとウェブのコミュニティに注目を集めていますが、wasmはホスト環境について一切の仮定をしません。それゆえ、wasmは将来様々な文脈で使用される「ポータブルな実行ファイル」形式になるというと推測するのは理にかなっています。しかし今現在、wasmはたいてい (ウェブ上やNode.js上のものを含めて) 多くの種類を持つJavaScript (JS) と関連付けられています。