parallel and concurrentのまとめ

今年に入ってからParallel and Concurrent Programing in Haskellを読みつつその内容をブログに書いてきたが、一段落したのでまとめ。

まず英語でよいならこちらのページですべて読める。
http://chimera.labs.oreilly.com/books/1230000000929/index.html

本の内容は全部で15章あるが、そのうちまとめたのは第2章〜第14章(5,6章は除く)の内容。

本を読みつつコードを書き実行してみてまとめていった。コード自体は自分で書いてみた部分もあるが、写経してみた所が多い。写経はやってみるととても勉強になることが実感できた。並行並列処理はあまりやったことがなかったので、この本のおかげでだいぶ理解が深まったと思う。基本部分の話から始まり後半は具体例で実装という形の章が多く、解説もとてもわかりやすくて読みやすかった。

それぞれの概略とまとめたページを書いておく。
### 第2章 Basic Parallelism
http://jsapachehtml.hatenablog.com/entry/2015/01/03/101754
http://jsapachehtml.hatenablog.com/entry/2015/01/18/143520
並列処理の基本的な構成要素について書かれている。Evalモナドを利用することでhaskellの遅延評価の性質を利用して並列処理を行う。後半は数独のソルバを題材に実際に並列化する例になっている。

### 第3章 Evaluation Strategies
http://jsapachehtml.hatenablog.com/entry/2015/01/24/131408
Evalモナドをそのまま使うのではなく、Strategyという型を導入して使いやすい単位でまとめる。後半はK-Means法を用いた具体例になっている。記事にはまとめなかったがその他にもいくつか例が出ている。

### 第4章 Dataflow Parallelism
http://jsapachehtml.hatenablog.com/entry/2015/01/31/221609
http://jsapachehtml.hatenablog.com/entry/2015/02/08/181832
Parモナドを使うことで2,3章とは異なる考え方で並列処理を扱う。3章と同じ題材(Rsa暗号)をParモナドを使って実装する例もある。

### 第7章 Basic Concurrency
http://jsapachehtml.hatenablog.com/entry/2015/02/15/205159
ここからは並行処理について。MVarを導入してい並行処理の基本的な実現方法を解説。チャネルを実装する例が後半にある。

### 第8章 Overlapping Input/Output
http://jsapachehtml.hatenablog.com/entry/2015/02/22/224140
http://jsapachehtml.hatenablog.com/entry/2015/02/21/082507
MVarとforkIOを含めたasyncという処理を定義することで非同期処理を扱いやすくする。webpageのダウンロードという題材を一貫して使っていてわかりやすい。また、中盤では例外処理の基本について書いてある。

### 第9章 Cancellation and Timeouts
http://jsapachehtml.hatenablog.com/entry/2015/02/28/085123
非同期処理を止めることに関して。そのための例外を投げたり受け取ったりするタイミングを調整する方法について。

### 第10章 Software Transactional Memory
http://jsapachehtml.hatenablog.com/entry/2015/03/07/085003
STMの紹介。ここまでの話をSTMを使って改善できるということを示している。また、STMの実装やパフォーマンスについても書かれている。

### 第11章 Higher-Level Concurrency Abstractions
http://jsapachehtml.hatenablog.com/entry/2015/03/08/140358
並列処理を抽象化して具体的な部分を隠蔽した関数を作っていく。この後の章で出てくるサーバアプリケーションなどを実装する際にここで作った部品を使っていく。

### 第12章 Concurrent Network Servers
http://jsapachehtml.hatenablog.com/entry/2015/03/09/062846
http://jsapachehtml.hatenablog.com/entry/2015/03/14/183216
ここまでに出てきた内容を使ってサーバアプリケーションを作成する。単純なエコーサーバから始まり、状態を持つサーバへ。最終敵にはチャットサーバを実装する。

### 第13章 Parallel Programming Using Threads
http://jsapachehtml.hatenablog.com/entry/2015/03/17/072031
http://jsapachehtml.hatenablog.com/entry/2015/03/17/070850
スレッドを用いた並列処理を行う。ファイルを探索する関数を題材にしてパフォーマンス検証をしつつ高速化していく。

### 第14章 Distributed Programming
http://jsapachehtml.hatenablog.com/entry/2015/03/23/082547
http://jsapachehtml.hatenablog.com/entry/2015/03/29/202610
distributed-processというパッケージを用いて分散処理を行う。基本的な部分から最終的には分散チャットサーバまで。最後の部分は読者への課題として簡単なKVSの設計やそのステップが書いてあり、それに従って実装してみようという形になっている。

Haskellによる並列・並行プログラミング

Haskellによる並列・並行プログラミング