書評: Parallel and Concurrent Programming in Haskell

この本には、その名が示すように Haskell (正確には GHC(Glasgow Haskell Compiler))が提供する並列(parallel)/並行(concurrent)プログラミング技術がまとめられている。著者は、GHC の主要開発メンバーである Simon Marlow 氏である。

彼は、長年、並列/並行の研究に携わっており、並列ガーベジコレクションを持つ GHC RTS (Runtime System) やいくつかの並列/並行ライブラリを実装している。そのため、並列/並行プログラミングには、驚く程造詣が深い。また説明は簡潔かつ明瞭である。本書は、真打によって書かれた並列/並行本の傑作と言える。

関数型言語にまつわる並列性/並行性には、たくさんの誤解があると思う。たとえば、未だに「純粋関数型言語でゲームなんか作れるの?」と言っている人を見かけるが、その人にとって「Haskellには軽量スレッドがあり、たとえば並行性が求められるwebサーバの実装に向いている」と説明しても信じてもらえないかもしれない。

また、「関数型言語には副作用がないから並列処理に向いている」と話を単純にしてしまっている人は、「ほらやっぱり関数型言語は並列処理に向いている」と結論に飛びついてしまいそうだ。

確かに、関数型言語は並列/並行プログラミングに有利な特徴を持っているが、すべての(厳密な意味での)関数型言語が並列性/並行性を提供している訳ではない。しかしながら、Haskell は研究と実用が両立している希有な言語である。そして、並列プログラミングと並行プログラミングを同時に探求している孤高の言語でもある。

GHC が、どのように並列性/並行性に取り組んでいるかを端的に示すインタビュー記事が「Coders at Work」に載っているので、それを引用しよう。インタビューを受けているのは、もう一人の Simon、すなわちGHC の開発リーダである Simon Peyton Jones 氏である。

Peter Seibel: 並行性について少しお話ししましょう。ガイ・スティールからあなたに「STMは世界を救うか?」と聞いてくれと頼まれたので。
Simon Peyton Jones: まさか。STM自体は世界を救うものではありません。並行性、そして並列プログラミング一般は、多くの側面をもつ獣であり、一発の弾で仕留められるものだとは思いません。並行性に関して、私は多角主義者です。

Simon Peyton Jones 氏の多角主義を受けて、GHC ではさまざまな種類の弾が用意されている。本書では、それらを順序よく丁寧に解説して行く。

第1章
並列と並行の定義

第一部では並列を取り扱う。第一部で印象深いのは、問題に適した並列化手法を選択する重要性と地道なチューニングの必要性である。並列化の目的は、あくまで性能の向上である。本書では、性能がでない場合、並列プロファイラなどを使って、問題を解決していく。

第2章
並列化に適した演算に対する基礎的な並列
第3章
並列化の戦略
第4章
依存関係があるデータの並列化
第5章
配列演算の並列化
第6章
GPUを使った配列演算の並列化

第二部では並行を取り扱う。Haskellでは、並行プログラミングに本当に必要なプリミティブが提供されている。並行性においても、関数プログラミングの精神に沿って、小さな部品を合成することで大きな部品を作っていく。これは、他の並行化手法には見られない魔法のような方法だ。

第7章
軽量スレッドとロック
第8章
入出力の多重化
第9章
軽量スレッドのキャンセルとタイムアウト
第10章
STM(Software Transactional Memory)によるデッドロックからの解放
第11章
高レベルな非同期API
第12章
ネットワークサーバの実装
第13章
軽量スレッドを使った並列性
第14章
分散プログラミング
第15章
デバッグとチューニング

本書は、もちろんすべての Haskeller にお勧めできる。私は並行プログラミングの専門家であり、並列は門外漢であるが、第一部はすっきりと読め、HackageDB から提供される例題のコードを動かすことで、並列の概要が掴めた気になっている。また第二部は、専門家の私にも学ぶべきことがたくさんあった。

私が特に気に入ったのは、STMの説明である。他の書籍では、STMが章に閉じており、特殊な技術であるかのような印象を与えてしまいがちである。しかし、本書では第10章で STMを導入すると、それ以降の章で使い続けて行く。STMが特殊な技術ではなく、単なる道具の一つであることを雄弁に示してくれる。

Haskeller でなくとも、並列/並行プログラミングに取り組むプログラマーには必読の書であると思う。たとえ、Haskellでプログラミングをする機会がなくても、最新の抽象度の高い並列/並行プログラミングの知見は、役に立つだろう。一旦高みに立てば、いくらでも低いところに降りて行けるのだから。

私の親友は、この本を2013年に出会った最高のプログラミング本だと言っていた。私も彼の意見に賛成である。