WebAssembly
パラダイム | 式指向 |
---|---|
最新リリース | 2.0 / 2022年6月1日[1] |
型付け | 静的 |
影響を受けた言語 | asm.js, PNaCl |
ライセンス | Apache License |
ウェブサイト | webassembly.org |
拡張子 | .wast, .wasm |
WebAssemblyは、ウェブブラウザのクライアントサイドスクリプトとして動作するプログラミング言語(低水準言語)である。wasmとも称されており、ブラウザ上でバイナリフォーマットの形で実行可能であることを特徴とする[2]。2017年現在開発が進められており、最初の目標としてCとC++からのコンパイルをサポートすることを目指している[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) の対応を行い、JavaやC#といった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
|
内部的には、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
脚注
- ^ 出典URL: https://github.com/WebAssembly/spec/releases/tag/opam-2.0.0, 閲覧日: 2023年2月11日, 題名: Release 2.0, 出版日: 2022年6月1日
- ^ a b “Firefox、ゲームなどをネイティブ並に高速実行する「WebAssembly」を採用”. Impress Watch (2017年3月8日). 2017年3月11日閲覧。
- ^ a b “WebAssembly High-Level Goals”. GitHub / WebAssembly / design (11 December 2015). 2017年3月11日閲覧。
- ^ “Announcing Rust 1.14”. The Rust Programming Language Blog (22 December 2016). 2017年3月11日閲覧。
- ^ “Design Rationale”. GitHub / WebAssembly / design (1 October 2016). 2017年3月11日閲覧。
- ^ “Launch bug”. GitHub / WebAssembly / design (11 June 2015). 2017年3月11日閲覧。
- ^ Wagner, Luke (14 March 2016). “A WebAssembly Milestone: Experimental Support in Multiple Browsers”. Mozilla Hacks. 2017年3月11日閲覧。
- ^ Thompson, Seth (15 March 2016). “Experimental support for WebAssembly in V8”. V8 Blog. 2017年3月11日閲覧。
- ^ Zhu, Limin (15 March 2016). “Previewing WebAssembly experiments in Microsoft Edge”. Microsoft Edge dev blog. 2017年3月11日閲覧。
- ^ 長岡弥太郎 (2017年11月14日). “WebAssemblyが主要ブラウザでサポート - Mozilla official blog”. マイナビニュース. 2017年11月14日閲覧。
- ^ “WebAssembly: a binary format for the web”. ②ality – JavaScript and more (18 June 2015). 2017年3月11日閲覧。
- ^ a b Bright, Peter (18 June 2015). “The Web is getting its bytecode: WebAssembly”. Ars Technica. Condé Nast. 2017年3月11日閲覧。
- ^ “WebAssembly/design”. GitHub. 28 December 2015閲覧。
- ^ “Roadmap - WebAssembly”. webassembly.org. 2017年1月27日閲覧。
- ^ サンプルのソースコードはGitHubのWebAssemblyプロジェクトより https://github.com/WebAssembly/design/blob/master/TextFormat.md
- ^ http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/
- ^ a b c d https://github.com/WebAssembly/binaryen
- ^ https://github.com/pipcet/asmjs/blob/everything/asmjs.org