Book description
並列・並行プログラミングはプログラマの重要な関心事であり、常に注目を集めている話題です。これまで、関数型言語は並列・並行プログラミングに有利であると言われてきましたが、それを解説する書籍はありませんでした。本書では、純粋関数型言語Haskellが提供する並列・並行プログラミングの機能を俯瞰し、実践的な問題を解いていきます。その根底にある考え方は、関数プログラミングの核心であるモジュラリティです。また本書では、実際の問題を解決するときに陥りがちな落とし穴や、高い性能を出すためのtipsなどをまとめています。
Table of contents
- 大扉
- 原書大扉
- 訳者まえがき
- まえがき
- 想定読者
- 本書の読み方
- 本書の表記法
- サンプルコードの使用
- 謝辞
- 第1章 はじめに
- 1.1 用語:並列性と並行性
- 1.2 ツールとリソース
- 1.3 サンプルコード
- 第1部 並列Haskell
- 第2章 基本の並列性:Evalモナド
- 2.1 遅延評価と弱頭部正規形
- 2.2 Evalモナド、rpar、rseq
- 2.3 例:並列数独ソルバ
- 2.4 Deepseq
- 第3章 評価戦略
- 3.1 戦略の並列化
- 3.2 リストを並列に評価する戦略
- 3.3 例: K平均法
- 3.3.1 K平均法の並列化
- 3.3.2 性能と分析
- 3.3.3 スパーク活動の可視化
- 3.3.4 粒度
- 3.4 GCされるスパークと投機的並列性
- 3.5 parBufferを使った遅延ストリームの並列化
- 3.6 チャンク分け戦略
- 3.7 同一性特性
- 第4章 データフロー並列: Parモナド
- 4.1 例: グラフの最短路
- 4.2 パイプライン並列
- 4.2.1 生産者の流量制限
- 4.2.2 パイプライン並列の制限
- 4.3 例: 会議の時間割
- 4.3.1 並列性の追加
- 4.4 例: 並列型推論器
- 4.5 別のスケジューラを使う
- 4.6 戦略と比較したParモナド
- 第5章 Repaを用いたデータ並列プログラミング
- 5.1 配列、シェイプ、添字
- 5.2 配列に対する操作
- 5.3 例: 最短路の計算
- 5.3.1 プログラムの並列化
- 5.4 畳み込みとシェイプ多相
- 5.5 例: 画像の回転
- 5.6 まとめ
- 第6章 AccelerateによるGPUプログラミング
- 6.1 概要
- 6.2 配列と添字
- 6.3 単純なAccelerate計算を実行する
- 6.4 スカラ配列
- 6.5 配列に添字でアクセスする
- 6.6 Accの中で配列を作る
- 6.7 2つの配列を綴じ合わせる
- 6.8 定数
- 6.9 例: 最短路問題
- 6.9.1 GPU上で実行する
- 6.9.2 CUDAバックエンドのデバッグ
- 6.10 例: マンデルブロ集合の生成器
- 第2部 並行Haskell
- 第7章 並行制御の基本: スレッドと MVar
- 7.1 例: 備忘通知
- 7.2 通信: MVar
- 7.3 簡単なチャネルとしてのMVar:ログサービス
- 7.4 共有状態としてのMVar
- 7.5 組み立て部品としてのMVar:無制限チャネル
- 7.6 公平性
- 第8章 入出力の重ね合わせ
- 8.1 Haskellの例外
- 8.2 Asyncのエラー処理
- 8.3 マージ
- 第9章 キャンセルとタイムアウト
- 9.1 非同期例外
- 9.2 非同期例外のマスク
- 9.3 bracket
- 9.4 チャネルに対する非同期例外の安全性
- 9.5 タイムアウト
- 9.6 非同期例外の捕捉
- 9.7 maskとforkIO
- 9.8 非同期例外に関して
- 第10章 ソフトウェアトランザクショナルメモリ
- 10.1 ウィンドウマネージャの例
- 10.2 ブロッキング
- 10.3 変更されるまでのブロッキング
- 10.4 STMを使ったマージ
- 10.5 Async再考
- 10.6 STMを使ったチャネルの実装
- 10.6.1 より多くの操作が可能
- 10.6.2 ブロックされる操作の合成
- 10.6.3 非同期例外安全
- 10.7 もう1つのチャネル実装
- 10.8 有界チャネル
- 10.9 STMでできないこと
- 10.10 性能
- 10.11 まとめ
- 第11章 並行性の高水準な抽象化
- 11.1 スレッド漏れの回避
- 11.2 対称型並行性コンビネータ
- 11.2.1 raceを使ったタイムアウト
- 11.3 Functorインスタンスの追加
- 11.4 まとめ:Async API
- 第12章 並行ネットワークサーバ
- 12.1 簡単なサーバ
- 12.2 単純なサーバの状態による拡張
- 12.2.1 設計1:1つのジャイアントロック
- 12.2.2 設計2:サーバスレッドごとに1つのチャネル
- 12.2.3 設計3:放送チャネルの利用
- 12.2.4 設計4:STMの利用
- 12.2.5 実装
- 12.3 チャットサーバ
- 12.3.1 アーキテクチャ
- 12.3.2 クライアントのデータ
- 12.3.3 サーバのデータ
- 12.3.4 サーバ
- 12.3.5 新しいクライアントの準備
- 12.3.6 クライアントの起動
- 12.3.7 まとめ
- 第13章 スレッドを用いた並列プログラミング
- 13.1 並行性を用いて並列性を達成する方法
- 13.2 例題: ファイル探索
- 13.2.1 直列版
- 13.2.2 並列版
- 13.2.3 性能とスケール
- 13.2.4 セマフォを使ったスレッド数の制限
- 13.2.5 ParIOモナド
- 第14章 分散プログラミング
- 14.1 distributed-processパッケージファミリー
- 14.2 分散並行性か分散並列性か
- 14.3 最初の例:ピン(ping)
- 14.3.1 プロセスとProcessモナド
- 14.3.2 メッセージ型の定義
- 14.3.3 ピンサーバのプロセス
- 14.3.4 マスタープロセス
- 14.3.5 main関数
- 14.3.6 例題のまとめ
- 14.4 複数ノードでのピン
- 14.4.1 1つのマシン上で複数のノード
- 14.4.2 複数のマシン
- 14.5 型付きチャネル
- 14.5.1 チャネルのマージ
- 14.6 失敗処理
- 14.6.1 分散プログラムにおける失敗の哲学
- 14.7 分散チャットサーバ
- 14.7.1 データ型
- 14.7.2 メッセージ送信
- 14.7.3 放送
- 14.7.4 配布
- 14.7.5 サーバのテスト
- 14.7.6 失敗とノードの追加/削除
- 14.8 練習問題: 分散KVS
- 第15章 デバッグ、チューニング、外部コードとのインタフェース
- 15.1 並行プログラムのデバッグ
- 15.1.1 スレッド状態の検査
- 15.1.2 イベントログとThreadScope
- 15.1.3 デッドロックの検出
- 15.2 並行(および並列)プログラムのチューニング
- 15.2.1 スレッドの生成とMVar操作
- 15.2.2 並行データ構造の共有
- 15.2.3 微調整のためのRTSオプション
- 15.3 並行性と外部関数インタフェース
- 15.3.1 スレッドと外部呼び出し
- 15.3.2 非同期例外と外部呼び出し
- 15.3.3 スレッドと外部からの呼び出し
- 著者紹介
- Simon Marlow(サイモン・マーロウ)
- 訳者紹介
- 山下 伸夫 (やました のぶお)
- 山本 和彦 (やまもと かずひこ)
- 田中 英行 (たなか ひでゆき)
- カバーの説明
- 奥付
Product information
- Title: Haskellによる並列・並行プログラミング
- Author(s):
- Release date: August 2014
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784873116891
You might also like
book
プログラミングRust
RustはMozilla財団の支援下で開発が進められており、Mozillaの次世代ブラウザエンジンの実装にも用いられているシステムプログラミング用言語です。C/C++並みのパフォーマンスと低レベルなメモリ操作機能、型システムを用いたメモリとスレッドの安全性を両立し、さらに安全な並列性も実現した、いま最も注目されている言語です。このRustをテーマにした本書は、Rust特有の所有権、移動、借用といった概念だけでなく、生産性と柔軟性を向上させるジェネリックコード、クロージャ、イテレータ、コレクションといった高度な機能についても詳しい説明を加えており、言語仕様から高度なプログラミング技術までを網羅した決定版です。
book
データサイエンス講義
コロンビア大学のデータサイエンス入門講義をベースとした本書では、データサイエンスを行う上で、どのようなプロセスが必要か、データサイエンティストとしてはどのようなスキルセットが必要で、どのような思考方法を選択する必要があるのかを実例とともに紹介します。Google、Microsoft、Facebookをはじめとした有名企業で使われているアルゴリズムや分析手法の紹介など、興味深い話題や事例を豊富に収録。幅広い解説で、データサイエンティストの参考になるトピックが満載の一冊です。
book
ベタープログラマ ―優れたプログラマになるための38の考え方とテクニック
本書は、優れたコードを作りだし、人々と効率的に働く生産性の高いプログラマになるための考え方とテクニックを38のテーマで紹介します。個人的な活動として、継続的な学習方法と停滞を避けるための課題の見つけ方など、自らを成長させる方法も紹介。さらに組織の中で他の人とコミュニケーションを取りながら、効果的に働くための習慣を解説します。『Code Craft』の著者Pete Goodliffeが、自らの経験を元に「優れたプログラマ」になるための考え方と習慣をまとめた本書は、プログラミングを愛し、長く続けながら、優れたプログラマになりたいと思うすべての人に必携の一冊です。
book
PythonとJavaScriptではじめるデータビジュアライゼーション
Webからデータを取得して、効率よく整理、分析を行い効果的な可視化を実現するには、さまざまなツールとテクニックが必要です。 本書ではPythonとJavaScriptを使い分け、それぞれの言語の強みを最大限利用します。 PythonのBeautifulSoupとScrapyでデータを取得、pandas、Matplotlib、Numpyでデータ処理を行い、Flaskフレームワークを使ってデータを配信、JavaScriptのD3.jsを使ってインタラクティブなWeb可視化を実現します。データの収集からアウトプットまでの全体を視野に入れて解説しているので、実際にコードを追いながら、この一冊でデータ分析プロセスの全体像を理解できます。