書評: Windows System Programming 4th Edition (Kindle Edition)
ちょっと前に 鵜飼さんが紹介していた Johnson M. Hart の Windows System Programming 4th Edition を Kindle Edition で読みましたので、その感想を書きたいと思います。
h2. Kindle Edition
Kindle 版のまともな書籍を買うのは実はこれが初めてでした。通勤電車で一冊通して読んでみて、小さなスマートフォンでも快適に読める flowing text なフォーマットのよさがようやく実感できた気がします。紙の本に比べて値段が半額近くになるのもありがたいことです。
ただしこの本はプログラムリスティングがいくつかの分割された画像として貼り付けられており、スケーリングされて読みにくいしコピペもできないしでかなり微妙でした。まあそれらはみな サポートサイト でダウンロードできるものなので大きな問題はないです。
Kindle 版の出来は本によって大きく異なるものなので、購入前に amazon.com で紙版と Kindle 版両方の立ち読みをしてみるのがよいでしょう。この本の場合は Chapter 2 くらいまでの内容の Kindle サンプル版もあり無償の Kindle アプリにダウンロードして読むことができます。
Kindle アプリではこれまた無償の英和辞典を使って文中の単語の意味を即座に調べることができるのですが、英文を読み進める上でこれが非常に役に立ちました。現時点で洋書を読むにはいちばん捗る環境なのではないかと思います。
Windows System Programming 4th Edition
本書は Windows API による低レベルシステムプログラミングの本です。ファイル・メモリ・プロセス・スレッド・通信・セキュリティといったトピックを 15 の章に分けて扱っています。GUI プログラミングの話題は一切ありません。
4th Edition は 2010 年 2 月に出ており Windows 7 までがカバーされています。当然ながら Windows 8 の内容はまだありませんが、しばらくはこれで十分でしょう。
各章ごとに主要な Windows API の使い方を例題の実装を通して解説し、最後に演習問題がついてくるスタイルになっています。サーバプログラムなど特定の例題は複数の章にわたって繰り返し登場し、名前付きパイプ版とソケット版、マルチスレッド版と非同期 I/O 版といったように API や実装の違いによる性能の差を提示しており参考になります。
また Windows ネイティブな機能の説明に終始することなく、随所に Posix API のとの比較考察もあり Posix プログラミング経験者には読みやすい本です。
総合的にはまさに W. Richard Stevens の古典的名著 Advanced Programming in the Unix Environment (邦訳 詳解 UNIX プログラミング) の Windows 版と言えるような本だと思います。著者もこれを意識しているようで、両方読んで API の違いを比較するといいと序文にあります。 Stevens の本で Unix プログラミングを学んだ人には間違い無くおすすめできます。
これまで Linux ばかりをいじってきた私が本書を読んで面白く感じたのはやはり Posix と Windows の低レベル API の設計や考え方の違いです。かいつまんであげると、
- 例外処理
- Structured exception handling
- MSVC 独自予約語 (
__try
とか__except
とか)
- ハンドル (
HANDLE
)- ファイル・パイプ・ソケットだけでなくプロセス・スレッド・同期オブジェクトもハンドルで参照する
- 「シグナル状態」なる概念と統一されたシグナル待ち関数
- Asynchronous procedure call と alertable wait functions
- 非同期 I/O
- Overlapped I/O
- Alertable I/O
- I/O completion port
- Windows サービス
- セキュリティオブジェクト
特にハンドルのシグナル状態や APC を土台にして設計された I/O 多重化のしくみは Posix API とは設計が大きく異なる部分であり、興味深く読めました。
また例外処理ではコンパイラに予約語を追加して言語レベルでサポートしていることに驚きました。 MinGW のような他の代替処理系ではこれをどのように扱っているか気になったので後で調べてみようと思います。
Looking Ahead
本書を読んで Windows API の詳細を知り、Windows ネイティブなシステムプログラミングの定石を学んだ後にするべきことは、既存のソフトウェアのコードを読み、実際に自分でなにか書いてみることでしょう。
私の場合は Posix でも Windows でも動く低レベルでポータブルなソフトウェアの作り方について興味がありますので、そのようなソフトウェアの基盤として有名な libevent や libev / libuv あたりでも読んでみようかなと思います。
特に libevent の Windows のサポートについては select() に加えて I/O completion port を導入しようと頑張っているところらしいので、なかなか面白いのではないでしょうか。
2012/06/16 16:06:00 JST