Upload
Download free for 30 days
Login
Submit Search
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
28 likes
17,753 views
祐司 伊藤
CMU #29の発表資料です。 emscriptenを利用して、C/C++アプリをHTML化する具体的な手法についてです。
Software
Read more
1 of 34
Download now
Downloaded 33 times
1
2
Most read
3
4
Most read
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Most read
More Related Content
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
PDF
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
PDF
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
PDF
ワタシはSingletonがキライだ
Tetsuya Kaneuchi
PDF
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
ゲーム開発者のための C++11/C++14
Ryo Suzuki
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
ワタシはSingletonがキライだ
Tetsuya Kaneuchi
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
What's hot
(20)
PPTX
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
PDF
今から始める Lens/Prism
Naoki Aoyama
PDF
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
PDF
中3女子でもわかる constexpr
Genya Murakami
PDF
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
PPTX
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
Unity Technologies Japan K.K.
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
PDF
すごい constexpr たのしくレイトレ!
Genya Murakami
PDF
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
PDF
.NET Core 3.0時代のメモリ管理
KageShiron
PPTX
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
PDF
UniTask入門
torisoup
PDF
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
Unity Technologies Japan K.K.
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
PDF
インタフェース完全に理解した
torisoup
PDF
C++ マルチスレッドプログラミング
Kohsuke Yuasa
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
今から始める Lens/Prism
Naoki Aoyama
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
中3女子でもわかる constexpr
Genya Murakami
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
Unity Technologies Japan K.K.
Dockerからcontainerdへの移行
Kohei Tokunaga
すごい constexpr たのしくレイトレ!
Genya Murakami
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
.NET Core 3.0時代のメモリ管理
KageShiron
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
UniTask入門
torisoup
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
Unity Technologies Japan K.K.
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
インタフェース完全に理解した
torisoup
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Ad
Similar to emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
(20)
PDF
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
PPTX
Power shell で DSL
urasandesu
PDF
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
Mr. Vengineer
PDF
Node.js勉強会 Framework Koa
kamiyam .
PDF
Docker講習会資料
teruyaono1
PPTX
Windows Azure PHP Tips
Microsoft Openness Japan
PDF
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
PDF
Adaptive optimization of JIT compiler
nothingcosmos
PPTX
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
PPTX
CMake multiplatform build-tool
Naruto TAKAHASHI
PDF
PEZY-SC programming overview
Ryo Sakamoto
PDF
Clrh 20140906 lt
Tomoyuki Obi
PPTX
Alt#0x008 2017/5/20
Koki Natsume
KEY
Lxc on cloud
Yukihiko SAWANOBORI
PPT
Apache Module
Tomohiro Ikebe
PDF
Machine configoperatorのちょっとイイかもしれない話
Toshihiro Araki
PPT
NanoA
Kazuho Oku
PDF
社内勉強会資料(Varnish Module)
Iwana Chan
ODP
Buffer overflow
ionis111
PDF
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
Power shell で DSL
urasandesu
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
Mr. Vengineer
Node.js勉強会 Framework Koa
kamiyam .
Docker講習会資料
teruyaono1
Windows Azure PHP Tips
Microsoft Openness Japan
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
Adaptive optimization of JIT compiler
nothingcosmos
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
CMake multiplatform build-tool
Naruto TAKAHASHI
PEZY-SC programming overview
Ryo Sakamoto
Clrh 20140906 lt
Tomoyuki Obi
Alt#0x008 2017/5/20
Koki Natsume
Lxc on cloud
Yukihiko SAWANOBORI
Apache Module
Tomohiro Ikebe
Machine configoperatorのちょっとイイかもしれない話
Toshihiro Araki
NanoA
Kazuho Oku
社内勉強会資料(Varnish Module)
Iwana Chan
Buffer overflow
ionis111
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
Ad
More from 祐司 伊藤
(11)
PDF
Container Storage Interface のすべて
祐司 伊藤
PDF
C/C++とWebAssemblyを利用したライブラリ開発
祐司 伊藤
PDF
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
PDF
詳説WebAssembly
祐司 伊藤
PDF
シンプル Processing !
祐司 伊藤
PDF
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
PDF
PROCESS WARP
祐司 伊藤
PDF
Webブラウザで使えるいろんな処理系
祐司 伊藤
PDF
PROCESS WARP
祐司 伊藤
PDF
PIAXで作る P2Pネットワーク
祐司 伊藤
PDF
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
Container Storage Interface のすべて
祐司 伊藤
C/C++とWebAssemblyを利用したライブラリ開発
祐司 伊藤
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
詳説WebAssembly
祐司 伊藤
シンプル Processing !
祐司 伊藤
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
PROCESS WARP
祐司 伊藤
Webブラウザで使えるいろんな処理系
祐司 伊藤
PROCESS WARP
祐司 伊藤
PIAXで作る P2Pネットワーク
祐司 伊藤
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
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