Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
祐司 伊藤
PDF, PPTX
17,765 views
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
CMU #29の発表資料です。 emscriptenを利用して、C/C++アプリをHTML化する具体的な手法についてです。
Software
◦
Read more
28
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 34
2
/ 34
3
/ 34
4
/ 34
5
/ 34
6
/ 34
7
/ 34
8
/ 34
9
/ 34
10
/ 34
11
/ 34
12
/ 34
13
/ 34
14
/ 34
15
/ 34
16
/ 34
17
/ 34
18
/ 34
19
/ 34
20
/ 34
21
/ 34
22
/ 34
23
/ 34
24
/ 34
25
/ 34
26
/ 34
27
/ 34
28
/ 34
29
/ 34
30
/ 34
31
/ 34
32
/ 34
33
/ 34
34
/ 34
More Related Content
PDF
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
by
UnityTechnologiesJapan002
PDF
Dockerfile を書くためのベストプラクティス解説編
by
Masahito Zembutsu
PDF
MagicOnion入門
by
torisoup
PPTX
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
by
Game Tools & Middleware Forum
PPTX
shared_ptrとゲームプログラミングでのメモリ管理
by
DADA246
PDF
文字コードに起因する脆弱性とその対策(増補版)
by
Hiroshi Tokumaru
PPTX
アプリ起動時間高速化 ~推測するな、計測せよ~
by
gree_tech
PDF
怖くないSpring Bootのオートコンフィグレーション
by
土岐 孝平
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
by
UnityTechnologiesJapan002
Dockerfile を書くためのベストプラクティス解説編
by
Masahito Zembutsu
MagicOnion入門
by
torisoup
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
by
Game Tools & Middleware Forum
shared_ptrとゲームプログラミングでのメモリ管理
by
DADA246
文字コードに起因する脆弱性とその対策(増補版)
by
Hiroshi Tokumaru
アプリ起動時間高速化 ~推測するな、計測せよ~
by
gree_tech
怖くないSpring Bootのオートコンフィグレーション
by
土岐 孝平
What's hot
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
Dockerを支える技術
by
Etsuji Nakai
PDF
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
by
Drecom Co., Ltd.
PDF
WebAssemblyのWeb以外のことぜんぶ話す
by
Takaya Saeki
PDF
Docker Compose 徹底解説
by
Masahito Zembutsu
PDF
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
PPTX
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
by
DeNA
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
PDF
UniRx完全に理解した
by
torisoup
PDF
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
by
Unity Technologies Japan K.K.
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
PPTX
C#や.NET Frameworkがやっていること
by
信之 岩永
PPTX
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
by
Haruki Yano
PDF
BuildKitの概要と最近の機能
by
Kohei Tokunaga
PPTX
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
PDF
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
by
Yoshiki Hayama
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
Dockerを支える技術
by
Etsuji Nakai
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
by
Drecom Co., Ltd.
WebAssemblyのWeb以外のことぜんぶ話す
by
Takaya Saeki
Docker Compose 徹底解説
by
Masahito Zembutsu
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
by
DeNA
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
UniRx完全に理解した
by
torisoup
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
by
Unity Technologies Japan K.K.
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
C#や.NET Frameworkがやっていること
by
信之 岩永
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
by
Haruki Yano
BuildKitの概要と最近の機能
by
Kohei Tokunaga
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
by
Yoshiki Hayama
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
Similar to emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
PDF
Webブラウザで使えるいろんな処理系
by
祐司 伊藤
PPTX
Alt#0x008 2017/5/20
by
Koki Natsume
PPTX
Emscripten使ってみた
by
Yuusuke Jinguuji
PPTX
Emscriptenと不思議のダンジョン
by
兎 伊藤
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
by
hecomi
PDF
Practical Emscripten - Mozilla Vision 2012
by
ushiroad
PDF
C++11やemscriptenと付き合って1年間の振り返り
by
paosidufgythrj
DOCX
Boost勉強会 #10 ディスカッションまとめ
by
Sigureya
PPTX
webアプリケーションフレームワークの話
by
Yoshihiro Ura
PDF
JSオジサン openframeworks emscripten
by
minoru nakanou
PDF
UnrealEngineが5日間でasm.js化できたと聞いた俺たちは…
by
Kei Nakazawa
PDF
asm.js x emscripten: The foundation of the next level Web games
by
Noritada Shimizu
PDF
NPAPIを使ったandroid標準ブラウザの拡張方法
by
Naruto TAKAHASHI
PDF
emruby: ブラウザで動くRuby
by
mametter
PPTX
資料1
by
fu____n
PDF
Intel xdk導入とhtml5サンプルビルド手順書
by
Yukio Saito
PPT
Llでゆるふわプログラミングのすすめ
by
mizcki
KEY
Objc lambda
by
matuura_core
PPTX
C# 7.2 with .NET Core 2.1
by
信之 岩永
PDF
C#, C/CLI と CUDAによる画像処理ことはじめ
by
NVIDIA Japan
Webブラウザで使えるいろんな処理系
by
祐司 伊藤
Alt#0x008 2017/5/20
by
Koki Natsume
Emscripten使ってみた
by
Yuusuke Jinguuji
Emscriptenと不思議のダンジョン
by
兎 伊藤
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
by
hecomi
Practical Emscripten - Mozilla Vision 2012
by
ushiroad
C++11やemscriptenと付き合って1年間の振り返り
by
paosidufgythrj
Boost勉強会 #10 ディスカッションまとめ
by
Sigureya
webアプリケーションフレームワークの話
by
Yoshihiro Ura
JSオジサン openframeworks emscripten
by
minoru nakanou
UnrealEngineが5日間でasm.js化できたと聞いた俺たちは…
by
Kei Nakazawa
asm.js x emscripten: The foundation of the next level Web games
by
Noritada Shimizu
NPAPIを使ったandroid標準ブラウザの拡張方法
by
Naruto TAKAHASHI
emruby: ブラウザで動くRuby
by
mametter
資料1
by
fu____n
Intel xdk導入とhtml5サンプルビルド手順書
by
Yukio Saito
Llでゆるふわプログラミングのすすめ
by
mizcki
Objc lambda
by
matuura_core
C# 7.2 with .NET Core 2.1
by
信之 岩永
C#, C/CLI と CUDAによる画像処理ことはじめ
by
NVIDIA Japan
More from 祐司 伊藤
PDF
Container Storage Interface のすべて
by
祐司 伊藤
PDF
C/C++とWebAssemblyを利用したライブラリ開発
by
祐司 伊藤
PDF
C++からWebRTC (DataChannel)を利用する
by
祐司 伊藤
PDF
詳説WebAssembly
by
祐司 伊藤
PDF
シンプル Processing !
by
祐司 伊藤
PDF
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
by
祐司 伊藤
PDF
PROCESS WARP
by
祐司 伊藤
PDF
PROCESS WARP
by
祐司 伊藤
PDF
PIAXで作る P2Pネットワーク
by
祐司 伊藤
PDF
新しい分散実行の仕組み PROCESS WARPについて
by
祐司 伊藤
Container Storage Interface のすべて
by
祐司 伊藤
C/C++とWebAssemblyを利用したライブラリ開発
by
祐司 伊藤
C++からWebRTC (DataChannel)を利用する
by
祐司 伊藤
詳説WebAssembly
by
祐司 伊藤
シンプル Processing !
by
祐司 伊藤
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
by
祐司 伊藤
PROCESS WARP
by
祐司 伊藤
PROCESS WARP
by
祐司 伊藤
PIAXで作る P2Pネットワーク
by
祐司 伊藤
新しい分散実行の仕組み PROCESS WARPについて
by
祐司 伊藤
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
1.
emscriptenでC/C++プログラムを webブラウザから使うまでの 難所攻略 伊藤 祐司 2015/6/20 Creators
MeetUp #29
2.
自己紹介 伊藤 祐司 バックエンドの設計 開発 フレームワークの作成
バイナリ・テキスト変換 クローラー アルゴリズム 仮想マシン 下北沢OSSカフェでPROCESS WARPというシステムを作っています http://www.processwarp.org/ GitHub llamerada-jp facebook ito.yuuji blog http://llamerad-jp.hatenablog.com/
3.
背景・動機 PROCESS WARP 複数のマシンを接続し、プロセス転送(ライブマイ グレーション)機能を持ったアプリ実行基盤 webブラウザ、Linux、Unix上で専用VMを実行
4.
背景・動機 PROCESS WARPのコアプログラムをweb上でも動かして手 軽に使ってもらいたいけど開発に時間は掛けたくない CORE SOURCE (C++) C/C++ compiler emscripten
5.
実際にやる前に インストールからハローワールド HTML側のカスタマイズ JavaScriptとC/C++の連携 ポインタと文字列
6.
http://emscripten.org/ C/C++からJavaScriptへのコンパイル(コンバート)を行 うアプリケーション C/C++のコードをLLVM IR経由でJavaScriptへ変換 標準C/C++ライブラリ, POSIX,
SDL, OpenGLが使える C/C++でブラウザアプリケーションが作れる! Alon Zakai (kripken)
7.
LLVM http://llvm.org/ コンパイラ基盤、コンパイラの共通機能(最適化など)をパッケージ 化したもの clang C/C++/Objective-C/swiftコンパイラ LLILC .netからの変換
by Microsoft https://github.com/dotnet/llilc その他、gnuコンパイラをフロントエンドとし多数の言語を処理可能 Fortran, Ada, Go http://dragonegg.llvm.org 開発が非常に活発 Chris Lattner
8.
コンパイルの流れ LLVM Optimizer Clang dragon egg original frontend C/C++ Obj-C Swift Fortran Ada Go original language -emit-llvm x86 backend ARM backend iPhone Android Raspberry Pi PC objectfile for
9.
LLVMとemscripten LLVM Optimizer Clang C/C++ emscripten JavaScript!
10.
できないこと マルチスレッド ソケット通信 アセンブラ 他、JavaScriptでできないこと 主要モダンブラウザではだいたい動くけどそれぞれ制 限事項(特にIE)がある http://kripken.github.io/emscripten-site/docs/ porting/guidelines/browser_limitations.html
11.
実際にやる前に インストールからハローワールド HTML側のカスタマイズ JavaScriptとC/C++の連携 ポインタと文字列
12.
インストール方法 LinuxやOSXではPortable SDKを使うのが一番良い renv, nodebrewのように複数バージョンを依存アプリ (clang,
node.js)込みでよしなに管理してくれる https://kripken.github.io/emscripten-site/docs/ getting_started/downloads.html $ tar vzxf emsdk-protable.tar.gz $ cd emsdk_portable $ ./emsdk install latest $ ./emsdk activate latest $ source emsdk_env.sh 実行前に環境変数を設定 デフォルトのコンパイラがemsdk のインストールしたclangになる console
13.
Hello world // emscriptenのヘッダファイル #include
<emscripten.h> int main(int argc, char* argv[]) { printf("hello world.”); return 0; } hello.c $ emcc hello.c -o hello.html console hello.html hello.js
14.
こんにちわ
15.
実際にやる前に インストールからハローワールド HTML側のカスタマイズ JavaScriptとC/C++の連携 ポインタと文字列
16.
こんにちわ
17.
見た目を変える emsdk/emscripten/<バージョン>/src/ shell_minimal.html をもとにHTMLをカスタム $ emcc
hello.c --shell-file custom.html -o hello.html console
18.
見た目を変える #canvas OpenGLを使わないなら消してし まって構わない #output Module.printからテキストが出力 されている 他もJavaScript部分と整合性を取 りながら変更してOK {{ SCRIPT }}がscriptタグに変換 される
19.
HTMLの生成をやめる デザイン変更のたびにコンパイルするのは面倒 <script async type="text/javascript" src="hello.js">とModuleがあればHTMLは直接 編集したい $
emcc hello.c -o hello.js console hello.js
20.
実際にやる前に インストールからハローワールド HTML側のカスタマイズ JavaScriptとC/C++の連携 ポインタと文字列
21.
ループを作る main内で無限ループを回すとブラウザへ処理が戻らない 普通のJavaScriptであればsetTimeout emscripten_set_main_loop(<関数>, <FPS>, true);を利用 #include
<emscripten.h> void main_loop() { // メイン処理をココに } int main(int argc, char* argv[]) { // 初期化処理とか // メインループを登録 emscripten_set_main_loop(main_loop, 0, true); return 0; } C/C++
22.
emscriptenとネイティブ でコードを切り替える #include <emscripten.h> void main_loop()
{ // メイン処理をココに } int main(int argc, char* argv[]) { // 初期化処理とか #ifdef EMSCRIPTEN // メインループを登録 emscripten_set_main_loop(main_loop, 0, true); #else // メインループを呼び出し while(true) main_loop(); #endif return 0; } C/C++ emscriptenでコンパイルする場合、EMSCRIPTENが 定義される
23.
C/C++からJavaScriptを 呼び出す インラインアセンブラはJavaScriptとして実行される (固定機能) void emscripten_run_script(<JavaScript>);で渡した 文字列をJavaScriptとして実行 JavaScriptのeval();のような動作 int emscripten_run_script_int(); std::string
emscripten_run_script_string(); int r = emscripten_run_script_int("screen.width"); C/C++
24.
JavaScriptから C/C++関数を呼び出す embind機能でJavaScriptから呼び出す関数を指定しておく 引数、戻り値は変換される(※構造体はNG) https://kripken.github.io/emscripten-site/docs/ porting/connecting_cpp_and_javascript/ embind.html#built-in-type-conversions #include <math.h> #include <emscripten.h> #include
<emscripten/bind.h> // ヘッダ using namespace emscripten; // 名前空間 double _pow(double a, int b) { return pow(a, b); } EMSCRIPTEN_BINDINGS(mod) { function("c_pow", &_pow); // Module.c_pow(); } sample.cpp
25.
JavaScriptから C/C++関数を呼び出す sample.jsが読み込まれた後から利用可能になるので、 onloadの中などでは利用できない コンパイルオプションに-s EXPORT_ALL=1を指定すると 全ての関数がexportされるがjsファイルが巨大になる $ em++
sample.cpp --bind -o sample.js console var p = Module.c_pow(3.14, 2); JavaScript
26.
Makefileの利用 emcmake, emconfigure, emmakeを利用すると、普通のアプリ ケーションをemscriptenでコンパイルできる 未対応のライブラリに依存していたりすると上手く動かない CC,
CXX, 他の環境変数などをemscripten用に書き換えている $ ememake cmake . $ emconfigure configure $ emmake make console
27.
実際にやる前に インストールからハローワールド HTML側のカスタマイズ JavaScriptとC/C++の連携 ポインタと文字列
28.
int value1 =
1192; // 0x04a8 short value2 = 758; // 0x02f6 char value3 = -1; // 0xff char value4 = 99; // 0x63 メモリ空間 emscriptenでは、C/C++の変数をArrayBufferで作った擬似 的なメモリ空間に保存している Module.HEAPU8などDataViewでアクセスできる ビッグエンディアン C/C++ 00 00 04 a8 02 f6 ff 63 Memory …… … …
29.
ポインタ ポインタ = 先頭からのインデックスと考えればOK ポインタはembindで変換されないのでunsigned
intにキャスト int value1 = 1192; // 0x04a8 short value2 = 758; // 0x02f6 char value3 = -1; // 0xff char value4 = 99; // 0x63 return (unsigned int)(&value1); // unsigned int getptr(); C/C++ a8 04 00 00 f6 02 ff 63 JavaScriptfor (int i = 0; i < 8; i ++) { console.log(Module.HEAPU8[Module.getptr() + i]); } …… … …
30.
for (int i
= 0; i < 2; i ++) { console.log(Module.HEAPU32[Module.getptr() / 4 + i]); } for (int i = 0; i < 4; i ++) { console.log(Module.HEAPU16[Module.getptr() / 2 + i]); } intやshortでアクセス 000004a8 63ff02f6 JavaScript … … 04a8 0000 02f6 63ff JavaScript … … a8 04 00 00 f6 02 ff 63…… … …
31.
もっと簡単にポインタ Module.getValue(<ポインタ>, <型>); Module.setValue(<ポインタ>, <値>,
<型>); JavaScript var v = Module.getValue(Module.getptr(), 'i32'); Module.setValue(Module.getptr(), v + 1, 'i32');
32.
console.log(Pointer_stringify(Module.getptr())); 文字列 C/C++からJavaScriptで文字列を授受するときはポインタを使う場合が 多い Pointer_stringify(<ポインタ>[, <長さ>]);を使って文字列を取り出す JavaScriptからC/C++へ文字列を渡す場合、引数の型をstd::stringにし ておくとemscriptenで変換される unsigned int
getptr() { char* str = "hello world!"; return (unsigned int)(&str); } C/C++ JavaScript
33.
まとめ 基本的なC/C++とJavaScript連携はだいたいできる OpenGLや、Moduleを使ったさらなる制御もできる できることと、できないことが分かった? ポインタはタダのインデックス アルゴリズムやコアは共有できてもGUI部分は別々の実 装のほうが良いと思う C/C++からDOMを操作するライブラリとかあったらど うなんでしょうね? Moduleの中を覗いてみると凄い作りだったり…
34.
以上 ありがとうございました
Download