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

Book description

並列・並行プログラミングはプログラマの重要な関心事であり、常に注目を集めている話題です。これまで、関数型言語は並列・並行プログラミングに有利であると言われてきましたが、それを解説する書籍はありませんでした。本書では、純粋関数型言語Haskellが提供する並列・並行プログラミングの機能を俯瞰し、実践的な問題を解いていきます。その根底にある考え方は、関数プログラミングの核心であるモジュラリティです。また本書では、実際の問題を解決するときに陥りがちな落とし穴や、高い性能を出すためのtipsなどをまとめています。

Table of contents

  1.  大扉
  2.  原書大扉
  3.  訳者まえがき
  4.  まえがき
  5.   想定読者
  6.   本書の読み方
  7.   本書の表記法
  8.   サンプルコードの使用
  9.   謝辞
  10.  第1章 はじめに
  11.   1.1 用語:並列性と並行性
  12.   1.2 ツールとリソース
  13.   1.3 サンプルコード
  14. 第1部 並列Haskell
  15.  第2章 基本の並列性:Evalモナド
  16.   2.1 遅延評価と弱頭部正規形
  17.   2.2 Evalモナド、rpar、rseq
  18.   2.3 例:並列数独ソルバ
  19.   2.4 Deepseq
  20.  第3章 評価戦略
  21.   3.1 戦略の並列化
  22.   3.2 リストを並列に評価する戦略
  23.   3.3 例: K平均法
  24.    3.3.1 K平均法の並列化
  25.    3.3.2 性能と分析
  26.    3.3.3 スパーク活動の可視化
  27.    3.3.4 粒度
  28.   3.4 GCされるスパークと投機的並列性
  29.   3.5 parBufferを使った遅延ストリームの並列化
  30.   3.6 チャンク分け戦略
  31.   3.7 同一性特性
  32.  第4章 データフロー並列: Parモナド
  33.   4.1 例: グラフの最短路
  34.   4.2 パイプライン並列
  35.    4.2.1 生産者の流量制限
  36.    4.2.2 パイプライン並列の制限
  37.   4.3 例: 会議の時間割
  38.    4.3.1 並列性の追加
  39.   4.4 例: 並列型推論器
  40.   4.5 別のスケジューラを使う
  41.   4.6 戦略と比較したParモナド
  42.  第5章 Repaを用いたデータ並列プログラミング
  43.   5.1 配列、シェイプ、添字
  44.   5.2 配列に対する操作
  45.   5.3 例: 最短路の計算
  46.    5.3.1 プログラムの並列化
  47.   5.4 畳み込みとシェイプ多相
  48.   5.5 例: 画像の回転
  49.   5.6 まとめ
  50.  第6章 AccelerateによるGPUプログラミング
  51.   6.1 概要
  52.   6.2 配列と添字
  53.   6.3 単純なAccelerate計算を実行する
  54.   6.4 スカラ配列
  55.   6.5 配列に添字でアクセスする
  56.   6.6 Accの中で配列を作る
  57.   6.7 2つの配列を綴じ合わせる
  58.   6.8 定数
  59.   6.9 例: 最短路問題
  60.    6.9.1 GPU上で実行する
  61.    6.9.2 CUDAバックエンドのデバッグ
  62.   6.10 例: マンデルブロ集合の生成器
  63. 第2部 並行Haskell
  64.  第7章 並行制御の基本: スレッドと MVar
  65.   7.1 例: 備忘通知
  66.   7.2 通信: MVar
  67.   7.3 簡単なチャネルとしてのMVar:ログサービス
  68.   7.4 共有状態としてのMVar
  69.   7.5 組み立て部品としてのMVar:無制限チャネル
  70.   7.6 公平性
  71.  第8章 入出力の重ね合わせ
  72.   8.1 Haskellの例外
  73.   8.2 Asyncのエラー処理
  74.   8.3 マージ
  75.  第9章 キャンセルとタイムアウト
  76.   9.1 非同期例外
  77.   9.2 非同期例外のマスク
  78.   9.3 bracket
  79.   9.4 チャネルに対する非同期例外の安全性
  80.   9.5 タイムアウト
  81.   9.6 非同期例外の捕捉
  82.   9.7 maskとforkIO
  83.   9.8 非同期例外に関して
  84.  第10章 ソフトウェアトランザクショナルメモリ
  85.   10.1 ウィンドウマネージャの例
  86.   10.2 ブロッキング
  87.   10.3 変更されるまでのブロッキング
  88.   10.4 STMを使ったマージ
  89.   10.5 Async再考
  90.   10.6 STMを使ったチャネルの実装
  91.    10.6.1 より多くの操作が可能
  92.    10.6.2 ブロックされる操作の合成
  93.    10.6.3 非同期例外安全
  94.   10.7 もう1つのチャネル実装
  95.   10.8 有界チャネル
  96.   10.9 STMでできないこと
  97.   10.10 性能
  98.   10.11 まとめ
  99.  第11章 並行性の高水準な抽象化
  100.   11.1 スレッド漏れの回避
  101.   11.2 対称型並行性コンビネータ
  102.    11.2.1 raceを使ったタイムアウト
  103.   11.3 Functorインスタンスの追加
  104.   11.4 まとめ:Async API
  105.  第12章 並行ネットワークサーバ
  106.   12.1 簡単なサーバ
  107.   12.2 単純なサーバの状態による拡張
  108.    12.2.1 設計1:1つのジャイアントロック
  109.    12.2.2 設計2:サーバスレッドごとに1つのチャネル
  110.    12.2.3 設計3:放送チャネルの利用
  111.    12.2.4 設計4:STMの利用
  112.    12.2.5 実装
  113.   12.3 チャットサーバ
  114.    12.3.1 アーキテクチャ
  115.    12.3.2 クライアントのデータ
  116.    12.3.3 サーバのデータ
  117.    12.3.4 サーバ
  118.    12.3.5 新しいクライアントの準備
  119.    12.3.6 クライアントの起動
  120.    12.3.7 まとめ
  121.  第13章 スレッドを用いた並列プログラミング
  122.   13.1 並行性を用いて並列性を達成する方法
  123.   13.2 例題: ファイル探索
  124.    13.2.1 直列版
  125.    13.2.2 並列版
  126.    13.2.3 性能とスケール
  127.    13.2.4 セマフォを使ったスレッド数の制限
  128.    13.2.5 ParIOモナド
  129.  第14章 分散プログラミング
  130.   14.1 distributed-processパッケージファミリー
  131.   14.2 分散並行性か分散並列性か
  132.   14.3 最初の例:ピン(ping)
  133.    14.3.1 プロセスとProcessモナド
  134.    14.3.2 メッセージ型の定義
  135.    14.3.3 ピンサーバのプロセス
  136.    14.3.4 マスタープロセス
  137.    14.3.5 main関数
  138.    14.3.6 例題のまとめ
  139.   14.4 複数ノードでのピン
  140.    14.4.1 1つのマシン上で複数のノード
  141.    14.4.2 複数のマシン
  142.   14.5 型付きチャネル
  143.    14.5.1 チャネルのマージ
  144.   14.6 失敗処理
  145.    14.6.1 分散プログラムにおける失敗の哲学
  146.   14.7 分散チャットサーバ
  147.    14.7.1 データ型
  148.    14.7.2 メッセージ送信
  149.    14.7.3 放送
  150.    14.7.4 配布
  151.    14.7.5 サーバのテスト
  152.    14.7.6 失敗とノードの追加/削除
  153.   14.8 練習問題: 分散KVS
  154.  第15章 デバッグ、チューニング、外部コードとのインタフェース
  155.   15.1 並行プログラムのデバッグ
  156.    15.1.1 スレッド状態の検査
  157.    15.1.2 イベントログとThreadScope
  158.    15.1.3 デッドロックの検出
  159.   15.2 並行(および並列)プログラムのチューニング
  160.    15.2.1 スレッドの生成とMVar操作
  161.    15.2.2 並行データ構造の共有
  162.    15.2.3 微調整のためのRTSオプション
  163.   15.3 並行性と外部関数インタフェース
  164.    15.3.1 スレッドと外部呼び出し
  165.    15.3.2 非同期例外と外部呼び出し
  166.    15.3.3 スレッドと外部からの呼び出し
  167.   著者紹介
  168.    Simon Marlow(サイモン・マーロウ)
  169.   訳者紹介
  170.    山下 伸夫 (やました のぶお)
  171.    山本 和彦 (やまもと かずひこ)
  172.    田中 英行 (たなか ひでゆき)
  173.    カバーの説明
  174.  奥付

