kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

『プログラミングの魔導書 〜Programmers' Grimoire〜 Vol.3』 所感

Vol. 2の時に記事を寄稿した関係もあり、事前にPDF版をいただいていました。ようやく一通り目を通したので、簡単な紹介をしたいと思います。なお、注文はこちらから。

魔導書Vol.3の副題は「“Parallel, Concurrent, and Distributed Programming”並行世界の魔物に人類はどう立ち向かうのか。」です。

目次は以下のようになっています。各記事は、最初の2ページ程度試し読みが可能ですので、興味をもった方はそちらを読んでみるのも良いかと思います。

  • 序文 熊崎 宏樹
  • Lock-free入門 熊崎 宏樹
  • OpenACC 藤田 典久
  • ErlangとScalaにおけるアクターモデルの紹介 幾田 雅仁
  • C#の非同期処理 岩永 信之
  • Real World STM ~作って学ぶSTM~ 石井 大海
  • データ並列への招待 shelarcy
  • 合成可能なメッセージパッシング ~Concurrent ML の紹介~ 小笠原 啓
  • コルーチンスタイルプログラミング 高橋 晶
  • 画像検索入門 miyabiarts

今回のテーマは並列・並行・分散プログラミングです。並行プログラミングの世界には、直列プログラミングとは異なる原理的な難しさが存在します。直列プログラムとは異なるレベルの「プログラムの正しさ」の定義すら必要になります。本書はそのようなテーマを正面から取り扱っていますから、決して「お手軽」でも「簡単」でもありません。

一方で、並行プログラミングはとても「面白い」世界です。並行プログラミングは私たちプログラマにとってとても身近な話でありますが、同時にとても不可思議な世界でもあります。そのような世界の一端を除いてみたい知的好奇心旺盛な方に是非読んでもらいたいです。

また、並行プログラミングでは、直列プログラミングでは起き得ない様々なトラブルが容易に発生します。そこで重要なのは単なる対処療法だけでなく(それももちろん必要ですが)、原理を知ることです。本書はそのような原理を知りたい方にとって特に助けになる一冊だと信じています。

また、Erlang, Scala, ML,Haskell等における並行・並列プログラミングモデルが紹介されていますので、既に並行・並列プログラミングに関して基礎的な知識をお持ちの方にとっても有用な一冊です。

私が特におもしろかったいくつかの記事をピックアップして簡単に紹介します*1

まず、真っ先に挙げたいのが熊崎さん(@kumagiさん)の『Lock-free 入門』です。いわゆる「Lock-free」アルゴリズムの入門記事ですが、必要となる前提知識をきっちり説明しています。他の記事を読む助けにもなるので、並行プログラミングの用語に馴染みのない方はまずこの記事を読むことをお勧めします。並行・並列の違いや、並行プログラミングにおける正確性や安全性について丁寧に説明してあり、私自身も自分の理解を再確認するのに役に立ちました。日本語の通常の技術書籍で、並行プログラミングの用語についてきっちり解説しているものは少ないので、それだけでも貴重です。やや難解に感じるかもしれませんが、その場合は一度飛ばして必要に応じて読み返しましょう。

肝心のLock-freeについてですが、Lock-freeなStackのC言語の実装を通して説明していく形式になっています。ナイーブな実装から開始して、その問題点の指摘→改善を繰り返す形になっており、非常にわかりやすく丁寧な説明です。最後には、ベンチマークによる性能の測定もあります。

次に挙げたいのが幾太さん(@cooldaemonさん)の『ErlangとScalaにおけるアクターモデルの紹介』です。タイトルの通り、ErlangとScalaのアクターモデルと実装について、その差異を交えながら紹介しています。id:xuweiさんの記事でも触れられていますが、この記事の著者である@cooldaemonさんはScalaとErlangアクターモデルに詳しい方です。Scalaのアクターモデルに関しては私も多少理解しているつもりですが、Erlangについては、個々のアクターがメモリ空間を共有していない事、それによってスケジューリングの方式が異なる(であろう)ことを除いてあまり知らなかったため、Scalaのアクターとの差異は勉強になりました。

なお、この記事で説明されているScalaのアクターモデルは、Scala 2.9まで標準ライブラリに含まれていたscala.actorsパッケージ以下のものである事に注意してください。Scala 2.10では、scala.actorsは標準ライブラリから分離され*2、Akkaが実質的なScala標準のアクターライブラリになっています。Akkaも基本的な原理はscala.actorsと似ていますが、Akkaはより直接的にErlangアクターモデルを参考にしているため、細部は異なっています。

石井さん(@mr_konnさん)の『Real World STM ~作って学ぶSTM~』も楽しかったです。Software Transactional Memory(STM)という単語には聞き覚えのある方は少なくないでしょう。この記事は、STMを用いたプログラムを実際に作っていきながら学ぼうというものです。実装言語はHaskellですが、Haskellについてあまり知らなくても十分読むことはできる…かはちょっと自信がありません。少なくとも、公開されているサンプルコードをいじるには、Haskellのコード(実用的でなくてもよい)を書いた経験が多少必要かなというのが正直な感想です。しかし、前提知識さえあれば読み通すことはさほど難しくありません。

以上、『プログラミングの魔導書 〜Programmers' Grimoire〜 Vol.3』について簡単に紹介してみました。私の紹介や書籍ページの試し読みで興味を持った方は是非買いましょう!

*1:決して他の記事が面白くなかったわけではありません。あしからず

*2:ライブラリへの依存性を記述すれば利用は可能です