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

13
@miyakawa_taku JJUG幹事 SI屋で賃労働 オレオレJVM言語Kinkを作っています https ://bitbucket.org/kink/kink 尾上部屋の里山関のファンです 自己紹介 1/12

Upload: taku-miyakawa

Post on 17-Jul-2015

936 views

Category:

Technology


3 download

TRANSCRIPT

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

@miyakawa_taku

JJUG幹事

SI屋で賃労働

オレオレJVM言語Kinkを作っています

https://bitbucket.org/kink/kink

尾上部屋の里山関のファンです

自己紹介1/12

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

Kinkとは!

こんなの↓

プロトタイプベースのオブジェクト指向

言語

JVM上で動く言語処理系だ!

仕様策定者: 宮川 拓

実装者: 宮川 拓

ユーザ: 宮川 拓

2/12

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

Clojureのcoroutine-based core-async

についての質問が分からん!

と言われたので説明します

3/12

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

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

2014-04-18 渋谷JVM LT

宮川 拓

4/12

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

参考文献

Resumable Funtions v2

http://www.open-

std.org/jtc1/sc22/wg21/docs/papers/20

14/n4134.pdf

C++の仕様化プロセスの文書

コルーチン周りの話題を網羅

特に読みやすくはない

5/12

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

コルーチン?

カーネルのスケジューラの外で

実現するスレッド

Goのgoroutine,

Erlangの「プロセス」など

100万とかの数が作れる

6/12

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

Q1

コルーチンの中でメソッドを呼び出して、

その先でチャネルの読み書きをしたとき、

コンテキストスイッチはされる?

7/12

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

コンテキストスイッチ

coroutine {

do_x()

your_chan.send(v1)

do_y()

v2 = my_chan.recv()

do_z()

}

8/12

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

コンテキストスイッチ

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

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

コンテキストスイッチ

coroutine {

do_something()

}

function do_something() {

your_chan.send(v)

}

←こいつは変換

できるけど

←こいつは変換

できない!

10/12

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

やりよう次第

例外を駆使すれば呼び出し先での

コンテキストスイッチも可能

例: Quasar

http://www.slideshare.net/miyakawatak

u/quasar-actor-model-and-light-weight-

threads-on-java

11/12

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

Q2

コルーチンの中でのIOはどうしよう?

12/12

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

IOはブロックするのだ!

普通のIOはカーネルでブロックします

ブロックすると、独自のコンテキストス

イッチの仕組みは動きません

なので、コルーチンと組み合わせられる

IOライブラリがあると便利です

QuasarやN4134にはある

13/12