積読Blog
このBlogでは自分が読んだプログラミングや数学関係の本の感想を中心に、その周辺の話題について書いていきます。
スポンサーサイト

Windowsプログラミングの極意 歴史から学ぶ実践的Windowsプログラミング!
Windowsプログラミングの極意 歴史から学ぶ実践的Windowsプログラミング!Windowsプログラミングの極意 歴史から学ぶ実践的Windowsプログラミング!
(2007/08/29)
Raymond Chen

商品詳細を見る


Windowsは10年以上前から脈々とバージョンアップし続け、今日ではWindows Vistaという形になっています。
こんな最新のOSですが、よく目を凝らしてみると隅々に歴史の痕跡があります。
この本は「なぜこんな仕様になっているのか?」という質問に答えてくれる、数少ない本です。

たとえば、

・なぜ「シャットダウン」がスタートメニューにあるのか?
・メニューの項目でたまに見かける「開く(O)…」などの「…」はどういう意味があるのか?
・右クリックメニューの太字のメニュー

というユーザインターフェイスに関する疑問から、

・WPARAMやLPARAMという型のWやLとは何か?
・WinMainの2番目の引数HINSTANCE hPrevInstanceの意味は?

というWindowsプログラミングに関する疑問などに対する答えが載っています。

表紙のデザインがちょっと古くて一見すると昔の本に見えますが、実は出版されたのは去年です。
この本の内容は、こちらのブログThe Old New Thingの内容をまとめたもので、Windows XPに関する内容まで書かれています。

かなりマニアックなAPI内部の処理方法に関して書かれたところもありますが、内容は項目ごとに分かれているので、解るところ拾い読みできるようになっています。本屋さんで見かけたら、気になる項目をちらっと読んでみると楽しめるはずです。
計算モデル論入門―チューリング機械からラムダ計算へ
計算モデル論入門―チューリング機械からラムダ計算へ (Information Science & Engineering (F5))計算モデル論入門―チューリング機械からラムダ計算へ (Information Science & Engineering (F5))
(2006/12)
井田 哲雄、浜名 誠 他

商品詳細を見る


「計算理論」という言葉は、大学などでコンピュータサイエンスを専攻していなかった人にはあまり馴染みがない言葉だと思います。コンピュータサイエンスを専攻していた人でも、聞いたことがないという人もいるかもしれませんが、チューリングマシンやオートマトンという言葉なら聞いたことがあるのではないでしょうか。

この本のタイトルにある計算モデルとは、簡単に言ってしまうとプログラミング言語の究極的にシンプルにしたものです。したがって、計算モデルによってある計算ができるならば、他のあらゆるプログラミング言語でもプログラミングその計算ができるわけです。

計算理論では、この究極的にシンプルなプログラミング言語の計算モデルを使って、さまざまな問題を考えます。たとえばそのひとつが「計算可能性」という問題です。

計算可能性とは、その名のとおり、ある計算が可能かどうかを決定する問題で、有名な問題に「巡回セールスマン問題」という問題があります。問題設定自体は非常に簡単で、「あるセールスマンが東京、名古屋、大阪、仙台などの複数の都市を順番に巡る場合、どういう順番でいけば一番効率がよいか」という問題です。

一見簡単そうに聞こえますが、実はこれミレニアム懸賞問題という数学の7つの未解決問題のうちのひとつ「P≠NP予想」という難題につながる問題です。(そのうちのひとつが、数年前に解決されたというニュースで話題になった「ポアンカレ予想」)



計算モデルにはいくつか種類があり、この本では「チューリングマシン」「帰納関数」「ラムダ計算」の三つを中心に、それらの概論を説明してくれます。

チューリングマシンは、どちらかというとハードウェア的な計算モデルで、皆さんがおなじみのC/C++やJavaなどのたいていのプログラミング言語(手続き型言語)はチューリングマシンが背景となっています。

それに対してラムダ計算は、より抽象的でソフトウェア的な計算モデルで、以前の記事でも書いたF#やHaskellなどの関数型言語はこの計算モデルを背景としています。最近C#やJavaなどにも、「ラムダ式」というものが導入されていますが、これはこのラムダ計算に由来します。

この本はプログラミングの本というよりは、どちらかというと理学寄りの内容で、これらの計算モデルの説明に数学的な議論が展開されます。しかし、必要とされる数学の知識は集合論の基礎程度で、「全単射」や「同値類」などのキーワードを知っていると読むのに有利かもしれません。一応冒頭では集合とは何かから簡単におさらいしているので、それを知らない人でも読めるようになっています。この本は計算理論の入門書としては大変よみやすいいい本だと思います。

ちょっと敷居を上げるようないいかたをしてしまいましたが、話の展開は親切で大変わかりやすいです。特に帰納関数に関する部分は読んでいても楽しかったです。
軽く内容を話すと、帰納関数とは以下の3つの組み合わせで計算を行う計算モデルで、足し算、引き算、掛け算、累乗などはこれらを組み合わせることで定義することが出来ます。
後者関数: f(x)=x+1
定数ゼロ関数: f(x)=0
射影関数: f1(x1,x2,x3,...)=x1, f2(x1,x2,x3,...)=x2, ...

どう組み合わせればそれらが出来るのかを考えるのはパズルみたいでとてもおもしろいです。
こちらでもうすこし詳しい説明と足し算を定義する例が書かれています。



この本の中では、オートマトンという概念も紹介されています。オートマトンはコンパイラや正規表現の理論には欠かせないものですが、これは「形式言語理論」という別の分野へと発展していきます。これについては、非常に奥が深いのでまた後日別の本を紹介することにします。
Advanced Windows 改訂第4版
Advanced Windows 改訂第4版Advanced Windows 改訂第4版
(2001/05)
ジェフリー リッチャー

