WebAssembly

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Jump to navigation Jump to search
WebAssembly Logo.png
パラダイム 式指向英語版
最新リリース 1.0 / 10月 18, 2017[1]
型付け 静的
影響を受けた言語 asm.js英語版, PNaCl
ライセンス Apache License
ウェブサイト webassembly.org
拡張子 .wast, .wasm
テンプレートを表示

WebAssemblyは、ウェブブラウザのクライアントサイドスクリプトとして動作するプログラミング言語低水準言語)である。wasmとも称されており、ブラウザ上でバイナリフォーマットの形で実行可能であることを特徴とする[2]2017年現在開発が進められており、最初の目標としてCC++からのコンパイルをサポートすることを目指している[3]他、Rustがバージョン1.14以降で[4]Goがバージョン1.11以降で[5]対応するなど、他のプログラミング言語のサポートも進められている。

設計[編集]

WebAssemblyはポータブルなスタックマシン[6]であり、既存のウェブブラウザで広く用いられているJavaScriptと比べ、構文解析と実行が高速になるよう設計されている[3]

歴史[編集]

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がリリースされた[2]。2017年11月、MozillaはSafariとEdgeがWebAssemblyに対応したと発表し、すでに対応しているChromeとFirefoxを含め、主要なブラウザすべてでサポートされることになった[11]

開発[編集]

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

フォーマット[編集]

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

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

[16]

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

(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 (後述)を使用する[18]。なお、LLVMのWebAssembly実装とFastcompのWebAssembly実装は別物となっている。
  • GCC asm.js backend - asm.js及びWebAssemblyに対応している[19]

フロントエンド[編集]

  • LLVM - WebAssemblyバックエンドを持ち、WebAssemblyバイナリを出力できる。また、LLDによるWebAssemblyバイナリのリンクも実装された。

バックエンド[編集]

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

統合開発環境[編集]

  • WebAssembly Studio - WebベースのWebAssembly向け開発環境。C言語及びRustに対応している。オープンソース[20]

アプリケーションフレームワーク[編集]

  • Qt for WebAssembly - アプリケーションフレームワークのQtをWebAssemblyに移植したもの。2018年4月現在、テクノロジープレビュー。

脚注[編集]

  1. ^ 出典URL: https://github.com/WebAssembly/spec/releases/tag/v1.0, 閲覧日: 9月 19, 2018, 題名: Release 1.0, 出版日: 10月 18, 2017
  2. ^ a b Firefox、ゲームなどをネイティブ並に高速実行する「WebAssembly」を採用”. Impress Watch (2017年3月8日). 2017年3月11日閲覧。
  3. ^ a b WebAssembly High-Level Goals”. GitHub / WebAssembly / design (2015年12月11日). 2017年3月11日閲覧。
  4. ^ Announcing Rust 1.14”. The Rust Programming Language Blog (2016年12月22日). 2017年3月11日閲覧。
  5. ^ Go 1.11 is released”. The Go Blog (2018年8月24日). 2018年10月4日閲覧。
  6. ^ Design Rationale”. GitHub / WebAssembly / design (2016年10月1日). 2017年3月11日閲覧。
  7. ^ Launch bug”. GitHub / WebAssembly / design (2015年6月11日). 2017年3月11日閲覧。
  8. ^ Wagner, Luke (2016年3月14日). “A WebAssembly Milestone: Experimental Support in Multiple Browsers”. Mozilla Hacks. 2017年3月11日閲覧。
  9. ^ Thompson, Seth (2016年3月15日). “Experimental support for WebAssembly in V8”. V8 Blog. 2017年3月11日閲覧。
  10. ^ Zhu, Limin (2016年3月15日). “Previewing WebAssembly experiments in Microsoft Edge”. Microsoft Edge dev blog. 2017年3月11日閲覧。
  11. ^ 長岡弥太郎 (2017年11月14日). “WebAssemblyが主要ブラウザでサポート - Mozilla official blog”. マイナビニュース. 2017年11月14日閲覧。
  12. ^ WebAssembly: a binary format for the web”. ②ality – JavaScript and more (2015年6月18日). 2017年3月11日閲覧。
  13. ^ a b Bright, Peter (2015年6月18日). “The Web is getting its bytecode: WebAssembly”. Ars Technica. Condé Nast. 2017年3月11日閲覧。
  14. ^ WebAssembly/design”. GitHub. 2015年12月28日閲覧。
  15. ^ Roadmap - WebAssembly”. webassembly.org. 2017年1月27日閲覧。
  16. ^ サンプルのソースコードはGitHubのWebAssemblyプロジェクトより https://github.com/WebAssembly/design/blob/master/TextFormat.md
  17. ^ http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/
  18. ^ a b c d https://github.com/WebAssembly/binaryen
  19. ^ https://github.com/pipcet/asmjs/blob/everything/asmjs.org
  20. ^ Aw, all grown up: Mozilla moves WebAssembly into sparsely furnished Studio apartment The Register 2018年4月11日

関連項目[編集]

外部リンク[編集]