Boost.Coroutine

M
Boost.Coroutine
自己紹介
・めるぽん
・SICP(計算機プログラムの構造と解釈)未読
・CTMCP(コンピュータプログラミングの概念・技法・モデル)未読
・D&E未読
・英語本未読
アジェンダ
・Boost.Coroutine とは
・Boost.Coroutine の入手方法
・Boost.Coroutine の使い方
・Boost.Coroutine の実装
・Boost.Coroutine の未来
・Boost.Coroutine のまとめ
Boost.Coroutine とは
・関数の実行を途中で凍結・再実行させる機構
int f(coroutine<int ()>::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
coroutine<int ()> coro(f);
std::cout << coro() << std::endl; // 1 * 1 = 1
std::cout << coro() << std::endl; // 2 * 2 = 4
std::cout << coro() << std::endl; // 3 * 3 = 9
}
Boost.Coroutine とは
・別名: micro-thread, fiber, continuation
・スレッドによく似ている
・コンテキストの切り替えはシステムではなくユーザが手動で行う
・同期が取りやすい

・使い方はいろいろ
・視点を変えると別の意味になったりする

・Boost ライブラリに正式に採用されていない
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の使い方
using namespace boost::coroutines;
typedef coroutine<int ()> coro_type;
int f(coro_type::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
coro_type
std::cout
std::cout
std::cout
}

coro(f);
<< coro() << std::endl; // 1 * 1 = 1
<< coro() << std::endl; // 2 * 2 = 4
<< coro() << std::endl; // 3 * 3 = 9
Boost.Coroutine の使い方
using namespace boost::coroutines;
typedef generator<int> gen_type;
int f(gen_type::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
gen_type gen(f);
while (gen != generator_type()) {
*gen; // 1, 4, 9, 16, ...
++gen;
}
}
Boost.Coroutine の使い方
void bullet(point pt)
for (int i = 0; i
for (int i = 0; i
for (int i = 0; i
}

{
< 10; i++) ++pt.x;
< 20; i++) ++pt.y;
< 30; i++) --pt.x;

・こんな弾の動きを作りたい。けど、
void bullet(int& state, point& pt) {
if (0 <= state && state < 10) ++pt.x;
if (10 <= state && state < 30) ++pt.y;
if (30 <= state && state < 60) --pt.x;
++state;
}

・こんな非直感的なコードを書かないといけない
Boost.Coroutine の使い方
point bullet(coro_type::self& self, point pt) {
for (int i = 0; i < 10; i++) ++pt.x, self.yield(pt);
for (int i = 0; i < 20; i++) ++pt.y, self.yield(pt);
for (int i = 0; i < 30; i++) --pt.x, self.yield(pt);
self.exit();
}
class bullet_task {
coro_type coro_;
public:
bullet_task()
: coro_(boost::bind(bullet, _1, point(10, 20)){}
bool move() {
point pt = coro_(std::nothrow);
return coro_;
}
};
Boost.Coroutine の使い方
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // コールバック関数
LPARAM lParam // アプリケーション定義の値
);

・コールバックでウインドウを列挙する関数
BOOL CALLBACK callback(HWND hwnd, LPARAM param) {
// hwnd を使ってごにょごにょする
}
int main() {
::EnumWindows(callback, param);
}

・すごく使いにくい
・イテレータみたいな使い方がしたい
Boost.Coroutine の使い方
typedef generator<HWND> gen_type;
BOOL CALLBACK callback(HWND hwnd, LPARAM param) {
gen_type::self& self =
*reinterpret_cast<gen_type::self*>(param);
self.yield(hwnd);
return TRUE;
}
HWND enum_windows(gen_type::self& self) {
::EnumWindows(&callback, reinterpret_cast<LPARAM>(&self));
self.exit();
}
int main() {
gen_type it(enum_windows);
while (it != gen_type()) {
std::cout << (void*)*it << std::endl;
++it;
}
}
Boost.Coroutine の実装
・Windows の場合
・Fiber を使う

・Mac(POSIX) の場合
・ucontext を使う

