Advanced Windows
改訂第4版

Jeffrey Richter 著
ロングテール/長尾 高弘 訳
アスキー 発行
2001年5月
1009ページ+CD-ROM
9975円(税込)
プログラミング
Microsoft .NET
Framework

Jeffrey Richter 著
吉松 史彰 訳
日経BPソフトプレス 発行
2002年7月
594ページ
6090円(税込)
アーキテクチャ徹底解説
Microsoft Windows 2000(上/下)

David A. Solomon,
Mark E. Russinovich 著
多摩ソフトウエア 訳
日経BPソフトプレス 発行
2001年4月
503ページ+CD-ROM(上),
408ページ+CD-ROM(下)
4179円(上/下,税込)
Windows XP
デバイスドライバ
プログラミング
[入門と実践]

浜田 憲一郎 著
技術評論社 発行
2003年11月
703ページ+CD-ROM
5040円(税込)
Windows XP
フィルタドライバプログラミング
[入門と実践]

滝口 政光 著
技術評論社 発行
2003年2月
271ページ+CD-ROM
3444円(税込)
はじめて読む Pentium
マシン語入門編

蒲地 輝尚,水越 康博 著
アスキー 発行
2004年8月
255ページ
2940円(税込)
32ビットコンピュータを
やさしく語る
はじめて読む486

蒲地 輝尚 著
アスキー 発行
1994年10月
494ページ
2548円(税込)

 最近はJavaで開発したGUIアプリケーションも少なからず見かけるようになったものの,「OSやハードウエアが用意する機能をフルに生かしたい」「パフォーマンスが非常に重要だ」といった場合は今でもC/C++が最良の選択肢であることは間違いありません。市販のWindowsアプリケーションやゲームのほとんどすべてがC/C++で組まれていることが,その証拠と言えるでしょう。ただ,こうしたC/C++の特徴を生かしたプログラムを組むためには,文法以外にもOSの機能やCPUなどについての深い知識が必要になります。Part3では,こうした知識や技術を習得するにあたって参考となる書籍を紹介します。

OSとしてのWindowsを理解する

 C/C++である程度のレベルのWindowsアプリケーションを組む場合,まず何と言っても必要なのがOSであるWindowsに関する知識です。Windowsでは,開発に必要な情報はほぼすべてPlatform SDKに付属するオンライン・ドキュメントから得ることができます。これを読みこなせるのであれば,ほかに必要なものはあまりありません。しかし,大部分が英語であることに加えて分量も膨大なため,何の基礎知識もなしに読むのはなかなか苦しいものがあります。最初は何らかの書籍で基本的な知識を身に付けておく必要があるでしょう。

 そういう意味で,まずお薦めしたいのが「Advanced Windows 改訂第4版」です。原著ともWindows 95の発売に合わせて1995年に初版が出版され,この第4版は2001年に改訂されたものです。そんなに古い本か,と思うかもしれませんが,現在のXPや2003 Serverのシステムの仕組みは,Windows 95から基本的に大きく変わっていません。10年近く売れ続けていることからも,その評価の高さをうかがい知ることができるでしょう。プロセス,スレッド,メモリー・アーキテクチャ,ファイル・システムという,32ビットWindowsシステムの骨格をなす仕組みの説明が,詳細かつわかりやすく書かれています。Windowsでプログラミングを行ううえで不可欠な知識であるとともに,SDKドキュメントやほかの技術書を読みこなすためのベースになる部分なので,ぜひ一度通読することをお薦めします。ちなみに著者であるJeffrey Richterは,本書の .NET Framework版とも言える「プログラミング Microsoft.NET Framework」も執筆しています。.NET Frameworkの仕組みを詳しく理解したい人はこちらもチェックしてみてください。

 さらにWindowsの様々な仕組みを一通り学びたい,という場合には「アーキテクチャ徹底解説 Microsoft Windows2000」を読んでみるとよいでしょう。この本は,Windowsの核となる部分(カーネル)の仕組みと役割から,プロセス/スレッドのスケジューリング,セキュリティの仕組み,ネットワーク管理など,Windowsのアーキテクチャ全般にわたって詳細に解説しています。必ずしもプログラミングに直接役立つものばかりではありませんが,Windowsのシステムを深く理解するには最適と言えます。

 デバイス・ドライバのプログラミングにも触れておきましょう。デバイス・ドライバと聞いただけで尻込みしてしまうかもしれませんが,32ビットWindowsのデバイス・ドライバ開発は,16ビットWindowsから比べるとずいぶん敷居が低くなっています。ドライバ・モデルが洗練されたほか,アセンブラの代わりにC/C++で開発することも可能です。とはいえ,一般のWindowsプログラミングとまったく同じというわけにはいきません。使用するAPIも専用のものになりますし,開発にはSDKのほかにDDK(Driver Development Kit)を別途入手する必要があります。

 このあたりのことを,実際に動作するデバイス・ドライバの作成を通じて習得できるのが「Windows XPデバイスドライバプログラミング」です。最後の2章だけは,特定の市販開発ツールを使用する話になってしまっていますが,そこまでの500ページの内容で,十分実践的な技術を身に付けることができます。この本で取り上げているのは,USB接続のCD-ROM用ドライバなので,あまりハードウエアに縁のない一般のプログラマにも比較的身近な題材と言えるでしょう。コンピュータの中の世界だけではつまらないという人は,市販のUSBデバイスの実験キットなどを利用して,外部機器をコントロールするようなデバイスの作成に挑戦してみてはどうでしょうか。

 それでも,やっぱりデバイス・ドライバには縁がなさそう,という人は,「Windows XPフィルタドライバプログラミング」に一度目を通してみてください。フィルタ・ドライバは,Windowsデバイス・ドライバの形式の一つで,直接ハードウエアを制御するものではありません。ハードウエアと既存のデバイス・ドライバ,あるいはデバイス・ドライバとOSの間に割り込んで「何か面白いことができる」ドライバなのです。これを利用すれば,ウイルス対策ソフトのようにファイル/ネットワーク入出力を監視したり,キーボードのキーの配置を入れ替えるといった,通常のアプリケーションでは不可能なことを実現できるようになります。

 この本では,豊富なサンプル・コードを使って,実際に動作するフィルタ・ドライバを作るところまで解説しており,とても実践的でわかりやすくなっています。ハードウエアを制御するわけではないので,特殊な知識も不要です。ちょっとしたアイディアを実現する手段の一つとして,覚えておいて損はありません。

