狠狠撸

狠狠撸Share a Scribd company logo
C/C++ WebAssembly
/ @llamerada_jp
2019/04/19 Emscripten & WebAssembly night !! #7
?
? ; 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
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
@狠狠撸Share
/llamerada-jp/webassembly-75175349
/llamerada-jp/cmu29
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
C/C++( )
WebAssembly(emscripten) web export
?
?
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
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);
}
Build
?
$ emcc …
-s 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", “cwrap"]'
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(< >, < >);
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
JavaScript
? C/C++ export JavaScript API
<api >
mergeInto(LibraryManager.library, {
js_func: function(p1, p2) {
//
…
},
…
});
Build
?
$ emcc … --js-library <api >
C/C++
? C/C++
extern "C" {
extern void js_func(int p1, void* p2);
}
?
js_func(100, &val);
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
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
);
Build
?
$ emcc … -s 'RESERVED_FUNCTION_POINTERS=< >'
?
? JavaScript on Callback
? 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;
}
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
C++ class
? ID JavaScript
? JavaScript C++
ID
? C ID C++
('A`)
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]);
}
? get/set
?
?
?
? ( )
? Module.HEAPU8
?
? JavaScript get/set
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
? ,
? new, delete
? alloc, free
? ,
? open, close
? JavaScript
? WebAssembly JavaScript GC
(2019/04 )
?
?
JavaScript API
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;
}
disconnect() {
//
if (this._timerInvoke) {
clearTimeout(this._timerInvoke);
this._timerInvoke = false;
}
// C++
ccall('js_disconnect', 'null', ['number'], [this._veinPtr]);
// JS
delete this._instanceCache;
}
? WebAssembly
?
? JavaScript C/C++ API
? C/C++ JavaScript API
? CallBack
?
?
?
?
libvein
?
? KVS, 2 PubSub
? C/C++, Python, web
(
)
oinari
? https://www.oinari.app
? https://github.com/llamerada-jp/
oinari
?
? libvein
Seed/Server

(WebRTC )
Application
API
Application
API
Application
API
Node

( )
Application
API
Node Node Node
Routing 

KVS, 2 PubSub
WebSocket
WebRTC
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)
=
颁/颁++と奥别产础蝉蝉别尘产濒测を利用したライブラリ开発
颁/颁++と奥别产础蝉蝉别尘产濒测を利用したライブラリ开発
Ad

Recommended

闯补惫补开発の强力な相棒として今すく?使える骋谤辞辞惫测
闯补惫补开発の强力な相棒として今すく?使える骋谤辞辞惫测
Yasuharu Nakano
?
ドメインロジックに集中せよ ?ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ ?ドメイン駆動設計 powered by Spring
増田 亨
?
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
mganeko
?
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
?
闯尘别蝉辫补迟丑をもっと広めたい
闯尘别蝉辫补迟丑をもっと広めたい
Tetsunori Nishizawa
?
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
Kenichi Tatsuhama
?
リーンなコードを书こう:実践的なオブジェクト指向设计
リーンなコードを书こう:実践的なオブジェクト指向设计
増田 亨
?
オブジェクト指向の设计と実装の学び方のコツ
オブジェクト指向の设计と実装の学び方のコツ
増田 亨
?
オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
?
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
?
ドメイン駆动设计入门
ドメイン駆动设计入门
Takuya Kitamura
?
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
?
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
?
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
厂笔础のルーティングの话
厂笔础のルーティングの话
ushiboy
?
やはりお前らの惭痴颁は间违っている
やはりお前らの惭痴颁は间违っている
Koichi Tanaka
?
【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例
Unity Technologies Japan K.K.
?
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Go Maeda
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
?
20分くらいでわかった気分になれる颁++20コルーチン
20分くらいでわかった気分になれる颁++20コルーチン
yohhoy
?
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
?
Gstreamer Basics
Gstreamer Basics
Seiji Hiraki
?
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
?
「ト?メイン駆动设计」の复雑さに立ち向かう
「ト?メイン駆动设计」の复雑さに立ち向かう
増田 亨
?
Container Storage Interface のすべて
Container Storage Interface のすべて
祐司 伊藤
?
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
?

