「WebAssembly」の版間の差分
svg |
|||
58行目: | 58行目: | ||
|- |
|- |
||
| |
| |
||
< |
<syntaxhighlight lang="c"> |
||
int factorial(int n) { |
int factorial(int n) { |
||
if (n == 0) |
if (n == 0) |
||
65行目: | 65行目: | ||
return n * factorial(n-1); |
return n * factorial(n-1); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
|| |
|| |
||
< |
<syntaxhighlight lang="text"> |
||
get_local 0 |
get_local 0 |
||
i64.const 0 |
i64.const 0 |
||
81行目: | 81行目: | ||
i64.mul |
i64.mul |
||
end |
end |
||
</syntaxhighlight> |
|||
</source> |
|||
|| |
|| |
||
< |
<syntaxhighlight lang="text"> |
||
20 00 |
20 00 |
||
42 00 |
42 00 |
||
97行目: | 97行目: | ||
7e |
7e |
||
0b |
0b |
||
</syntaxhighlight> |
|||
</source> |
|||
|} |
|} |
||
104行目: | 104行目: | ||
内部的には、wasmコンパイラシステムは中間コードを扱うために[[S式]]を使用している。サンプルを以下に示す。<ref>http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/</ref> |
内部的には、wasmコンパイラシステムは中間コードを扱うために[[S式]]を使用している。サンプルを以下に示す。<ref>http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/</ref> |
||
< |
<syntaxhighlight lang="lisp"> |
||
(module |
(module |
||
(memory 256 256) |
(memory 256 256) |
||
120行目: | 120行目: | ||
) |
) |
||
) |
) |
||
</syntaxhighlight> |
|||
</source> |
|||
== ツール == |
== ツール == |
2020年7月5日 (日) 23:08時点における版
パラダイム | 式指向 |
---|---|
最新リリース | 2.0 / 2022年6月1日[1] |
型付け | 静的 |
影響を受けた言語 | asm.js, PNaCl |
ライセンス | Apache License |
ウェブサイト | webassembly.org |
拡張子 | .wast, .wasm |
WebAssemblyは、ウェブブラウザのクライアントサイドスクリプトとして動作するプログラミング言語(低水準言語)である。wasmとも称されており、ブラウザ上でバイナリフォーマットの形で実行可能であることを特徴とする[2]。2017年現在開発が進められており、最初の目標としてCとC++からのコンパイルをサポートすることを目指している[3]他、Rustがバージョン1.14以降で[4]、Goがバージョン1.11以降で[5]、Kotlin/Nativeがバージョン0.4以降で[6]で対応するなど、他のプログラミング言語のサポートも進められている。
設計
WebAssemblyはポータブルなスタックマシン[7]であり、既存のウェブブラウザで広く用いられているJavaScriptと比べ、構文解析と実行が高速になるよう設計されている[3]。
歴史
WebAssemblyの最初のアナウンスは2015年6月17日に行われ[8]、2016年3月15日には主要ブラウザ (Firefox, Chromium, Google Chrome, Microsoft Edge) 上でUnityによるAngry Botsというデモが行われた[9][10][11]。
2017年3月7日には、WebAssemblyに標準対応した初のブラウザとなるFirefox 52.0がリリースされた[2]。2017年11月、MozillaはSafariとEdgeがWebAssemblyに対応したと発表し、すでに対応しているChromeとFirefoxを含め、主要なブラウザすべてでサポートされることになった[12]。
2019-12-05にはW3C勧告「WebAssembly Core Specification」が策定され、WebAssemblyは正式なウェブ標準に認定された[13]。
開発
WebAssemblyサポートの初期実装は、既存のasm.jsとPNaClをベースとしている[14][15]。必要最低限の機能のみを持つ製品 (MVP) がリリースされた後、次いでガベージコレクション (GC) の対応を行い、JavaやC#といったGCを持つ言語をサポート対象に加えることが計画されている[16]。WebAssemblyの開発はMozilla、マイクロソフト、Google、アップルといった主要ブラウザメーカーの開発者により行われている[15]。
フォーマット
WebAssemblyコミュニティグループは、複数のブラウザにおいて最初 (MVP) のバイナリフォーマットのリリース候補とJavaScript APIを実装している[17]。
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式を使用している。サンプルを以下に示す。[19]
(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 (後述)を使用する[20]。なお、LLVMのWebAssembly実装とFastcompのWebAssembly実装は別物である。
- GCC asm.js backend - asm.js及びWebAssemblyに対応している[21]。
- LLVM - WebAssemblyバックエンドを持ち、WebAssemblyバイナリを直接出力できる。また、LLDによるWebAssemblyバイナリのリンクも可能。LLVM 8.0で正式に対応した[22]。
バックエンド
- Binaryen
- WABT
- wat2wasm - WebAssemblyテキストからWebAssemblyバイナリへのコンバータ。
- wasm-link - WebAssemblyバイナリのリンカー
統合開発環境
- WebAssembly Studio - WebベースのWebAssembly向け開発環境。C言語及びRustに対応している。オープンソース[23]。
アプリケーションフレームワーク
- Qt for WebAssembly - アプリケーションフレームワークのQtをWebAssemblyに移植したもの。2018年4月現在、テクノロジープレビュー。
Demo
脚注
- ^ 出典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日閲覧。
- ^ “Go 1.11 is released”. The Go Blog (24 August 2018). 2018年10月4日閲覧。
- ^ “Kotlin/Native v0.4 released: Objective-C interop, WebAssembly and more”. KOTLIN BLOG (16 November 2017). 2019年1月12日閲覧。
- ^ “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日閲覧。
- ^ 5 December 2019 — The World Wide Web Consortium (W3C) announced today that the WebAssembly Core Specification is now an official web standard, launching a powerful new language for the Web. W3C (2019). World Wide Web Consortium (W3C) brings a new language to the Web as WebAssembly becomes a W3C Recommendation.
- ^ “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
- ^ 「LLVM 8.0」登場、WebAssemblyを正式サポート OSDN 2019年3月22日
- ^ Aw, all grown up: Mozilla moves WebAssembly into sparsely furnished Studio apartment The Register 2018年4月11日