SlideShare 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
•
•
•
•
@SlideShare
https://www.slideshare.net/llamerada-jp/webassembly-75175349
https://www.slideshare.net/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)
=
C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発

More Related Content

PDF
Where狙いのキー、order by狙いのキー
PDF
Unityでパフォーマンスの良いUIを作る為のTips
PDF
クロージャデザインパターン
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
LLVM最適化のこつ
PDF
目grep入門 +解説
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
Where狙いのキー、order by狙いのキー
Unityでパフォーマンスの良いUIを作る為のTips
クロージャデザインパターン
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
LLVM最適化のこつ
目grep入門 +解説
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう

What's hot (20)

PDF
オブジェクト指向できていますか?
PDF
C#でわかる こわくないMonad
PDF
Docker Compose 徹底解説
PPTX
やってはいけない空振りDelete
PDF
20分くらいでわかった気分になれるC++20コルーチン
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
TensorFlow XLAは、 中で何をやっているのか?
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PPTX
C#で速度を極めるいろは
PDF
関数型プログラミングのデザインパターンひとめぐり
PDF
これからSpringを使う開発者が知っておくべきこと
PDF
40歳過ぎてもエンジニアでいるためにやっていること
PDF
Quine・難解プログラミングについて
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
SQLアンチパターン - ナイーブツリー
PPTX
競プロでGo!
PPTX
DockerコンテナでGitを使う
PDF
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
PPTX
5分で出来る!イケてるconfluenceページ
オブジェクト指向できていますか?
C#でわかる こわくないMonad
Docker Compose 徹底解説
やってはいけない空振りDelete
20分くらいでわかった気分になれるC++20コルーチン
RLSを用いたマルチテナント実装 for Django
TensorFlow XLAは、 中で何をやっているのか?
怖くないSpring Bootのオートコンフィグレーション
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
C#で速度を極めるいろは
関数型プログラミングのデザインパターンひとめぐり
これからSpringを使う開発者が知っておくべきこと
40歳過ぎてもエンジニアでいるためにやっていること
Quine・難解プログラミングについて
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - ナイーブツリー
競プロでGo!
DockerコンテナでGitを使う
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
5分で出来る!イケてるconfluenceページ
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を利用したライブラリ開発