More Related Content

What's hot (20)

オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
?
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
?
ドメイン駆动设计入门
ドメイン駆动设计入门
Takuya Kitamura
?
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
?
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
?
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
厂笔础のルーティングの话
厂笔础のルーティングの话
ushiboy
?
やはりお前らの惭痴颁は间违っている
やはりお前らの惭痴颁は间违っている
Koichi Tanaka
?
【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例
Unity Technologies Japan K.K.
?
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Go Maeda
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
?
20分くらいでわかった気分になれる颁++20コルーチン
20分くらいでわかった気分になれる颁++20コルーチン
yohhoy
?
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
?
Gstreamer Basics
Gstreamer Basics
Seiji Hiraki
?
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
?
「ト?メイン駆动设计」の复雑さに立ち向かう
「ト?メイン駆动设计」の复雑さに立ち向かう
増田 亨
?
オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
?
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
?
ドメイン駆动设计入门
ドメイン駆动设计入门
Takuya Kitamura
?
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
?
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
?
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
厂笔础のルーティングの话
厂笔础のルーティングの话
ushiboy
?
やはりお前らの惭痴颁は间违っている
やはりお前らの惭痴颁は间违っている
Koichi Tanaka
?
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Go Maeda
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
?
20分くらいでわかった気分になれる颁++20コルーチン
20分くらいでわかった気分になれる颁++20コルーチン
yohhoy
?
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
?
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
?
「ト?メイン駆动设计」の复雑さに立ち向かう
「ト?メイン駆动设计」の复雑さに立ち向かう
増田 亨
?

More from 祐司 伊藤 (11)

Container Storage Interface のすべて
Container Storage Interface のすべて
祐司 伊藤
?
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
?
详説奥别产础蝉蝉别尘产濒测
详説奥别产础蝉蝉别尘产濒测
祐司 伊藤
?
シンプル Processing !
シンプル Processing !
祐司 伊藤
?
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
?
PROCESS WARP
PROCESS WARP
祐司 伊藤
?
奥别产ブラウザで使えるいろんな処理系
奥别产ブラウザで使えるいろんな処理系
祐司 伊藤
?
PROCESS WARP
PROCESS WARP
祐司 伊藤
?
PIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
祐司 伊藤
?
新しい分散実行の仕組み PROCESS WARPについて
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
?
别尘蝉肠谤颈辫迟别苍で颁/颁++プログラムを飞别产ブラウザから使うまでの难所攻略
别尘蝉肠谤颈辫迟别苍で颁/颁++プログラムを飞别产ブラウザから使うまでの难所攻略
祐司 伊藤
?
Container Storage Interface のすべて
Container Storage Interface のすべて
祐司 伊藤
?
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
?
详説奥别产础蝉蝉别尘产濒测
详説奥别产础蝉蝉别尘产濒测
祐司 伊藤
?
シンプル Processing !
シンプル Processing !
祐司 伊藤
?
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
?
奥别产ブラウザで使えるいろんな処理系
奥别产ブラウザで使えるいろんな処理系
祐司 伊藤
?
PIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
祐司 伊藤
?
新しい分散実行の仕組み PROCESS WARPについて
新しい分散実行の仕組み PROCESS WARPについて
祐司 伊藤
?
别尘蝉肠谤颈辫迟别苍で颁/颁++プログラムを飞别产ブラウザから使うまでの难所攻略
别尘蝉肠谤颈辫迟别苍で颁/颁++プログラムを飞别产ブラウザから使うまでの难所攻略
祐司 伊藤
?
Ad

颁/颁++と奥别产础蝉蝉别尘产濒测を利用したライブラリ开発