CPUについて詳しく学ぶ

 OSの機能を詳しく勉強していくと,どうしても必要になる前提知識があります。それがCPUです。OSはCPUが用意する特別なサポート機能を利用してメモリー管理やプロセス管理などの機能を実現しています。言い換えれば,CPUを理解することがそのままOSを理解することにつながるのです。

 加えて,C/C++のエキスパートを目指すなら,関数呼び出し時のスタックの使い方なども当然理解しておく必要があります。アセンブリ言語についても,一から書くことはないにせよ,少なくとも読めた方がいいことは間違いありません。OSやライブラリなどが絡む不具合が出た場合,アセンブリ言語のレベルでデバッグせざるをえないような状況が生じるからです。

 CPUを理解するには,CPUがマシン語のプログラムを解釈/実行するハードウエアであることを知るところから,始めるべきでしょう。そもそもアセンブリ言語やマシン語って何? という人には,「はじめて読むPentiumマシン語入門編」をお薦めします。コンピュータの構成や2進法などの基礎知識を押さえたうえで,Pentiumのレジスタ構成と算術/論理演算,シフト演算,比較,ジャンプといった基本的な命令の紹介と使い方をやさしく丁寧に解説しています。この手の入門書の多くがコマンドライン上で動作するアセンブラを使って説明しているのに対し,本書がVisual C++のインライン・アセンブラやデバッガを使ってGUI環境上で話を進めている点は,とっつきやすく感じる人が多いでしょう。

 入門編を卒業したら,次の段階へと進みたいところですが,現時点で「Pentium」版の入門編に続く本はまだ出ていません。その代わりとして「はじめて読む486」をお薦めしておきます。486というと,もう古い,という印象を持つかもしれません。しかし,IA32と呼ばれる米Intelの32ビット・プロセサのアーキテクチャは,80386の時点で一つの完成形に達しており,その後も基本的な仕組みは変わっていません。したがって,本書の内容は出版後10年を経過した今でも,ほぼ通用するのです。

 「はじめて読む」とタイトルについているものの,本書は基本的に80386で拡張された部分,つまり32ビット・プロテクト・モードやページングなどに焦点を当てています。算術/論理演算などの8086に相当する機能についてはすでに理解していることが前提です。メモリーの保護,アドレス変換,特権レベル,タスク切り替え,割り込みなど重要な機能は一通り取り上げているので,本書を読めば32ビットOSの機能をプロセサ・レベルで理解できるようになるでしょう。ただし,Windowsが普及する以前に書かれた本であるため,Windows特有の事情については何も触れていません。このあたりは「はじめて読むPentium」の続編に期待というところでしょうか。