まえがき
オライリーから発売される「並行プログラミング入門」が若干早く入手できました。せっかくなので、紹介とか感想を書いてみようかと思います。結論だけ先に書いておくと、並行/並列プログラミングに興味があるなら買いましょう必ず役に立ちます。
どんな本?
この本は、大学のOSの授業とかで習うような並行/並列プログラミングの基礎を網羅的に扱っている素晴らしい本です。それだけに留まらず近年利用されているような幅広い技術に関する発展的な内容まで広く扱っています。
どんな人におすすめ?
- 並行/並列プログラミングの基礎が学びたい人
- ロックなどの基礎技術の実装例について学びたい人
- Rustを使った並行/並列プログラミングについて学びたい人
- 並行/並列プログラミングの計算モデル(意味論など)について学びたい人
- ロックフリー、STM、async/awaitといった最新の技術について学びたい人
書籍の紹介
この書籍は日本人による日本語の書籍です。よくあるオライリーの翻訳本と比較して大変読みやすい印象があります。そのため、紹介している参考文献などは日本語のものなどもあり英語が苦手な読者にも優しいです。
おそらく著者の方のgithubと思われるリポジトリを覗いてみるとなんとベアメタル上で動作するLispなどを開発されており大変技術レベルの高い方が執筆されていることが分かります。同じLisperの自分としては大変親近感がわきました。いつか自分もやってみたいものです。
書籍の構成としては、1章から4章で並行/並列プログラミングの基礎知識をひと通り学ぶことができるようになっていて、発展的な内容を後の5章から8章で紹介しているという構成になっています。以下に章の一覧を載せておきます。
1章 並行性と並列性 2章 プログラミングの基本 3章 同期処理1 4章 並行プログラミング特有のバグと問題点 5章 非同期プログラミング 6章 マルチタスク 7章 同期処理2 8章 並行計算モデル 付録A AArch64アーキテクチャ 付録B x86-64アーキテクチャ 参考文献 おわりに
前半の1章から4章だけでも読み応え抜群で、例えば、普通のOSの教科書や大学の授業では「排他制御にはロックを利用する。そのための仕組みとしてTestAndSet命令 を利用してロックは実装される」みたいな紹介で終わっていることが少なくないのですが、この本はそのロックの実装の詳細に踏み込んでいます。実際にArmプロセッサとIntelのプロセッサのアセンブラを例示してロックを実装するコードを読むことができ、曖昧だったロックなどの実装が明確になると思います。
並行/並列プログラミングのことを詳細に書いてある書籍と言えば「The Art of Multiprocessor Programming」という書籍が有名なのですが、この本はロックなどの理論面が非常に高度なレベルで議論されており、初心者向けとはとても呼べないものでした。この本はそういったこともなくプログラミング初心者を卒業したレベルの読者でもついていける内容となっています。
この書籍では、pthreadを用いる場合やアセンブラを直接利用する場合を除いて基本的にRustを実装言語として選んでいます。Rustは近年組み込み分野なども含めて注目が集まっている言語ですが、並行/並列プログラミングの技法についてこのレベルで丁寧に解説してある書籍はほぼほぼ無いと言って良いと思います。またRust自体の説明も書籍で利用する範囲を最小限に紹介するという形をとっていて、借用といった概念に関してもわかりやすく解説されておりRustについての事前知識が無くても十分読み進めることができるようになっています。また、アセンブラに関しても丁寧な説明が付録としてついていて、全くアセンブラを見たことがないという場合は、そちらを参照しながら読むことで読み進めることが出来ると思います。この付録のアセンブラの解説も簡潔で整理された内容が記載されています。
この本は線形論理や計算モデルに関しての入門書としての側面も持っているような印象もあります。推論規則の読み方や数学記号の読み方などもきっちり紹介してあるので、プログラミングしか知らない読者でもラムダ計算などが理解できるようになっています。大学ではプログラミング言語論などとして実施されていることが多いかと思います。型推論の議論やプログラム検証などの分野ではよく利用されている概念なのですが中々入門的内容がまとまっていることが少ないので有益だと思いました。型推論で有名な型システム入門という書籍がありますが、入門とついているにも関わらず線形論理などの知識は既に持っていなければ読み進められないのです。そういった他の分野への準備にもなっているのは好感が持てますね。
8章では、ラムダ計算の基本から始まりアクターモデルやπ計算のモデルまで学ぶことができるようになっています。アクターモデルやπ計算のモデルがどのようにプロセスの間で通信をしているのかを理解したい場合非常に参考になると思います。自分はラムダ計算以降の発展した議論に関しては追っていなかったのですが、π計算まで(ある程度)キャッチアップすることができました。
「おわりに」の章では、これから実装に挑む読者に対する設計指針や次に読むべき参考書籍などの紹介もされています。とりあえずasync/awaitでいいというような直接的な方針が示されているので初心者がどの技術を使っていいのか迷子にならずに済むようなケアまでしてくれます。Rustで並行/並列プログラミングをするときに、手段で迷ったらとりあえずこの本のまとめだけ読み返してみるのも良さそうだと思いました。
惜しかった点
線形論理や計算モデルの説明はとても丁寧だと思ったのですが、登場の仕方がやや唐突感があった気がしました。2章でRustの所有権の話、線形型を適用したプログラミング言語Cyclonの話、8章でλ計算、アクター、π計算の話の流れで導入されていますが、線形論理や計算モデルを学ぶ意義についてもフォローがあればうれしかったです。
まとめ
並行プログラミング入門 は並行/並列プログラミングの基礎がしっかり学べて素晴らしい書籍だと思います。特に実装面に関しては他に類を見ない書籍と言って良いでしょう。計算機科学に関して学んでいるすべての方にお薦めできる書籍です。