・Linux の場合
・アセンブラを使う
Boost.Coroutine の実装
・環境によってはコンテキストを自由に作れない
・セキュリティ的に問題あり
・だからこそのFiberやucontext

・組み込み環境で特に有効
・スレッドも使えない上に何ms以内にシステムに返せとか面倒
・アセンブラで自作できる場合が多い
・BREW 環境上(ARM アセンブラ)で作ってみて無事動いた

・実装を知っておくと好きな環境で作れる
Boost.Coroutine の実装
・コンテキストとは
・実行するために必要なもの
void f(coro_type::self& self) {
int a; // a, b はスタックに置かれている
int b; // a, b は yield されても保持されている
self.yield();
}
・スタック
・レジスタ
・(例外情報)

・これらを保存して実行中のコンテキストを切り替える
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

SP→

coro

Coroutine
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine

0
SP→

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine

0
SP→

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main
SP→

Coroutine

r0
pc2

0

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

0
&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro
SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro
SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0

SP→

r0

pc2

pc1

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main
SP→

Coroutine

r0

r0

pc2

pc1

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine
r0
pc1

SP→

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine
r0
pc1

SP→

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・他の方法で実装するのもあり
・機械的に状態マシンに置き換える(C#)
IEnumerable<int> GetEnumerator() {
yield return 2;
yield return 4;
}
int state, result;
int GetCurrent() {
bool MoveNext() {
switch (state)
case 0: result
case 1: result
case 2: return
}
}

result; }
{
= 2; state = 1; return true;
= 4; state = 2; return true;
false;
Boost.Coroutine の実装
・他の方法で実装するのもあり
・スレッドを使って実装する
・アセンブラが直接弄れないけど Coroutine が使いたい!(Java とか)
public final class Coro implements CoroutineFunction {
public void coro(Coroutine.Self self) {
self.yield();
self.yield();
}
}
Coroutine c = new Coroutine(new Coro());
c.coro();
Boost.Coroutine の未来
・Boost.ML を追いかけた
・2008/7/26 に sandbox 上の Boost.Coroutine を更新している
・複雑になりすぎたのでもっと単純なインターフェースにするとか何とか

・作者は ML には結構出てきてるのでちゃんと元気にしてるっぽい
・やる気が無い?

・作者以外の人が頑張っている
・Mac 版の対応
・バグの修正

・Boost.Coroutine の未来
・正式に採用されるのかどうか分からない
・Boost.Fiber という対抗馬も最近出てきた
Boost.Coroutine のまとめ
・手動マルチスレッド
・いろいろな使い方ができる
・実装はスタックポインタの書き換え
・それ以外の方法で実装するのもあり

・Boost.Coroutine は実装の模範例
・利用は自己責任
おわり
1 de 44

Recomendados

Continuation with Boost.Context por
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
2.1K vistas24 diapositivas
20分くらいでわかった気分になれるC++20コルーチン por
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
12.9K vistas31 diapositivas
コルーチンの使い方 por
コルーチンの使い方コルーチンの使い方
コルーチンの使い方Naohiro Yoshikawa
14.7K vistas52 diapositivas
C++でHello worldを書いてみた por
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
6.8K vistas22 diapositivas
コルーチンでC++でも楽々ゲーム作成! por
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!amusementcreators
7.5K vistas15 diapositivas
コルーチンを使おう por
コルーチンを使おうコルーチンを使おう
コルーチンを使おうamusementcreators
8.8K vistas17 diapositivas

Más contenido relacionado

La actualidad más candente

新しい並列for構文のご提案 por
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
29.6K vistas71 diapositivas
C++ ポインタ ブートキャンプ por
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
11K vistas145 diapositivas
競技プログラミングにおけるコードの書き方とその利便性 por
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
18.2K vistas29 diapositivas
More C++11 por
More C++11More C++11
More C++11京大 マイコンクラブ
13.9K vistas57 diapositivas
Javaとかc#とか最近の言語使いのためのc++入門 por
Javaとかc#とか最近の言語使いのためのc++入門Javaとかc#とか最近の言語使いのためのc++入門
Javaとかc#とか最近の言語使いのためのc++入門potimarimo
7.4K vistas46 diapositivas
Effective modern-c++#9 por
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9Tatsuki SHIMIZU
858 vistas36 diapositivas

La actualidad más candente(20)

新しい並列for構文のご提案 por yohhoy
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy29.6K vistas
C++ ポインタ ブートキャンプ por Kohsuke Yuasa
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa11K vistas
競技プログラミングにおけるコードの書き方とその利便性 por Hibiki Yamashiro
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro18.2K vistas
Javaとかc#とか最近の言語使いのためのc++入門 por potimarimo
Javaとかc#とか最近の言語使いのためのc++入門Javaとかc#とか最近の言語使いのためのc++入門
Javaとかc#とか最近の言語使いのためのc++入門
potimarimo7.4K vistas
Effective Modern C++ 読書会 Item 35 por Keisuke Fukuda
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda11K vistas
Visual C++で使えるC++11 por nekko1119
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
nekko111936.8K vistas
Synthesijer and Synthesijer.Scala in HLS-friends 201512 por Takefumi MIYOSHI
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI1.3K vistas
BoostAsioで可読性を求めるのは間違っているだろうか por Yuki Miyatake
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake14.3K vistas
Cloud TPU Driver API ソースコード解析 por Mr. Vengineer
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
Mr. Vengineer532 vistas
組み込みでこそC++を使う10の理由 por kikairoya
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya27K vistas
組み込み関数(intrinsic)によるSIMD入門 por Norishige Fukushima
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima47.5K vistas
Map por kikairoya
MapMap
Map
kikairoya10.2K vistas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines por Shintarou Okada
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada13.1K vistas

Similar a Boost.Coroutine

Python physicalcomputing por
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
1.5K vistas58 diapositivas
競技プログラミングのためのC++入門 por
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
32.9K vistas63 diapositivas
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519 por
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
3K vistas25 diapositivas
Stellaris を使った組み込みアプリ開発ガイド por
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
866 vistas132 diapositivas
PyOpenCLによるGPGPU入門 por
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
14.9K vistas41 diapositivas
Boost Tour 1.50.0 por
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0Akira Takahashi
1.1K vistas13 diapositivas

Similar a Boost.Coroutine(20)

Python physicalcomputing por Noboru Irieda
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
Noboru Irieda1.5K vistas
競技プログラミングのためのC++入門 por natrium11321
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321 32.9K vistas
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519 por Yasuhiro Ishii
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii3K vistas
Stellaris を使った組み込みアプリ開発ガイド por ryos36
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
ryos36866 vistas
PyOpenCLによるGPGPU入門 por Yosuke Onoue
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
Yosuke Onoue14.9K vistas
20130329 rtm2 por openrtm
20130329 rtm220130329 rtm2
20130329 rtm2
openrtm594 vistas
Boost9 session por freedom404
Boost9 sessionBoost9 session
Boost9 session
freedom4041.8K vistas
Brief introduction of Boost.ICL por yak1ex
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex692 vistas
T69 c++cli ネイティブライブラリラッピング入門 por 伸男 伊藤
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤5.2K vistas
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~ por Fujio Kojima
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima786 vistas
Wrapping a C++ library with Cython por fuzzysphere
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere4.1K vistas
Introduction to cython por Atsuo Ishimoto
Introduction to cythonIntroduction to cython
Introduction to cython
Atsuo Ishimoto14.9K vistas
Replace Output Iterator and Extend Range JP por Akira Takahashi
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi1.6K vistas
RubyKaigi2014: Just in Time compiler for CRuby por imasahiro
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
imasahiro1.1K vistas
Python で munin plugin を書いてみる por ftnk
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk4.6K vistas
リアルタイムOsのカスタマイズ por Kazuhiro Takahashi
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
Kazuhiro Takahashi1.4K vistas
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~ por Unity Technologies Japan K.K.
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~

Boost.Coroutine