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

20161203-emscripten

chikoski
January 10, 2017

 20161203-emscripten

chikoski

January 10, 2017
Tweet

More Decks by chikoski

Other Decks in Technology

Transcript

  1. /4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮׷8FC׾⡲׷⠓爡ד⫴ְגְתׅ ˖ 'JSFGPY 'JSFGPYGPSJ04 %FW5PPMT ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73 ˖

    فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅׷ךָ㥨ֹדׅ ˖ 㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ רֻךַ׿ִָ׷ְֹׁ׳ֲךفؚٗٓىؚٝ鎉铂ח
 ⠓ִ׷ך׾嚂׃׫ח׃גְתׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ
  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. To ensure the Internet is a global public resource, open

    and accessible to all. Mozilla Mission(https://www.mozilla.org/en-US/mission/)
  4. HTML5の成長と、NPAPIの終焉 • NPAPI (Netscape Plugin Application Programming Interface) • ブラウザープラグインに対して提供されるAPI

    • 利用例:Adobe Flash Player、Unity Web Player、Microsoft Sliverlight, etc • ブラウザーのできないことをプラグインで補完してきた • HTML5の成長によって、ブラウザーだけでできることが増えてきた • NPAPIはクラッシュや脆弱性の要因でもあった • NPAPIの廃止
  5. The Expanding World of Web Standard Technologies and Platforms ts

    - r r U r In r- f IETF Full- screen Brotli HTTP/2 TLS SSL URL HTTP Origin data URL Real-Time Communications Progressive Web Apps Extensible to Anything! Progressive Enhancement Device Control Game, VR & High Performance Apps Proxy Module QUIC Net Info CSP Beacon Navi. Timing DNT CORS block scope Class Gene- rators Itera- tors Collec- tions DOM UI Events File RDF RSS RDFa Indexed DB WOFF Shared Workers fetch Public Key Pinning HSTS Web Socket Protocol - Web Anima- tions Arrow Func. Pro- mise Template Literals ECMA Script 2015 CSS Snapshot 2015 HTML W3C HTML5 SIMD Khronos Async Func. Push Service Worker HTML Components Custom Elements Generic Sensor Blue- tooth USB Speech Media Recorder MIDI FIDO Game- pad Shared Mem. Web Assembly asm.js WebVR Typed Array WebGL Shadow DOM temp- lates EME vibra- tion Web Crypto Web Audio Orienta- tion WebRTC ORTC data channel Media Stream Battery Status Presen- tation Pointer Events Writing Mode Shapes Tran- sitions & Anima- tions Fonts Layout Media Queries text decora- tion trans- form Mask- ing Flex Box Filter User Inter- face Open Media Multi Column Permi- ssions Notifi- cations geo- location Page Visibility Web App Manifest Exclu- sions Grid Layout Math ML Quarks Mode SMIL SVG P PNG APNG OGP Opus H.264 VP10 WebM VP8 mp3 VP9 multi media Web Sockets API WHATWG Server- Sent ev. HTML5 Parser Elements & Syntax sections HTML5 Forms Canvas 2D Web Workers WAI- ARIA Content Model app cache Micro- data Web Storage
  6. プラットフォームへの要求 Web技術 高リフレッシュレート、ヘッドトラ ッキング WebVR API 低遅延性、小フットプリント asm.js / WebAssembly

    
 Web Workers / SharedArrayBuffer /Atomics 入力インタフェース Gamepad API 3D表現 WebGL / WebGL2 / Web Audio API キャッシュコントロール Service Worker / IndexedDB / IndexedDB2
  7. asm.js: JavaScriptの「低水準」なサブセット • 可能な処理 • 整数演算、浮動小数点演算 • 関数定義と呼び出し、関数表の利用 • Math

    オブジェクトに実装されている数学関数の呼び出し • 線形メモリへのバイト単位でのアクセス • JavaScriptからは、モジュールの定義関数として利用できます • FFIを利用したJavaScriptの関数呼び出し • 高度な最適化を可能にする型アノテーション
  8. asm.js function Peano(stdlib, ffi, heap){ "use asm"; function zero(){ return

    0; } function succ(a){ a = a | 0; return (a + 1) | 0; } return {zero: zero, succ: succ}; } asm.js によるモジュール定義例
  9. asm.js function someModule(stdlib, ffi, heap){ var memo = new stdlib.Uint32Array(heap);

    // snip function f(n){ if(memo[n >> 2] | 0 != 0){ return memo[n >> 2] | 0; } memo[n >> 2] = doSometing(n) | 0; } // snip メモリへのバイト単位でのアクセス
  10. Emscripten が提供する機能 • C / C++ で書かれたソースコードの asm.js へのコンパイル •

    標準ライブラリの提供 • libc / libc++ の asm.js へのコンパイル • OpenGL ES2 の WebGL 化 • 仮想的なファイルシステムの提供:memory FS / IndexedDB FS • 特別ファイルのエミュレーション、標準入出力 / 標準エラー出力のエミュレーション • コンパイルされたコードのJSへのエキスポート • emscripten.h
  11. コンパイルできるプログラムの制約 • 共有メモリーが必要なプログラムのポートはできません • 共有メモリーの機能がブラウザーに(まだ)実装されていないためです • message passingを行うようなプログラムは移植できます • ビッグエンディアンに依存するプログラムは、リトルエンディアンに書き換える必要

    があります • x86の環境に依存するものや、低水準な機能を利用したものの移植は難しいと思い ます • 64bitのintは利用できますが、asm.jsで利用できる整数型の上限は32bitなので遅 くなります • 例外を出力するコードも遅くなります
  12. フロントエンドでC/C++で書かれたコードを利用するパターン • ロジックの一部として利用する • 動機: 高速な処理が必要、C / C++ で書かれた資産を流用したい •

    利用方法:エキスポートされた関数を利用する / クラス定義を利用する • グラフィックフレームワークやゲームエンジンを利用してUIを構築する • 動機:OpenFrameworksを利用したい / SDL2 を利用したい • 利用方法:コンパイルしたコードと、canvas などの要素をコンポーネントとして 組み込む • 一から全部 C / C++ で書きたい
  13. C++ FYUFSO$\ VOTJHOFEJOUC VOTJHOFEJOUO \ JG O \ SFUVSO ^

    SFUVSOC O  C O  ^ ^ 関数のエキスポート:エキスポートする関数は、マングリングされないようにしておきます
  14. JS WBSC.PEVMFDXSBQ C OVNCFS <OVNCFS>  DPOTPMFMPH C  

    WBSSFTVMU.PEVMFDDBMM C  OVNCFS <OVNCFS>  <>  DPOTPMFMPH SFTVMU  エキスポートされた関数の利用: ccallで直接呼び出すか、cwrapでラッパーを作って利用します
  15. C++ WebIDL DMBTT1FBOP\ QVCMJD 1FBOP  JOUDVSSFOU  WPJETVD 

    ^ JOUFSGBDF1FBOP\ WPJE1FBOP  MPOHDVSSFOU  WPJETVD  ^ .h ファイルと、それに対応する WebIDL
  16. 外部関数の実装をJavaScriptで与えることも可能です • 実行時に実装が、ダイナミックリンクされるような関数に対して利用できます • 利用方法: • 実装をJavaScriptで与える関数を外部関数として宣言します • C /

    C++ コード内で、通常の関数と同様に利用します • library.js 内で、JavaScriptの関数を実装として登録します • 利用例 • データ通信部分の実装を、WebScoketを用いたもので与える • センサーの値取得をJavaScriptで行う
  17. JS JGEFG&.4$3*15&/ FNTDSJQUFO@TFU@NBJO@MPPQ VQEBUF"OJNBUJPO'SBNF   USVF  FMTF XIJMF

    USVF \ VQEBUF"OJNBUJPO'SBNF  VTMFFQ   ^ FOEJG ブラウザーの制限に合わせて、メインループの実装を切り替える必要があります
  18. C++ DPOTUTUETUSJOHVSMIUUQFYBNQMFDPNGPPCBS JGEFG&.4$3*15&/ FNTDSJQUFO@XHFU@BTZOD@EBUB VSMD@TUS /6--  POMPBE@DC POSSPS@DC 

    WPJEPOMPBE@DC WPJE BSH WPJE EBUB JOUTJ[F \ ^ WPJEPOFSSPS@DC WPJE BSH \^ FMTF )5513FTQOPTFSFTHFU VSM ֿֿך鿇ⴓכ黝䔲דׅ˘ FOE HTTP通信