Product information

  • Title: Haskellによる並列・並行プログラミング
  • Author(s): Simon Marlow, 山下 伸夫, 山本 和彦, 田中 英行
  • Release date: August 2014
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873116891

You might also like

book

プログラミングRust

by Jim Blandy, Jason Orendorff, 中田 秀基

RustはMozilla財団の支援下で開発が進められており、Mozillaの次世代ブラウザエンジンの実装にも用いられているシステムプログラミング用言語です。C/C++並みのパフォーマンスと低レベルなメモリ操作機能、型システムを用いたメモリとスレッドの安全性を両立し、さらに安全な並列性も実現した、いま最も注目されている言語です。このRustをテーマにした本書は、Rust特有の所有権、移動、借用といった概念だけでなく、生産性と柔軟性を向上させるジェネリックコード、クロージャ、イテレータ、コレクションといった高度な機能についても詳しい説明を加えており、言語仕様から高度なプログラミング技術までを網羅した決定版です。

book

データサイエンス講義

by Rachel Schutt, Cathy O'Neil, 瀬戸山 雅人, 石井 弓美子, 河内 崇, 河内 真理子, 古畠 敦, 木下 哲也, 竹田 正和, 佐藤 正士, 望月 啓充

コロンビア大学のデータサイエンス入門講義をベースとした本書では、データサイエンスを行う上で、どのようなプロセスが必要か、データサイエンティストとしてはどのようなスキルセットが必要で、どのような思考方法を選択する必要があるのかを実例とともに紹介します。Google、Microsoft、Facebookをはじめとした有名企業で使われているアルゴリズムや分析手法の紹介など、興味深い話題や事例を豊富に収録。幅広い解説で、データサイエンティストの参考になるトピックが満載の一冊です。

