Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20170216-WebAssembly

chikoski
February 17, 2017

 20170216-WebAssembly

This slide deck will give us an overview of WebAssembly as well as a brief introduction of compiling C / C++ codes into WASM with Emscripten.

chikoski

February 17, 2017
Tweet

More Decks by chikoski

Other Decks in Technology

Transcript

  1. 清水智公 (Noritada Shimizu / @chikoski) • Mozilla Japan テクニカルマーケティング •

    Developer relationship • asm.js / WebAssembly / HTML5 games / Rust / Devtools • Mozilla Developer Network / Firefox for iOS • html5j Webプラットフォーム部 / html5j ゲーム部 / "We are JavaScripters"
 Rust 初心者 LT 会 / Rust programmers' meetup • 慶應義塾大学環境情報学部非常勤講師
  2. Proudly non-profit, Mozilla makes products like Firefox with a mission

    to keep the power of the Web in the hands of users everywhere. Mozilla Mission (https://www.mozilla.org/en-US/mission/)
  3. • WebAssembly(WASM)の特徴 • 高速で高効率な実行 • ポータブル • 安全 • テキストフォーマット有り

    • 他のWeb技術と組み合わせて利用できる • W3Cのコミュニティグループで仕様を議論
 https://www.w3.org/community/webassembly/ WebAssembly:Web向けの新しいバイナリフォーマット
  4. WASM+UI部分をHTMLで提供 • Vimをエディタとして利用 • ゲームエンジン • エミュレーター 全てをWASMで作り込む • ゲーム

    • CAD • VR / AR 速度向上のためにWASMを利用 • VPN、リモートデスクトップ • 音声 / 動画コーデック • 画像処理 IUUQTIFMQTBLVSBBEKQIDKBBSUJDMFT7/$&#&#&#%&#$&"#&&"&"&&#
  5. • 型付きスタックマシンの提供する命令で 関数を定義します • 利用できるデータ型: i32, i64, f32, f64 •

    関数本体は抽象構文木として、
 code section に記述されます • type section には、関数のシグネチャが 記述されます WASMはモジュールを定義します IUUQTSTNTNFXBTNJOUSP
  6. • a = 1 + 2 * 3 は、
 このように表現されます

    • スタックマシンの命令 • set_local • i32.add • i32.mul • i32.const WASMで定義される抽象構文木
  7. NPEVMF  GVODBEE5ISFF QBSBNJ  SFTVMUJ   MPDBMBJ 

     TFU@MPDBMB JBEE JDPOTU  JNVM JDPOTU  JDPOTU   HFU@MPDBM   HFU@MPDBMB   JBEE   FYQPSUBEE5ISFF GVODBEE5ISFF  WAST:WASM のテキスト表現
  8. NPEVMF  UZQF   GVOD QBSBNJ  SFTVMUJ 

     GVOD   UZQF  QBSBNJ  SFTVMUJ  HFU@MPDBM JDPOTU JBEE   FYQPSUBEE4PNF GVOD コンパイラによって最適化されたもの
  9. • バイト単位(8ビット)でアクセスできる線形メモリ
 ヒープ領域 / データ領域 • リトルエンディアン • 最大サイズは 4GiB(1ページ64KiB、32ビット分)

    • 演算子を利用してサイズを増やせます • grow_memory 演算子でサイズを増やせます • current_memory 演算子で現在のサイズを取得できます • JavaScriptからはArrayBuffer として見えます 線形メモリ:WASMのメモリモデル ,J#  BEESFTT@TQBDF@NBY
  10.  GVODIJ QBSBNJ   JTUPSFPGGTFU  HFU@MPDBM  

    JDPOTU     JTUPSFBMJHO  HFU@MPDBM   JDPOTU     SFUVSO   文字列はメモリ上の数列として扱われます I J = CVG WPJEIJ DIBS CVG \ CVG<>I CVG<>J CVG<>= ^
  11. DPOTUJNQPSU0CKFDU\ IFMMP DPOTPMFMPH )FMMP  ^ GFUDI TBNQMFXBTN UIFO SFTQPOTFSFTQPOTFBSSBZ#VGGFS

     UIFO CVGGFS8FC"TTFNCMZJOTUBOUJBUF CVGGFS JNQPSU0CKFDU  UIFO \NPEVMF JOTUBODF^  DPOTPMFMPH JOTUBODFFYQPSUTBEE4PNF   WASM のロード
  12. • オープンソースのトランスコンパイラ • MIT License • University of Illinois/NCSA Open

    Source License • C / C++ をコンパイルして asm.js や
 WASM を出力します • WASMをロードするJSも一緒に出力します • http://emscripten.org/
  13. Emscriptenで乗り越えられるC / C++ とWebのギャップ 項目 Emscriptenの対処 標準ライブラリ (libc / libc++)

    Emscriptenがlibc/libc++をコンパイルしてリンク リンク static link / dynamic link ファイルシステム POSIX ファイルシステムをエミュレート アセット JSに埋め込み / XHRへ変換 OpenGL WebGLに変換
  14. FYUFSOWPJEIS WPJE  TOJQ IS  QSJOUG IFMMPXPSME  IS

     外部関数の実装をJavaScriptで与えられます DPOTUISGVODUJPO \ DPOTPMFMPH   ^ NFSHF*OUP -JCSBSZ.BOBHFSMJCSBSZ \ ISIS ^ 
  15. DPOTUBEE.PEVMFDXSBQ BEE OVNCFS <OVNCFS>  DPOTUTVNBEE    DPOTPMFMPH

    TVN  .PEVMFDXSBQӼහӠҽӒӑѬԐԕԡՅդ԰ҿӶӉ㕉ᡔӼහӣӵӲҰӕӔӴӨӃ エキスポートされた関数の利用
  16. JOUNBJO \ XIJMF USVF \ UJDL  ^ ^ ビジーループはemscripten_set_main_loopで書き換える

    JODMVEFFNTDSJQUFOI JOUNBJO \ FNTDSJQUFO@TFU@NBJO@MPPQ UJDL    ^
  17. JGFR  $$  &.4$3*15&/ FNDD   BTNT8"4. 

    %*45PEJTUJOEFYIUNM  PCKFDUTNBJOPJOJUGTP  -*#KTMJCSBSZMJCKT   1045+4QPTUKTQPTUKT  -%'-"(4 XBTN  -*#  %*45  1045+4  FOEJG Makefileの条件分岐:$(CC)の値で判断できます
  18. まとめ • WASMはプログラムのバイナリフォーマットで、高速で高効率、しかも安全に実行されます • C / C++ などから変換して作成するのが簡単です • Emscriptenを使うのが、王道です

    • 小さいモジュールなら手で書いて、wast2wasmで変換するのもよいでしょう • デバッグは気合が必要 • C / C++ の状態でできる限りデバッグをしておくとよいでしょう • WASMにした後は、printfデバッグになります