SlideShare uma empresa Scribd logo
1 de 19
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
おしまい
つづく

Mais conteúdo relacionado

Mais procurados

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

Mais procurados (16)

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

Destaque

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

Destaque (12)

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

Semelhante a Emscriptenと不思議のダンジョン

密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
Reproducebility 100倍 Dockerマン
Reproducebility 100倍 DockerマンReproducebility 100倍 Dockerマン
Reproducebility 100倍 DockerマンNagi Teramo
 
PasteHub at kansai emacs 9th
PasteHub at kansai emacs 9thPasteHub at kansai emacs 9th
PasteHub at kansai emacs 9thKiyoka Nishiyama
 
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)7shi
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話Kinuko Yasuda
 
とある Perl Monger の働き方
とある Perl Monger の働き方とある Perl Monger の働き方
とある Perl Monger の働き方Yusuke Wada
 
Turtle Graphicsで遊ぼう!
Turtle Graphicsで遊ぼう!Turtle Graphicsで遊ぼう!
Turtle Graphicsで遊ぼう!Arien Kakkowara
 
20230306_SD輪読&座談会#42_kitazaki.pdf
20230306_SD輪読&座談会#42_kitazaki.pdf20230306_SD輪読&座談会#42_kitazaki.pdf
20230306_SD輪読&座談会#42_kitazaki.pdfAyachika Kitazaki
 
Deep learning reading club @ nimiri for SWEST
Deep learning reading club @ nimiri for SWESTDeep learning reading club @ nimiri for SWEST
Deep learning reading club @ nimiri for SWESTKiyoshi Ogawa
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話侑弥 濱田
 
『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆5mingame2
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編Asami Abe
 
Sphinxの環境構築が再現できない問題をDockerで解決してみた
Sphinxの環境構築が再現できない問題をDockerで解決してみたSphinxの環境構築が再現できない問題をDockerで解決してみた
Sphinxの環境構築が再現できない問題をDockerで解決してみたStudy Group by SciencePark Corp.
 

Semelhante a Emscriptenと不思議のダンジョン (20)

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