WebAssembly

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索
WebAssembly
WebAssembly Logo.png
型付け 静的
影響を受けた言語 asm.js英語版, PNaCl
ライセンス Apache License
ウェブサイト webassembly.org
拡張子 .wast, .wasm

WebAssembly(略してwasmなどとも)は、低水準バイトコードの形式(フォーマット)の一つで、ウェブブラウザ内で動く(JavaScriptからの発展系として)クライアントサイドスクリプトを主な対象としている[1]。業界メディアなどは[2]「ゲームなどをネイティブ並に高速実行する」などと煽動している[3]。2017年現在開発が進められており、最初の目標としてCC++からのコンパイルをサポートすることを目指している[4]他、Rustといった他のプログラミング言語のサポートも進められている[5]

設計[編集]

バイトコードであるため、JavaScriptなどのように構文解析が必要ない。むしろ以前のJavaにおけるアイディアに近いというか、そのものである。実行モデルがポータブルなスタックマシン[6]であるという点もやはりJavaを思い出させる点である。

歴史[編集]

WebAssemblyの最初のアナウンスは2015年6月17日に行われ[7]2016年3月15日には主要ブラウザ (Firefox, Chromium, Google Chrome, Microsoft Edge) 上でUnityによるAngry Botsというデモが行われた[8][9][10]

2017年3月7日には、WebAssemblyに標準対応した初のブラウザとなるFirefox 52.0がリリースされた[3]

開発[編集]

WebAssemblyサポートの初期実装は、既存のasm.js英語版PNaClをベースとしている[11][12]。必要最低限の機能のみを持つ製品 (MVP) がリリースされた後、次いでガベージコレクション (GC) の対応を行い、JavaC#といったGCを持つ言語をサポート対象に加えることが計画されている[13]。WebAssemblyの開発はMozillaマイクロソフトGoogleアップルといった主要ブラウザメーカーの開発者により行われている[12]

フォーマット[編集]

WebAssemblyコミュニティグループは、複数のブラウザにおいて最初 (MVP) のバイナリフォーマットのリリース候補とJavaScript APIを実装している[14]

WebAssemblyのバイナリフォーマットはそのまま人間が読めるようには設計されていない。その代り、人間が読めるリニアアセンブリバイトコード (Linear Assembly Bytecode) と呼ばれる既存のアセンブリ言語に相当するようなフォーマットが用意されている。

以下に、C言語のソースコードが、wasmのリニアアセンブリバイトコードとバイナリにそれぞれ変換された例を示す。

C(変換元) リニアアセンブリバイトコード
(中間表現)
WASMバイナリフォーマット
(16進数で表記)
int factorial(int n) {
  if (n == 0)
    return 1;
  else
    return n * factorial(n-1);
}
get_local 0
i64.const 0
i64.eq
if i64
    i64.const 1
else
    get_local 0
    get_local 0
    i64.const 1
    i64.sub
    call 0
    i64.mul
end
20 00
42 00
51
04 7e
42 01
05
20 00
20 00
42 01
7d
10 00
7e
0b

[15]

内部的には、wasmコンパイラシステムは中間コードを扱うためにS式を使用している。サンプルを以下に示す。[16]

(module
  (memory 256 256)
  (export "memory" memory)
  (type $FUNCSIG$dd (func (param f64) (result f64)))
  (import $exp "global.Math" "exp" (param f64) (result f64))
  (export "doubleExp" $doubleExp)
  (func $doubleExp (param $0 f64) (result f64)
    (f64.mul
      (call_import $exp
        (get_local $0)
      )
      (f64.const 2)
    )
  )
)

ツール[編集]

  • Emscripten - 元々asm.js向けであったが、その後、WebAssemblyにも対応した。C言語/C++からWebAssemblyへのコンパイルでは、フロントエンドにclangもしくはそのforkであるfastcomp-clangを、中間層にLLVMもしくはそのforkであるfastcompを、バックエンドにbinaryen (後述)を使用する[17]。なお、LLVMのWebAssembly実装とFastcompのWebAssembly実装は別物となっている。
  • GCC asm.js backend - asm.js及びWebAssemblyに対応している[18]

フロントエンド[編集]

  • LLVM - WebAssemblyバックエンドを持っているものの、2017年3月現在、WebAssemblyバイナリの出力にはBinaryenのs2wasm及びwasm-asが必要となる。LLVM 5.0でWebAssemblyバイナリの出力に対応する予定。

バックエンド[編集]

  • Binaryen
    • asm2wasm - asm.jsからWebAssemblyテキストへのコンバータ[17]
    • s2wasm - LLVMのWebAssembly用テキストアセンブリ (*.s)からWebAssemblyテキストへのコンバータ[17]
    • mir2wasm - Rust言語の中間レベルIR (MIR)からWebAssemblyテキストへのコンバータ[17]
    • wasm-as - WebAssemblyテキストからWebAssemblyバイナリへのコンバータ。

脚注[編集]

  1. ^ 英語版の記述「WebAssembly or wasm is a low-level bytecode format for in-browser client-side scripting, evolved from JavaScript.」
  2. ^ 例によって
  3. ^ a b Firefox、ゲームなどをネイティブ並に高速実行する「WebAssembly」を採用”. Impress Watch (2017年3月8日). 2017年3月11日閲覧。
  4. ^ WebAssembly High-Level Goals”. GitHub / WebAssembly / design (2015年12月11日). 2017年3月11日閲覧。
  5. ^ Announcing Rust 1.14” (2016年12月22日). 2017年3月11日閲覧。
  6. ^ Design Rationale”. GitHub / WebAssembly / design (2016年10月1日). 2017年3月11日閲覧。
  7. ^ Launch bug” (2015年6月11日). 2017年3月11日閲覧。
  8. ^ Wagner, Luke (2016年3月14日). “A WebAssembly Milestone: Experimental Support in Multiple Browsers”. 2017年3月11日閲覧。
  9. ^ Thompson, Seth (2016年3月15日). “Experimental support for WebAssembly in V8”. 2017年3月11日閲覧。
  10. ^ Zhu, Limin (2016年3月15日). “Previewing WebAssembly experiments in Microsoft Edge”. 2017年3月11日閲覧。
  11. ^ WebAssembly: a binary format for the web”. ②ality – JavaScript and more (2015年6月18日). 2017年3月11日閲覧。
  12. ^ a b Bright, Peter (2015年6月18日). “The Web is getting its bytecode: WebAssembly”. Ars Technica. Condé Nast. 2017年3月11日閲覧。
  13. ^ WebAssembly/design”. 2015年12月28日閲覧。
  14. ^ Roadmap - WebAssembly”. 2017年1月27日閲覧。
  15. ^ サンプルのソースコードはGitHubのWebAssemblyプロジェクトより https://github.com/WebAssembly/design/blob/master/TextFormat.md
  16. ^ http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/
  17. ^ a b c d https://github.com/WebAssembly/binaryen
  18. ^ https://github.com/pipcet/asmjs/blob/everything/asmjs.org

関連項目[編集]

外部リンク[編集]