商品詳細を見る


Windowsプログラマ必読の本です。
Windowsにおける少し進んだシステムプログラミングの解説書です。

Windowsプログラミングの基礎については現在さまざまな本がでており、多くの解りやすいものがあります。おすすめの本は、やはりMicrosoft公式の以下の定番の本でしょう。

プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)
(2000/10)
チャールズ ペゾルド

商品詳細を見る
プログラミングWindows第5版〈下〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)プログラミングWindows第5版〈下〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)
(2000/10)
チャールズ ペゾルド

商品詳細を見る


この本に書かれている内容は、Microsoftの公式ドキュメントであるMSDNライブラリにもすべて書かれていますし、他のサイトにもたくさん書かれています。

ところがAdvanced Windowsに書かれている内容は、MSDNライブラリにも書かれていないことが数多くあります。また書かれていたとしても、系統立ててかかれておらず、発見することは相当困難です。

この本はそれらを系統立てて書いており、ここで書かれている情報はWeb上でもあまりかかれていなかったりします。なので事実上この本を読んでいないと、高度なWindowsプログラミングはできないと思います。

内容的には基礎を理解した人向けの本なので少し高度ですが、時間をかけてでも読む価値はあると思います。
C言語ポインタ完全制覇
C言語ポインタ完全制覇 (標準プログラマーズライブラリ)C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
(2001/01)
前橋 和弥

商品詳細を見る


C言語のポインタは難しいといわれています。
本来ポインタそのものの概念は難しくはないと思うですが、C言語のポインタに関する文法は確かに難しいというかわかりにくいと思います。

実際、世の中には多くのC言語の入門書が出ているものの、ポインタについては記述があいまいだったり間違ったことが書かれている場合もあるようです。
僕はよくポインタについていい本はないかと尋ねられますが、そのときはこの本を紹介しています。

僕も昔、この著者のページを読むまで、ポインタは理解できていると思っていました。しかしこのページを読んで、目から鱗が落ちました。

複雑なポインタの宣言でも、ある規則にしたがって読めば必ず読めます。
上のページではその規則を、たいへん解りやすく説明しています。
ポインタに自信がない人は是非読んでみると自信がつくかもしれません。
数学で物理を
数学で物理を数学で物理を
(2007/03)
武部 尚志

商品詳細を見る


これは数学セミナーという雑誌の連載記事を加筆修正して本にまとめたものです。

高校で学ぶ物理学は、学習指導要領や生徒の数学的基礎知識などの制限によって、あまり高度な数学を使って理論を展開してきませんでした。
この本は高度な数学を使うと、物理学(力学・電磁気学)をさらに高い次元から俯瞰することができ、大変美しい全体のつながりがあることを示してくれます。

ニュートンの運動方程式を時間や位置で積分して、運動量保存の法則や力学的エネルギー保存のを法則を導くところはとても美しかったです。

また、後半では微分形式という高度な数学を用いてマクスウェルの方程式を大変シンプルな形で示して見せましたが、僕は電磁気学はまだ良く知らないので狐につままれた感覚がしました。しかし、理論の展開からその美しさの雰囲気は垣間見えた気がします。
Programming in Haskell
Programming in HaskellProgramming in Haskell
(2007/01/15)
Graham Hutton

商品詳細を見る


この本は純粋関数型言語Haskellの入門書です。
名著とよばれるものは、誰でも知っているような非常に簡単なことから説明を始め、気がついたら高みに導かれているという体験をさせてくれるとよくいいますが、この本はまさにそれです。

これはHaskellの機能を広く浅く紹介してくれますが、浅いといっても基本的なところはしっかりと抑えており、なによりも読んでいて楽しい本です。こんな楽しい本は久々でした。
この本はプログラミングをしたことのない人もターゲットにしていて、Haskellの言語自体の紹介をすると同時に関数型プログラミングの考え方やテクニックを無理なく紹介してくれています。
また、章末の練習問題も適度な難易度で、楽しく達成感を味わいながら理解を深めていくことができます。

またこの本がすばらしいのは、Monadについてもきちんと紹介している点です。
MonadというのはHaskellがもっている高度な概念で、難しい概念と恐れられています。
これは「MonadといえばHaskell」というくらいの目玉機能で、Haskellを学ぼうとする人は誰しもがこれを理解しようと試みるのではないでしょうか。

実際、僕もMonadをある程度理解するのにはゆっくりですが1年以上かかりました。
まあ理解したといっても、Monadを使ったコードが多少読み書きできる程度で、これを駆使出来るほど深い理解はできていません。

最近、日本語のHaskellの本が数冊出版されていますが、これらの本ではMonadの解説をある意味放棄してしまっています。

しかし、この本ではIO MonadというMonadのうちの1つに絞って非常に限定した説明になってはいますが、それでもMonadの基本はきちんとおさえています。僕はこの解説によって、目から鱗が落ちました。ここの解説で印象に残っているのが、Worldという仮想的な型を導入して、

type World whose values represent the current state of the world.
(世界の現在の状態を表現するWorld型)


という表現していたのがすごくカッコよかったです。

また、日本語のHaskellの本ではほとんど省略されていた、プログラムの正当付けについても説明している点もいいですね。

Haskellではプログラムの動作を証明し、プログラムを正当付けするといったことをします。とくにHaskellでは無限リストという無限のデータ列を扱えるために、たとえば無限リストの長さを計算しようとすると無限ループに陥ってしまいます。その無限を扱うために皆さんも高校で出会った数学的帰納法を用いますが、この本ではその基本的なところを解説しています。

全体を通して、この本は今まで読んだHaskellの入門書やWebページの中で一番オススメできる本でした。