Submit Search
Upload
C/C++とWebAssemblyを利用したライブラリ開発
•
1 like
•
2,633 views
祐司 伊藤
Follow
Emscripten & WebAssembly night !! #7での発表資料です
Read less
Read more
Technology
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 34
Download now
Download to read offline
Recommended
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
祐司 伊藤
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
詳説WebAssembly
詳説WebAssembly
祐司 伊藤
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
MITSUNARI Shigeo
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
Recommended
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
祐司 伊藤
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
詳説WebAssembly
詳説WebAssembly
祐司 伊藤
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
MITSUNARI Shigeo
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
AtCoder Inc.
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
日本語テストメソッドについて
日本語テストメソッドについて
kumake
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
onozaty
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
abc031
abc031
AtCoder Inc.
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
Container Storage Interface のすべて
Container Storage Interface のすべて
祐司 伊藤
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
More Related Content
What's hot
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
AtCoder Inc.
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
日本語テストメソッドについて
日本語テストメソッドについて
kumake
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
onozaty
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
abc031
abc031
AtCoder Inc.
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
What's hot
(20)
中3女子でもわかる constexpr
中3女子でもわかる constexpr
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
新しい並列for構文のご提案
新しい並列for構文のご提案
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
日本語テストメソッドについて
日本語テストメソッドについて
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
abc031
abc031
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
More from 祐司 伊藤
Container Storage Interface のすべて
Container Storage Interface のすべて
祐司 伊藤
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
シンプル Processing !
シンプル Processing !
祐司 伊藤
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
PROCESS WARP
PROCESS WARP
祐司 伊藤
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系
祐司 伊藤
PROCESS WARP
PROCESS WARP
祐司 伊藤
PIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
祐司 伊藤
新しい分散実行の仕組み PROCESS WARPについて
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
More from 祐司 伊藤
(9)
Container Storage Interface のすべて
Container Storage Interface のすべて
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
シンプル Processing !
シンプル Processing !
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP
PROCESS WARP
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系
PROCESS WARP
PROCESS WARP
PIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
新しい分散実行の仕組み PROCESS WARPについて
新しい分散実行の仕組み PROCESS WARPについて
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 now