渋谷JVMという集会の案内を見て、しばらく流していたのですが、実はJVM言語の集まりということが分かったので、Kinkの宣伝のためLT枠に滑り込みました。CCCの懇親会LTを使い回して、午前中には資料を完成させました。用意周到です。
本編はScala, Clojure, Groovy, Javaのセッションとパネルディスカッションでした。
- Scalaセッション (竹添さん)
- Immutable時代のプログラミング言語 Clojure (川島さん)
- 今さら始めようGroovy (上原さん)
- Javaセッション (きしださん)
途中、Clojureのcore.asyncという非同期処理ライブラリについて、2点質問しました。
#渋谷JVM Clojureのcoroutine-based core-asyncについて2点質問しました。 (1) goroutineからメソッドを呼んだ先でチャネル読み書きした時、コンテキストスイッチされるか? A. されない。でかい処理をgoroutine内で書くのは悪手。
— 宮川 拓 (@miyakawa_taku) 2015, 4月 18
#渋谷JVM 承前。 (2) IOはどうするべき? A. Nettyなどを使う。core-async専用のIO処理は用意されていない。Clojureは本体を薄く保つのが大事だという思想を持っている。
— 宮川 拓 (@miyakawa_taku) 2015, 4月 18
この質問について、 id:ihcomega さんから、わけが分からないから解説しろ!という、もっともな突っ込みをいただきました。
@miyakawa_taku さっきの質問を解説するLTお願いします!
— よこな寂し死に (@ihcomega) 2015, 4月 18
ということで急遽LT資料を作って、コルーチンの実装方法を説明しました。
まとめると次のとおりです。
- コルーチンの実装にはスタックレスとスタックフルの二種類があって、Clojureのcore.asyncではスタックレスな実装を選択しているらしい。このため、コルーチンから処理を呼び出した先でコンテキストスイッチすることはできない。
- 通常のIOはブロックする。ブロックするとコンテキストスイッチできないため、コルーチンとの相性が悪い。このためコルーチンには、組み合わせて使える非同期IOが用意されることが多い。core.asyncでは専用のIO実装は用意されていないらしい。
また、無理を言って元のLTも喋らせていただきました。