コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「WebAssembly」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Koavf (会話 | 投稿記録)
svg
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
58行目: 58行目:
|-
|-
|
|
<source lang="c">
<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>
||
||
<source lang="text">
<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>
||
||
<source lang="text">
<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>


<source lang="lisp">
<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年現在開発が進められており、最初の目標としてCC++からのコンパイルをサポートすることを目指している[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) の対応を行い、JavaC#といった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

[18]

内部的には、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
    • asm2wasm - asm.jsからWebAssemblyテキストへのコンバータ[20]
    • s2wasm - LLVMのWebAssembly用テキストアセンブリ (*.s)からWebAssemblyテキストへのコンバータ[20]
    • mir2wasm - Rust言語の中間レベルIR (MIR)からWebAssemblyテキストへのコンバータ[20]
    • wasm-as - WebAssemblyテキストからWebAssemblyバイナリへのコンバータ。
  • WABT
    • wat2wasm - WebAssemblyテキストからWebAssemblyバイナリへのコンバータ。
    • wasm-link - WebAssemblyバイナリのリンカー

統合開発環境

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

アプリケーションフレームワーク

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

Demo

  • Windows と共通の Widgets : [1] with NWSTK
  • 3D山岳地形生成 : [2] with NWSTK
  • jpg画像の読み込みと回転表示 : [3] with NWSTK

脚注

  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. ^ Go 1.11 is released”. The Go Blog (24 August 2018). 2018年10月4日閲覧。
  6. ^ Kotlin/Native v0.4 released: Objective-C interop, WebAssembly and more”. KOTLIN BLOG (16 November 2017). 2019年1月12日閲覧。
  7. ^ Design Rationale”. GitHub / WebAssembly / design (1 October 2016). 2017年3月11日閲覧。
  8. ^ Launch bug”. GitHub / WebAssembly / design (11 June 2015). 2017年3月11日閲覧。
  9. ^ Wagner, Luke (14 March 2016). “A WebAssembly Milestone: Experimental Support in Multiple Browsers”. Mozilla Hacks. 2017年3月11日閲覧。
  10. ^ Thompson, Seth (15 March 2016). “Experimental support for WebAssembly in V8”. V8 Blog. 2017年3月11日閲覧。
  11. ^ Zhu, Limin (15 March 2016). “Previewing WebAssembly experiments in Microsoft Edge”. Microsoft Edge dev blog. 2017年3月11日閲覧。
  12. ^ 長岡弥太郎 (2017年11月14日). “WebAssemblyが主要ブラウザでサポート - Mozilla official blog”. マイナビニュース. 2017年11月14日閲覧。
  13. ^ 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.
  14. ^ WebAssembly: a binary format for the web”. ②ality – JavaScript and more (18 June 2015). 2017年3月11日閲覧。
  15. ^ a b Bright, Peter (18 June 2015). “The Web is getting its bytecode: WebAssembly”. Ars Technica. Condé Nast. 2017年3月11日閲覧。
  16. ^ WebAssembly/design”. GitHub. 28 December 2015閲覧。
  17. ^ Roadmap - WebAssembly”. webassembly.org. 2017年1月27日閲覧。
  18. ^ サンプルのソースコードはGitHubのWebAssemblyプロジェクトより https://github.com/WebAssembly/design/blob/master/TextFormat.md
  19. ^ http://cultureofdevelopment.com/blog/build-your-first-thing-with-web-assembly/
  20. ^ a b c d https://github.com/WebAssembly/binaryen
  21. ^ https://github.com/pipcet/asmjs/blob/everything/asmjs.org
  22. ^ 「LLVM 8.0」登場、WebAssemblyを正式サポート OSDN 2019年3月22日
  23. ^ Aw, all grown up: Mozilla moves WebAssembly into sparsely furnished Studio apartment The Register 2018年4月11日

関連項目

外部リンク