Submit Search
C/C++とWebAssemblyを利用したライブラリ開発
1 like
2,673 views
祐司 伊藤
Emscripten & WebAssembly night !! #7での発表資料です
Technology
Read more
1 of 34
Download now
Downloaded 15 times
1
2
3
4
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
More Related Content
PDF
Where狙いのキー、order by狙いのキー
yoku0825
PDF
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
PDF
クロージャデザインパターン
Moriharu Ohzu
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
PDF
LLVM最適化のこつ
MITSUNARI Shigeo
PDF
目grep入門 +解説
murachue
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
PDF
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
Where狙いのキー、order by狙いのキー
yoku0825
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
クロージャデザインパターン
Moriharu Ohzu
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
LLVM最適化のこつ
MITSUNARI Shigeo
目grep入門 +解説
murachue
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
What's hot
(20)
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
PDF
C#でわかる こわくないMonad
Kouji Matsui
PDF
Docker Compose 徹底解説
Masahito Zembutsu
PPTX
やってはいけない空振りDelete
Yu Yamada
PDF
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
PPTX
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
PDF
TensorFlow XLAは、 中で何をやっているのか?
Mr. Vengineer
PDF
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
PPTX
C#で速度を極めるいろは
Core Concept Technologies
PDF
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
PDF
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
PDF
40歳過ぎてもエンジニアでいるためにやっていること
onozaty
PDF
Quine・難解プログラミングについて
mametter
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
PDF
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
PPTX
競プロでGo!
鈴木 セシル
PPTX
DockerコンテナでGitを使う
Kazuhiro Suga
PDF
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
Mikito Yoshiya
PPTX
5分で出来る!イケてるconfluenceページ
CLARA, Inc.
オブジェクト指向できていますか?
Moriharu Ohzu
C#でわかる こわくないMonad
Kouji Matsui
Docker Compose 徹底解説
Masahito Zembutsu
やってはいけない空振りDelete
Yu Yamada
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
TensorFlow XLAは、 中で何をやっているのか?
Mr. Vengineer
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
C#で速度を極めるいろは
Core Concept Technologies
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
40歳過ぎてもエンジニアでいるためにやっていること
onozaty
Quine・難解プログラミングについて
mametter
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
競プロでGo!
鈴木 セシル
DockerコンテナでGitを使う
Kazuhiro Suga
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
Mikito Yoshiya
5分で出来る!イケてるconfluenceページ
CLARA, Inc.
Ad
More from 祐司 伊藤
(11)
PDF
Container Storage Interface のすべて
祐司 伊藤
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について
祐司 伊藤
PDF
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
祐司 伊藤
Container Storage Interface のすべて
祐司 伊藤
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
詳説WebAssembly
祐司 伊藤
シンプル Processing !
祐司 伊藤
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
PROCESS WARP
祐司 伊藤
Webブラウザで使えるいろんな処理系
祐司 伊藤
PROCESS WARP
祐司 伊藤
PIAXで作る P2Pネットワーク
祐司 伊藤
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
祐司 伊藤
Ad
C/C++とWebAssemblyを利用したライブラリ開発
1.
C/C++ WebAssembly / @llamerada_jp 2019/04/19
Emscripten & WebAssembly night !! #7
2.
• • ; SE •
, Java, Cloud, VMWare • ; • C/C++, go, WebAssembly, WebRTC, WebSocket • PROCESS WARP • twitter ; @llamerada_jp • facebook ; https://www.facebook.com/ito.yuuji • github ; https://github.com/llamerada-jp
3.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
4.
@SlideShare https://www.slideshare.net/llamerada-jp/webassembly-75175349 https://www.slideshare.net/llamerada-jp/cmu29
5.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
6.
C/C++( ) WebAssembly(emscripten) web
export • •
7.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
8.
C/C++ • C++ name
mangling extern "C" export • EMSCRIPTEN_KEEPALIVE -s 'EXPORTED_FUNCTIONS=["_<C >", …]' ( ) extern "C" { EMSCRIPTEN_KEEPALIVE int c_func(int p_int, void* p_ptr); }
9.
Build • $ emcc … -s
'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", “cwrap"]'
10.
JavaScript • ccall, cwrap
; emscripten (.wasm WebAssembly.Instance.exports) let r = ccall( 'c_func', // C 'number', // number(pointer ), array, string, boolean ['number', 'number'], // [< >, < >] // ); let f = cwrap('c_func', 'number', ['number', 'number']); f(< >, < >);
11.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
12.
JavaScript • C/C++ export
JavaScript API <api > mergeInto(LibraryManager.library, { js_func: function(p1, p2) { // … }, … });
13.
Build • $ emcc …
--js-library <api >
14.
C/C++ • C/C++ extern "C"
{ extern void js_func(int p1, void* p2); } • js_func(100, &val);
15.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
16.
JavaScript • JavaScript C •
addFunction ; JavaScript emscripten • ccall C/C++ • C/C++ let f_ptr = addFunction( js_func.bind(this), // bind 'vi' // (1 ), (2 ) // v:void, i:int32, j:int64, f:float, d:double );
17.
Build • $ emcc …
-s 'RESERVED_FUNCTION_POINTERS=< >' • • JavaScript on Callback
18.
• Promise (※
) connect(url, token) { const promise = new Promise((resolve, reject) => { // resolve/reject let onSuccess = addFunction((veinPtr) => { resolve(); }, 'vi'); let onFailure = addFunction((veinPtr) => { reject(); }, 'vi'); let [urlPtr] = allocPtrString(url); let [tokenPtr] = allocPtrString(token); // C/C++ Callback ccall('js_connect', 'null', ['number', 'number', 'number', 'number'], [this._veinPtr, urlPtr, tokenPtr, onSuccess, onFailure]); freePtr(url); freePtr(token); }); return promise; }
19.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
20.
C++ class • ID
JavaScript • JavaScript C++ ID • C ID C++ ('A`)
21.
get/set <C/C++> extern "C" { EMSCRIPTEN_KEEPALIVE
int64_t get_int(PTR_T value_ptr); EMSCRIPTEN_KEEPALIVE void set_int(PTR_T value_ptr, int64_t v); } <JavaScript> get() { return ccall('get_int', 'number', ['number'], [this._valuePtr]); } set(v) { ccall('set_int', 'void', ['number', 'number'], [this._valuePtr, v]); }
22.
• get/set • • • • (
) • Module.HEAPU8 • • JavaScript get/set
23.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
24.
• , • new,
delete • alloc, free • , • open, close
25.
• JavaScript • WebAssembly
JavaScript GC (2019/04 ) • • JavaScript API
26.
connect(url, token) { const
promise = new Promise((resolve, reject) => { let onSuccess = addFunction((veinPtr) => { resolve(); }, 'vi'); let onFailure = addFunction((veinPtr) => { reject(); }, 'vi'); // JavaScript C/C++ let [urlPtr] = allocPtrString(url); let [tokenPtr] = allocPtrString(token); // ccall('js_connect', 'null', ['number', 'number', 'number', 'number'], // !C/C++ [this._veinPtr, urlPtr, tokenPtr, onSuccess, onFailure]); // freePtr(url); freePtr(token); }); return promise; }
27.
disconnect() { // if (this._timerInvoke)
{ clearTimeout(this._timerInvoke); this._timerInvoke = false; } // C++ ccall('js_disconnect', 'null', ['number'], [this._veinPtr]); // JS delete this._instanceCache; }
28.
• WebAssembly • • JavaScript
C/C++ API • C/C++ JavaScript API • CallBack • • • •
29.
libvein • • KVS, 2
PubSub • C/C++, Python, web ( )
30.
oinari • https://www.oinari.app • https://github.com/llamerada-jp/ oinari • •
libvein
31.
Seed/Server (WebRTC ) Application API Application API Application API Node ( ) Application API Node
Node Node Routing KVS, 2 PubSub WebSocket WebRTC
32.
Core(C++) Application(JavaScript) API(JavaScript) I/F(C/C++) I/F(C/C++, JavaScript) WebSocket WebRTC Core(C++) Application(Native) API(C++) I/F(C++) WebRTC WebSocket API(C) Seed/Server(golang) WebAssembly (emscripten) =
Download