book

ベタープログラマ ―優れたプログラマになるための38の考え方とテクニック

by Pete Goodliffe, 柴田 芳樹

本書は、優れたコードを作りだし、人々と効率的に働く生産性の高いプログラマになるための考え方とテクニックを38のテーマで紹介します。個人的な活動として、継続的な学習方法と停滞を避けるための課題の見つけ方など、自らを成長させる方法も紹介。さらに組織の中で他の人とコミュニケーションを取りながら、効果的に働くための習慣を解説します。『Code Craft』の著者Pete Goodliffeが、自らの経験を元に「優れたプログラマ」になるための考え方と習慣をまとめた本書は、プログラミングを愛し、長く続けながら、優れたプログラマになりたいと思うすべての人に必携の一冊です。

book

PythonとJavaScriptではじめるデータビジュアライゼーション

by Kyran Dale, 嶋田 健志, 木下 哲也

Webからデータを取得して、効率よく整理、分析を行い効果的な可視化を実現するには、さまざまなツールとテクニックが必要です。 本書ではPythonとJavaScriptを使い分け、それぞれの言語の強みを最大限利用します。 PythonのBeautifulSoupとScrapyでデータを取得、pandas、Matplotlib、Numpyでデータ処理を行い、Flaskフレームワークを使ってデータを配信、JavaScriptのD3.jsを使ってインタラクティブなWeb可視化を実現します。データの収集からアウトプットまでの全体を視野に入れて解説しているので、実際にコードを追いながら、この一冊でデータ分析プロセスの全体像を理解できます。