Subscribed unsubscribe Subscribe Subscribe

Haskellでの並列・並行プログラミングの今: Parallel and Concurrent Programming in Haskell

HaskellコンパイラGHCの作者の一人であり並列RTSを書いた人であるSimon Marlowが、Haskellでの並列・並行プログラミングの今を切り取った本を出した。

The Free Lunch Is Overから8年、Haskellでの並列・並行プログラミングの今がどうなっているのかを俯瞰しつつ、実際の問題を解決するときに陥りがちな罠や、高い性能を出すためのtipsなどが読みやすくまとまった一冊になっていて、Haskellでアプリケーションを書いている人には自信を持ってお勧めできる。

HaskellというかGHCはかなり早くから性能の良い並列・並行RTSを持っていたこともあり、様々なライブラリやツールが存在している。その中でも著者が「これをするなら、今ならこれ」と考えるテクニックを集めた内容になっている。

  • 並列プログラミング
    • 遅延評価とEvalモナド
    • parallelパッケージのControl.Parallel.Strategiesによるタスク並列
    • monad-parパッケージによるタスク並列
    • repaパッケージによるCPUを使ったデータ並列
    • accelerateパッケージによるGPU (CUDA)を使ったデータ並列
  • 並行プログラミング
    • スレッドとMVar
    • asyncパッケージ
    • 非同期例外と例外のmaskの扱い方
    • Software Transactional Memory (STM)
    • distributed-process(いわゆるCloud Haskell)による分散プログラミング

読んでいてとてもいいなと思ったところとしては

  • 純粋関数型であっても並列化は簡単ではなく、評価戦略の正しい理解と地道なプロファイリングが必要であることがわかる
  • asyncパッケージのAPIを一から作る流れで各種の並行プリミティブを導入して徐々に改良を施すことで、いつ何を使うのがよいのかがわかる
  • Haskellの中でもかなり取り扱いが難しい非同期例外をちゃんと説明している

が挙げられる。

とりわけ最後の非同期例外は一つの山場で、丸々一つの章をさいて読者を絶望の淵に立たせたのち、STMによって世界の平和を再び取り戻す流れが素晴らしかった。もちろんSTMも銀の弾丸ではないことが述べられているところもまた良い。

対象読者は、すでにHaskellを使っていて並列・並行プログラムを書いている人、または書こうと思っている人とするのが良いと思う。前半の並列プログラミングは比較的読みやすいが、冒頭で解説される遅延評価についての理解が必要になる。後半の並行プログラミングはスレッドプログラミングの経験が全くない状態だと難しいかもしれない。分散の章はさほど踏み込んだ内容ではない。

本書は現実の処理系やライブラリを想定した、テクニックを集めた本なので、比較的旬の短い本だと思う。東京では @tanakh さんによる勉強会も開催されるそうなので、興味のある方は内容が古くなる前に読んでみることを勧めたい。

最後にフォーマットについて。僕はO'Reillyからebookを買ってmobi形式でKindle Paperwhiteで読んだのだが、本文中に出てくるソースコード上のシンボルが普通の文章と見分けが付かないために読みにくい箇所が幾つかあった。また、ソースコードのインデントが一部崩れていた。いずれもよく見ればわかるので実用上は問題ないが、気になる人はO'Reillyから買ってPDFと併せて読むか、ペーパーバックを買った方がよいかもしれない。

また期間限定でwebでも読めるので、チラ見したい方はそちらをどうぞ。