Emscripten
と不思議のダンジョン
C++/Everywhere - おおっと! … SEGV!!
札幌C++勉強会 #8
2 0 1 4 - 1 2 - 2 7 T 1 6 : 0 0 + 0 9 : 0 0 / 2 0 1 4 - 1 2 - 2 7 T 1 6 : 3 0 + 0 9 : 0 0
U s a g i I t o < u s a g i @ W o n d e r R a b b i t P r o j e c t . n e t >
お知らせ:(C)ATLUS (C)SEGA Allrights reserved. // スクリーンショット引用元はそれぞれのオフィシャルウェブサイトです。
• 発売されます:
• 世界樹と不思議のダンジョン
• 世界樹の迷宮V
お疲れ様でした。
• 続きは余談です。
• I: Emscripten の紹介
• 1: Emscripten のはじめ方
• リポジトリーは?ドキュメントは?ほかの情報源は?
• 開発環境の準備の仕方
• 2: Emscripten で Hello, World!
• ソースを書いて翻訳: C++ --> LLVM-IR --> JS
• 実行: node.js, spidermonkey / Firefox, etc.
• II: Emscripten の迷宮へようこそ!
• 1: Emscripten 仕組みと構造
• 2: C++ ソースコードにおける翻訳器 em++ への特殊化
• 3: キミはこの奥へ進んでもいいし、一旦街へ引き返して万全を期してもいい
• 事例紹介 a: cross-platform mainloop の書き方
• 事例紹介 b: cross-platform std::future による非同期URLダウンローダーの書き方
わたしは誰?
• 伊藤 兎
• Facebook でいつでも会えます。 → https://www.facebook.com/usagi.wrp
• Twitter にも居ます。 → https://twitter.com/usagi_wrp
• GitHub で語り合いましょう。 → https://github.com/usagi
• OSS
• Emscripten の Authors のひとり。(いっぱいいる。いっしょにつくりましょう (*´∀`*) )
• おしごと
• さいきんは地球を作っています。(EmscriptenやClang++やMSVC++で。)
• くわしくは、うまくいったらまた来年☆(ゝω・)vキャピ
わたしは誰?
• 伊藤 兎
• Facebook でいつでも会えます。 → https://www.facebook.com/usagi.wrp
• Twitter にも居ます。 → https://twitter.com/usagi_wrp
• GitHub で語り合いましょう。 → https://github.com/usagi
• 贈り物はこちらです。 → http://www.amazon.co.jp/registry/wishlist/2ZTSIH6FEUAV0
• お茶が好きです。
• 青茶は大禹嶺・阿里山あたりの金萱、武夷岩茶、紅茶は阿薩姆、緑茶は八女が喜ばれます。
• 辛いものが好きです。
• 激辛というのはブレアーズ・サドンデスソースやアカハチ・辛すぎホットソースくらいの事を言います。
I: Emscripten の紹介
その始め方と"Hello, World!"にいたるまで
Emscripten とは?
C++
• .hxx
• .cxx
em++
• LLVM-IR
• js-runtime
JS
• .js (asm.js)
• .html
• C++のソースコードを
• somthing.hxx
• something.cxx
• em++ (≈g++, clang++, cl++)
• LLVMバックエンド(≈技術魔法)を利用して
• jsの実行時ライブラリーと結合しつつ
• JavaScriptへ
• 翻訳☆(ゝω・)vキャピ
• std, boost, etc. → おおよそ使えます!
• glDrawArrays, etc. → WebGL1 へ!
• SDL2, GLFW3, → いろいろあるけど使えます!
Emscripten の何が嬉しいことか?
C++
• 強力な翻訳器
• さいきょークラスの自動最適化
• 呪文: -O3 -arch=native
• 高い可搬性
• + Emscripten/Web
• 強力なライブラリー
• 超兵器(あーてぃふぁくと)
• マ・ク・ロ, メモリー操作, テンプレート
JavaScript
• 10年間も進化できなかった可哀
想な言語仕様
• 悲しみのECMA4
• ムズカシイ言語機能
• ダック・タイピング
• this コンテキスト問題
• 普及しなかったレアなOOP機構
• プロトタイプベースのOOP
• 基本的にシングルファイル
• インタープリター風味
• 氾濫した Web API
I.1: Emscripten の始め方
• ドキュメント(≈新オフィシャルウェブサイト)
• http://kripken.github.io/emscripten-site/
• いまのところ完全に英語
• ちょっと余裕できたら個人的に → emscripten.jp とかやろうかとは考えています。
• だいたいの表向きの事はここにしっかりと書いてある
• よほど深い階層へ潜ろうとしなければアンドキュメント仕様やAPIの心配は不要
• ・・・たまにドキュメントが最近の仕様変更に追い付いて居ない罠はあります。
• <emscripten/emscripten.h>読みましょう。そうしましょう (*´∀`*)
• github (≈ソースコードとTiDD開発のオンライン拠点)
• https://github.com/kripken/emscripten
• wiki(≈旧オフィシャルウェブサイト&ドキュメンテーション)
• ほかに新標準の翻訳器の repos などもある
kripken こと Alon Zakai は
Mozilla の Researcher で
Emscripten 開発のボス
MIT License
I.1: Emscripten の始め方
• 開発環境の準備
• NG
• Ubuntu-14.10: emscripten/utopic-1.10.0
• GOOD
• arch-AUR: emscripten, emscripten-git
• Homebrew: Emscripten
• Better(Official Method)
• The Emscripten SDK
• Windows, OSX, GNU/Linux
• Building Emscripten from Source
• 開発者向け・いますぐ最新版を試したい方向け
旧過ぎ!
仕様変更・バグ修正
たくさん
通常は
この方法で!
まあまあ
保守されていそう
素人にはおすすめし
ないけど、それほど
難しくないよ!
I.1: Emscripten の始め方
Web Installer なら
ドキュメントが未更新で
1.25.0
とか書いてあっても
その時点での最新版を
インストール
してくれます。
I.1: Emscripten の始め方
<Win-key>
"EmscriptenCommand Prompt"emsdk
emcc --version
すでに使えます!
emcc が invalid syntax と
か言ったら、emsdkとは
別にpython3が居る可能
性を疑いましょう。
I.2: Emscripten で Hello, World!
• mkdir hello
• cd hello
• vim hello.cxx
• em++ -o hello.js hello.cxx
• node hello.js
• em++ -o hello.html hello.cxx
• ( access to "hello.html" with modern graphical web browser as you like )
標準出力はここへ。
標準エラー出力だと
js-console へ。
II: Emscripten の迷宮へようこそ!
Emscriptenの迷宮の入り口を少しだけ歩いてみましょう
II.1: Emscripten の仕組みと構造
• emscripten // .cxx --> .js
• 実行時にリンクされているライブラリーはどこにある?
• emscripten/system
• bin, include, lib, local/include
• emscripten/emscripten.h
• libcxx/array
• GLFW/glfw3.h
• GL
• emscripten/src
• library_gl.js
• library_glfw3.js
C++コードレベル
から直接扱うのは
ここらへんに
翻訳された .js に
リンクされるのは
ここらへんに
ライブラリーが
挙動不審な時は
疑う余地アリ
II.1: Emscripten の仕組みと構造
• もっと濃ゆい仕組みについて
• asm.js への最適化
• LLVM-backend
• emscripten-fastcomp
• 実行時のARM風OPコードと仮想マシン
• x86ではない(メモリーアライメントに触れるような低レベル処理は落ちる可能性がある)
• emscripten-ports (パッケージ管理システム)
• SDL2はこの仕組みで対応を実験中の最初の例
• <thread> と WebWorker と 共有メモリー と 例外ポインター
• Firefox との協調、 Chromium/pNaCl の成果の取り込み
次回もお楽しみに♡
II.2: C++ ソースコードにおける
翻訳器 em++ への特殊化
• #ifndef EMSCRIPTEN
• em++ を使うと自動的に定義される CPP マクロ
• em++ と他のツールチェインや非Webプラットフォーム向けとの実装分岐に使う
• 可搬性を損なわない為にはこれが必要となる機能は独立したライブラリーとして実装詳
細を隠蔽する方針を個人的にはおすすめします
• embind // ref.
• C++ の関数やクラスのシンボルを JavaScript からシームレスにそれらしく扱うための
FFI 機構
• EM_ASM & emscripten_run_script // ref.
• インライン・アセンブラーを模して .cxx 内で JS コードを em++ にとっての機械語と見
做して実行する最終手段的な機能。戻り値を C++ コードへ得ることも可能
II.3: 事例紹介
• 事例紹介
• a: cross-platform mainloop の書き方
• ref: wonderland.subsystem の 一部構造
• b: cross-platform std::future による非同期URLダウンローダーの書き方
• wonderland.loader
• ref: https://github.com/usagi/wonderland.loader
• c: cross-platform read/write 可能な簡易ストレージの書き方
• wonderland.storage
• ref: https://github.com/usagi/wonderland.storage
• ほか、時間があれば
• GLFW3 等の高級ラッパーライブラリー wonderland.subsystem
• ref: https://github.com/usagi/wonderland.subsystem
おしまい
つづく

More Related Content

PDF
C++11やemscriptenと付き合って1年間の振り返り
PDF
Goをえらんだ理由
PDF
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
PDF
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PDF
Webフレームワークパネル(Django) at PyConJP 2012
PDF
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
PDF
Rust v1.0 release celebration party
PDF
Btrfsで壊してもいい環境づくり
C++11やemscriptenと付き合って1年間の振り返り
Goをえらんだ理由
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
Webフレームワークパネル(Django) at PyConJP 2012
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
Rust v1.0 release celebration party
Btrfsで壊してもいい環境づくり

What's hot (16)

PDF
簡単!Groovy入門
PPT
RubyKaigi2011の雰囲気
PDF
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
PPT
PDF
20101211 gunma.web#3 LanguaGegenerationLoss
PDF
5分でわかる静的解析入門
PDF
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
PDF
なんとかStormに負けたくないEmacs初級篇
PDF
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
PDF
TypeScript 独習会
PDF
Crystal 勉強会 #5 in 渋谷 発表資料
PDF
「プログラミングGroovy」入門(公開用)
PDF
Firefox OS勉強会 2nd TypeScript+AngularJS
PPTX
Chrome-eject がこの先生きのこるには
PDF
TypeScript 入門してみる
PDF
Crystalを触り始めてから起こったこと
簡単!Groovy入門
RubyKaigi2011の雰囲気
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
20101211 gunma.web#3 LanguaGegenerationLoss
5分でわかる静的解析入門
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
なんとかStormに負けたくないEmacs初級篇
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 独習会
Crystal 勉強会 #5 in 渋谷 発表資料
「プログラミングGroovy」入門(公開用)
Firefox OS勉強会 2nd TypeScript+AngularJS
Chrome-eject がこの先生きのこるには
TypeScript 入門してみる
Crystalを触り始めてから起こったこと
Ad

Viewers also liked (12)

PDF
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
PDF
UnrealEngineが5日間でasm.js化できたと聞いた俺たちは…
PDF
asm.jsとWebAssemblyって実際なんなの?
PDF
Webの未来 〜 PNaClとasm.jsでカワルミライ - いま、モバイルWebの先端で起こっていること
PPTX
SDL2の紹介
PDF
とある会社のエンジニアたちのAndroidへのフリーダムな取り組み
KEY
Android好きがWindows Phone開発を始めてみた / 12.04.23 Bar Windows Phone LT
PDF
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
PDF
この3D全盛時代にもう一度考えたい2Dゲームのこと
PPTX
Javaにおけるネイティブコード連携の各種手法の紹介
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
PDF
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
UnrealEngineが5日間でasm.js化できたと聞いた俺たちは…
asm.jsとWebAssemblyって実際なんなの?
Webの未来 〜 PNaClとasm.jsでカワルミライ - いま、モバイルWebの先端で起こっていること
SDL2の紹介
とある会社のエンジニアたちのAndroidへのフリーダムな取り組み
Android好きがWindows Phone開発を始めてみた / 12.04.23 Bar Windows Phone LT
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
この3D全盛時代にもう一度考えたい2Dゲームのこと
Javaにおけるネイティブコード連携の各種手法の紹介
Java開発の強力な相棒として今すぐ使えるGroovy
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
Ad

Similar to Emscriptenと不思議のダンジョン (20)

PDF
密着!わたしのコンソールアプリ開発環境
PPTX
Reproducebility 100倍 Dockerマン
PDF
PasteHub at kansai emacs 9th
PDF
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PDF
とある Perl Monger の働き方
PDF
Turtle Graphicsで遊ぼう!
PDF
20230306_SD輪読&座談会#42_kitazaki.pdf
PDF
PDF
俺とHeartbleed
PPTX
Net fringejp2016
PDF
Deep learning reading club @ nimiri for SWEST
PDF
邪道Jenkins
PDF
PHP7をDockerで動かしたという話
PDF
『こなへん』ができるまで ☆リリース直前編☆
KEY
PlayFramework1.x基礎編
PDF
Mishimasyk6 iwatobipen
PPTX
Sphinxの環境構築が再現できない問題をDockerで解決してみた
密着!わたしのコンソールアプリ開発環境
Reproducebility 100倍 Dockerマン
PasteHub at kansai emacs 9th
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
ng-japan 2015 TypeScript+AngularJS 1.3
C++でCプリプロセッサを作ったり速くしたりしたお話
とある Perl Monger の働き方
Turtle Graphicsで遊ぼう!
20230306_SD輪読&座談会#42_kitazaki.pdf
俺とHeartbleed
Net fringejp2016
Deep learning reading club @ nimiri for SWEST
邪道Jenkins
PHP7をDockerで動かしたという話
『こなへん』ができるまで ☆リリース直前編☆
PlayFramework1.x基礎編
Mishimasyk6 iwatobipen
Sphinxの環境構築が再現できない問題をDockerで解決してみた

Emscriptenと不思議のダンジョン

  • 1. Emscripten と不思議のダンジョン C++/Everywhere - おおっと! … SEGV!! 札幌C++勉強会 #8 2 0 1 4 - 1 2 - 2 7 T 1 6 : 0 0 + 0 9 : 0 0 / 2 0 1 4 - 1 2 - 2 7 T 1 6 : 3 0 + 0 9 : 0 0 U s a g i I t o < u s a g i @ W o n d e r R a b b i t P r o j e c t . n e t >
  • 2. お知らせ:(C)ATLUS (C)SEGA Allrights reserved. // スクリーンショット引用元はそれぞれのオフィシャルウェブサイトです。 • 発売されます: • 世界樹と不思議のダンジョン • 世界樹の迷宮V
  • 3. お疲れ様でした。 • 続きは余談です。 • I: Emscripten の紹介 • 1: Emscripten のはじめ方 • リポジトリーは?ドキュメントは?ほかの情報源は? • 開発環境の準備の仕方 • 2: Emscripten で Hello, World! • ソースを書いて翻訳: C++ --> LLVM-IR --> JS • 実行: node.js, spidermonkey / Firefox, etc. • II: Emscripten の迷宮へようこそ! • 1: Emscripten 仕組みと構造 • 2: C++ ソースコードにおける翻訳器 em++ への特殊化 • 3: キミはこの奥へ進んでもいいし、一旦街へ引き返して万全を期してもいい • 事例紹介 a: cross-platform mainloop の書き方 • 事例紹介 b: cross-platform std::future による非同期URLダウンローダーの書き方
  • 4. わたしは誰? • 伊藤 兎 • Facebook でいつでも会えます。 → https://www.facebook.com/usagi.wrp • Twitter にも居ます。 → https://twitter.com/usagi_wrp • GitHub で語り合いましょう。 → https://github.com/usagi • OSS • Emscripten の Authors のひとり。(いっぱいいる。いっしょにつくりましょう (*´∀`*) ) • おしごと • さいきんは地球を作っています。(EmscriptenやClang++やMSVC++で。) • くわしくは、うまくいったらまた来年☆(ゝω・)vキャピ
  • 5. わたしは誰? • 伊藤 兎 • Facebook でいつでも会えます。 → https://www.facebook.com/usagi.wrp • Twitter にも居ます。 → https://twitter.com/usagi_wrp • GitHub で語り合いましょう。 → https://github.com/usagi • 贈り物はこちらです。 → http://www.amazon.co.jp/registry/wishlist/2ZTSIH6FEUAV0 • お茶が好きです。 • 青茶は大禹嶺・阿里山あたりの金萱、武夷岩茶、紅茶は阿薩姆、緑茶は八女が喜ばれます。 • 辛いものが好きです。 • 激辛というのはブレアーズ・サドンデスソースやアカハチ・辛すぎホットソースくらいの事を言います。
  • 7. Emscripten とは? C++ • .hxx • .cxx em++ • LLVM-IR • js-runtime JS • .js (asm.js) • .html • C++のソースコードを • somthing.hxx • something.cxx • em++ (≈g++, clang++, cl++) • LLVMバックエンド(≈技術魔法)を利用して • jsの実行時ライブラリーと結合しつつ • JavaScriptへ • 翻訳☆(ゝω・)vキャピ • std, boost, etc. → おおよそ使えます! • glDrawArrays, etc. → WebGL1 へ! • SDL2, GLFW3, → いろいろあるけど使えます!
  • 8. Emscripten の何が嬉しいことか? C++ • 強力な翻訳器 • さいきょークラスの自動最適化 • 呪文: -O3 -arch=native • 高い可搬性 • + Emscripten/Web • 強力なライブラリー • 超兵器(あーてぃふぁくと) • マ・ク・ロ, メモリー操作, テンプレート JavaScript • 10年間も進化できなかった可哀 想な言語仕様 • 悲しみのECMA4 • ムズカシイ言語機能 • ダック・タイピング • this コンテキスト問題 • 普及しなかったレアなOOP機構 • プロトタイプベースのOOP • 基本的にシングルファイル • インタープリター風味 • 氾濫した Web API
  • 9. I.1: Emscripten の始め方 • ドキュメント(≈新オフィシャルウェブサイト) • http://kripken.github.io/emscripten-site/ • いまのところ完全に英語 • ちょっと余裕できたら個人的に → emscripten.jp とかやろうかとは考えています。 • だいたいの表向きの事はここにしっかりと書いてある • よほど深い階層へ潜ろうとしなければアンドキュメント仕様やAPIの心配は不要 • ・・・たまにドキュメントが最近の仕様変更に追い付いて居ない罠はあります。 • <emscripten/emscripten.h>読みましょう。そうしましょう (*´∀`*) • github (≈ソースコードとTiDD開発のオンライン拠点) • https://github.com/kripken/emscripten • wiki(≈旧オフィシャルウェブサイト&ドキュメンテーション) • ほかに新標準の翻訳器の repos などもある kripken こと Alon Zakai は Mozilla の Researcher で Emscripten 開発のボス MIT License
  • 10. I.1: Emscripten の始め方 • 開発環境の準備 • NG • Ubuntu-14.10: emscripten/utopic-1.10.0 • GOOD • arch-AUR: emscripten, emscripten-git • Homebrew: Emscripten • Better(Official Method) • The Emscripten SDK • Windows, OSX, GNU/Linux • Building Emscripten from Source • 開発者向け・いますぐ最新版を試したい方向け 旧過ぎ! 仕様変更・バグ修正 たくさん 通常は この方法で! まあまあ 保守されていそう 素人にはおすすめし ないけど、それほど 難しくないよ!
  • 11. I.1: Emscripten の始め方 Web Installer なら ドキュメントが未更新で 1.25.0 とか書いてあっても その時点での最新版を インストール してくれます。
  • 12. I.1: Emscripten の始め方 <Win-key> "EmscriptenCommand Prompt"emsdk emcc --version すでに使えます! emcc が invalid syntax と か言ったら、emsdkとは 別にpython3が居る可能 性を疑いましょう。
  • 13. I.2: Emscripten で Hello, World! • mkdir hello • cd hello • vim hello.cxx • em++ -o hello.js hello.cxx • node hello.js • em++ -o hello.html hello.cxx • ( access to "hello.html" with modern graphical web browser as you like ) 標準出力はここへ。 標準エラー出力だと js-console へ。
  • 15. II.1: Emscripten の仕組みと構造 • emscripten // .cxx --> .js • 実行時にリンクされているライブラリーはどこにある? • emscripten/system • bin, include, lib, local/include • emscripten/emscripten.h • libcxx/array • GLFW/glfw3.h • GL • emscripten/src • library_gl.js • library_glfw3.js C++コードレベル から直接扱うのは ここらへんに 翻訳された .js に リンクされるのは ここらへんに ライブラリーが 挙動不審な時は 疑う余地アリ
  • 16. II.1: Emscripten の仕組みと構造 • もっと濃ゆい仕組みについて • asm.js への最適化 • LLVM-backend • emscripten-fastcomp • 実行時のARM風OPコードと仮想マシン • x86ではない(メモリーアライメントに触れるような低レベル処理は落ちる可能性がある) • emscripten-ports (パッケージ管理システム) • SDL2はこの仕組みで対応を実験中の最初の例 • <thread> と WebWorker と 共有メモリー と 例外ポインター • Firefox との協調、 Chromium/pNaCl の成果の取り込み 次回もお楽しみに♡
  • 17. II.2: C++ ソースコードにおける 翻訳器 em++ への特殊化 • #ifndef EMSCRIPTEN • em++ を使うと自動的に定義される CPP マクロ • em++ と他のツールチェインや非Webプラットフォーム向けとの実装分岐に使う • 可搬性を損なわない為にはこれが必要となる機能は独立したライブラリーとして実装詳 細を隠蔽する方針を個人的にはおすすめします • embind // ref. • C++ の関数やクラスのシンボルを JavaScript からシームレスにそれらしく扱うための FFI 機構 • EM_ASM & emscripten_run_script // ref. • インライン・アセンブラーを模して .cxx 内で JS コードを em++ にとっての機械語と見 做して実行する最終手段的な機能。戻り値を C++ コードへ得ることも可能
  • 18. II.3: 事例紹介 • 事例紹介 • a: cross-platform mainloop の書き方 • ref: wonderland.subsystem の 一部構造 • b: cross-platform std::future による非同期URLダウンローダーの書き方 • wonderland.loader • ref: https://github.com/usagi/wonderland.loader • c: cross-platform read/write 可能な簡易ストレージの書き方 • wonderland.storage • ref: https://github.com/usagi/wonderland.storage • ほか、時間があれば • GLFW3 等の高級ラッパーライブラリー wonderland.subsystem • ref: https://github.com/usagi/wonderland.subsystem