未来への魔導書 〜 プログラミングの魔導書 Vol.3

Vol.3 “Parallel, Concurrent, and Distributed Programming”
並行世界の魔物に人類はどう立ち向かうのか。
  1. 序文(熊崎 宏樹
  2. Lock-free 入門(熊崎 宏樹
  3. OpenACC(藤田 典久
  4. ErlangScala におけるアクターモデルの紹介(幾田 雅仁
  5. C# の非同期処理(岩永 信之
  6. Real World STM 〜作って学ぶ STM〜石井 大海
  7. データ並列への招待(shelarcy
  8. 合成可能なメッセージパッシング 〜Concurrent ML の紹介〜小笠原 啓
  9. コルーチンスタイルプログラミング(高橋 晶
  10. 画像検索入門(miyabiarts

@cpp_akira (id:faith_and_brave) さんより献本御礼。風の便りで「レビューが厳しくて、なかなか OK が出ない」と言う話をちらっと聞いたような気がしましたが、無事に発売まで辿りついたようで、まずはおめでとうございます。

本書の目的は様々な方に得意な分野、興味ある分野の記事を書いていただき、それらをまとめて皆さんへ紹介することにあります。ただ、小さな記事をまとめるといっても、無造作に集めてしまうと幾つもある記事のうち興味があるのは 1 つだけといったことになりかねません。そこで、毎号ある程度テーマを絞り、それに沿った記事を中心として構成することにしました。

プログラミングの魔導書 Vol.1 「創刊に向けて」

プログラミングの魔導書は、創刊号でのあいさつの通り、毎号何らかのテーマに沿って執筆、編集されているようです(全ての記事がそうと言う訳でもないようですが)。これまでに取り上げられたテーマは、「C++」、「プログラミング言語の進化」、そして今号の「並行、並列、分散」となります。私自身、プログラミングの魔導書は創刊時からの読者でもあるのですが、Vol.2 から「プログラミングの未来」と言う特色がより色濃く見られるようになり、それが Vol.3 にも継承されているように思いました。

「プログラミングの未来」は、必ずしも、自らのプログラミング・スタイルを直ちに変えるようなものばかりではないかもしれません。しかし、様々な領域において今どのような研究や議論が起こっているか、遠くない将来に自分達のプログラミングにどのような影響を及ぼすかを垣間見せてくれるのが面白いと感じています。特に、今号の最初の記事である「Lock-free入門」については 40 ページ近くにもおよぶ力作になっており、ブログ記事等だけではカバーしきれない部分が丁寧に解説されていました。プログラミングの魔導書は、こう言った「未来」を「ブログよりも、もう少しだけ体系的に見せてくれる」媒体として可能性を感じると同時に、これからのさらなる発展を期待しています。

並行、並列、分散

前置きが長くなりましたが、今号のテーマは「並行、並列、分散」です。私自身のプログラミング歴を振り返ってみると、ここ 3, 4 年は、主に Windows デスクトップ上でのアプリケーション・プログラマとしてやっている訳ですが、真面目に GUI プログラミングを始めるにあたって壁になったのが「イベントハンドラ」と、そして「スレッド」への理解だったように記憶しています。

「非同期処理」と言っても、いくつか異なる用途が存在する。大まかに言うと以下のようなものだ。

  • 並列計算: マルチコアCPU の性能を最大限引き出すために、同じ計算を複数のコアで同時に実行する。
    • データ並列: 同じ処理を異なるデータに対して繰り返し行う。
    • タスク並列: 異なる処理が独立して動いていて、その間で非同期にデータのやり取り(非同期データフロー)を行う。
  • バックグラウンド処理: 負荷の高い計算や、I/O 待ちなどによって、CPU やスレッド資源を保持し続けないために、別スレッドでの計算やI/O 待ちを行う。
プログラミングの魔導書 Vol.3 「C# の非同期処理(p.69)」

取りあえず動けば良いと言う話であればバックグラウンド処理など考えずにガリガリ書いてしまえば良いのですが、そうすると GUI がフリーズしたように見える状況が度々発生し、ユーザに必要以上のストレスを与えてしまいます。特に、ファイルへのアクセスやネットワーク通信が頻発するようなアプリケーションだとこの傾向が顕著で、そう言った状況においてユーザにできるだけ「動作が軽いように見せかける」ためには、多くの処理を別スレッドへ投げて UI スレッドは可能な限りブロックしない等の戦略を取る必要があります。

必要があります、と言うのは簡単なのですが、実際に書いてみるとロックが長すぎたせいで結局 GUI がフリーズしたように見えてしまった等いろいろな問題が発生します。それらの中には、修正した後になって改めて眺めると「そりゃダメだろう、馬鹿だなぁ俺……」みたいなケースも多いのですが、まぁ何というか、なかなか難しいと痛感する事が多々あります。そう言った苦い経験をしている私としては、「C# の非同期処理」はまさに欲していた記事と言う感じですし、「Lock-free 入門」や「Real World STM 〜作って学ぶSTM〜」など従来までのロック処理に変わるデータ同期方法を解説した記事などに朧げながら希望を抱いたりもします。

私自身は、幸いにも?今のところ、マルチコア CPU の性能を最大限に発揮させる事を求められるような問題には出会わない領域で開発をしている(≒その領域に関して疎い)のですが、そちら側の問題(並列計算など)についても「OpenACC(OpenMP と OpenACC)」や「データ並列への招待」と言った記事等で触れられており、「並行、並列」の世界に関する話題をバランス良く扱っている印象を受けました。

次世代の人たちの台頭を感じるとき

ここ数年、自分よりも若い世代の人たちの台頭、活躍と言うものを実感する機会が増えてきました。最初にこれを感じたのは C++テンプレートテクニック@cpp_akira さんのプロフィールを見て「えっ。俺より若いじゃん!」と思った時だったのですが、今号の筆者達のプロフィールを Web サイト等でいろいろ眺めてみても、中には自分より 10 歳くらい若い人もいるようで順調に次世代の波が到来している事を実感します。

私も来年には 0x20 歳になる訳で、下手をすると自分でも気付かないうちに(プログラマ、エンジニアとして)老害に片足を突っ込んでしまっている可能性も考えられます。そうならないように、こう言った書籍、あるいはコミュニティなどから過剰摂取で死なない程度に刺激をもらい、いろいろな意味で自分の若さを保つ事もこれからどんどんと必要になっていくのだろうと思います。

そう言った意味も含めて、プログラミングの魔導書 にはこれからも期待しています。