コンテンツにスキップ

WebAssembly

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。有足魚 (会話 | 投稿記録) による 2017年11月14日 (火) 11:45個人設定で未設定ならUTC)時点の版 (歴史)であり、現在の版とは大きく異なる場合があります。

パラダイム 式指向英語版
最新リリース 2.0 / 2022年6月1日[1]
型付け 静的
影響を受けた言語 asm.js英語版, PNaCl
ライセンス Apache License
ウェブサイト webassembly.org
拡張子 .wast, .wasm
テンプレートを表示

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

設計

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

歴史

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

2017年3月7日には、WebAssemblyに標準対応した初のブラウザとなるFirefox 52.0がリリースされた[2]。2017年11月、MozillaはSafariとEdgeがWebAssemblyに対応したと発表し、すでに対応しているChromeとFirefoxを含め、主要なブラウザすべてでサポートされることになった[10]

開発

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. ^ 出典URL: https://github.com/WebAssembly/spec/releases/tag/opam-2.0.0, 閲覧日: 2023年2月11日, 題名: Release 2.0, 出版日: 2022年6月1日
  2. ^ a b Firefox、ゲームなどをネイティブ並に高速実行する「WebAssembly」を採用”. Impress Watch (2017年3月8日). 2017年3月11日閲覧。
  3. ^ a b WebAssembly High-Level Goals”. GitHub / WebAssembly / design (11 December 2015). 2017年3月11日閲覧。
  4. ^ Announcing Rust 1.14”. The Rust Programming Language Blog (22 December 2016). 2017年3月11日閲覧。
  5. ^ Design Rationale”. GitHub / WebAssembly / design (1 October 2016). 2017年3月11日閲覧。
  6. ^ Launch bug”. GitHub / WebAssembly / design (11 June 2015). 2017年3月11日閲覧。
  7. ^ Wagner, Luke (14 March 2016). “A WebAssembly Milestone: Experimental Support in Multiple Browsers”. Mozilla Hacks. 2017年3月11日閲覧。
  8. ^ Thompson, Seth (15 March 2016). “Experimental support for WebAssembly in V8”. V8 Blog. 2017年3月11日閲覧。
  9. ^ Zhu, Limin (15 March 2016). “Previewing WebAssembly experiments in Microsoft Edge”. Microsoft Edge dev blog. 2017年3月11日閲覧。
  10. ^ 長岡弥太郎 (2017年11月14日). “WebAssemblyが主要ブラウザでサポート - Mozilla official blog”. マイナビニュース. 2017年11月14日閲覧。
  11. ^ WebAssembly: a binary format for the web”. ②ality – JavaScript and more (18 June 2015). 2017年3月11日閲覧。
  12. ^ a b Bright, Peter (18 June 2015). “The Web is getting its bytecode: WebAssembly”. Ars Technica. Condé Nast. 2017年3月11日閲覧。
  13. ^ WebAssembly/design”. GitHub. 28 December 2015閲覧。
  14. ^ Roadmap - WebAssembly”. webassembly.org. 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

関連項目

外部リンク