 @miyakawa_taku
 JJUG幹事
 SI屋で賃労働
 オレオレJVM言語Kinkを作っています
https://bitbucket.org/kink/kink
 尾上部屋の里山関のファンです
自己紹介
1/12
Kinkとは!
こんなの↓
 プロトタイプベースのオブジェクト指向
言語
 JVM上で動く言語処理系だ!
 仕様策定者: 宮川 拓
 実装者: 宮川 拓
 ユーザ: 宮川 拓
2/12
Clojureのcoroutine-based core-async
についての質問が分からん!
と言われたので説明します
3/12
コルーチンの実装について
2014-04-18 渋谷JVM LT
宮川 拓
4/12
参考文献
Resumable Funtions v2
 http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/20
14/n4134.pdf
 C++の仕様化プロセスの文書
 コルーチン周りの話題を網羅
 特に読みやすくはない
5/12
コルーチン?
 カーネルのスケジューラの外で
実現するスレッド
 Goのgoroutine,
Erlangの「プロセス」など
 100万とかの数が作れる
6/12
Q1
コルーチンの中でメソッドを呼び出して、
その先でチャネルの読み書きをしたとき、
コンテキストスイッチはされる?
7/12
コンテキストスイッチ
coroutine {
do_x()
your_chan.send(v1)
do_y()
v2 = my_chan.recv()
do_z()
}
8/12
コンテキストスイッチ
implement_coroutine(frame) {
switch (frame.ip) {
0: frame.ip=1, do_x()
return your_chan.send(v1)
1: frame.ip=2, do_y()
return my_chan.recv()
2: v2 = frame.last_result
do_z()
return
}
}
←みたいに変換
されるはず
9/12
コンテキストスイッチ
coroutine {
do_something()
}
function do_something() {
your_chan.send(v)
}
←こいつは変換
できるけど
←こいつは変換
できない!
10/12
やりよう次第
例外を駆使すれば呼び出し先での
コンテキストスイッチも可能
例: Quasar
 http://www.slideshare.net/miyakawatak
u/quasar-actor-model-and-light-weight-
threads-on-java
11/12
Q2
コルーチンの中でのIOはどうしよう?
12/12
IOはブロックするのだ!
普通のIOはカーネルでブロックします
ブロックすると、独自のコンテキストス
イッチの仕組みは動きません
なので、コルーチンと組み合わせられる
IOライブラリがあると便利です
 QuasarやN4134にはある
13/12

コルーチンの実装について