いつもお世話になっている西尾大先生から献本もらったので、うきうきしながら読みました。
この本をひところで説明するのは大変難しいのだけど、あえていうなら、プログラミング言語の進化よもや話としての読み物の側面と、これから自分の言語を作ろうと考えている人に向けた現在の言語たちの言語仕様のバックグラインドを説明する教科書的な側面があると思う。
C++の世界には「C++の設計と進化」(別名 D&E)というものすごい有名な本があるのだけれども、文体・書かれている内容ともにまったく似ていないのだけれど、読後感は驚くほど似ている。D&EはC++に絞って言語の進化の歴史となぜこの機能を採用したか、なぜ対案を採用しなかったかを記述しており、大変歴史的価値が高い逸品なのであるが、西尾本はプログラミング言語全体において、現代のモダンな言語で使われている諸機能・言語仕様について歴史をさかのぼり、たのしいトリビアを交えつつ設計の背景を教えてくれる。
この本が素晴らしいのは、「どこから調べてきたんだ」唸ってしまうトリビアの数々によりあきさせないこと。それぞれの章が完全に独立して読めるよう注意深く配慮されており、時間がないときでもどこからでも読めるようになっていること。
また、この手の歴史的な経緯を記述する本は往々にして、もう誰もしらない様な古代言語の話で埋まってしまい読んでいて退屈になってしまうのが常であるが、コードが出てくるのは C, Ruby, Perl, Python, JavaScript といった現代言語にだいたい限られており、それ以外は図を多用して説明してくれているので、年代問わず楽しめる書籍になっていることがあげられると思う。
「成り立ちから学ぶプログラミング作法」という副題から感じるニュアンスとはちょっと違って、おっさん層よりも、これからオレオレ言語を作ろうと考えている学生におすすめしたい。
なお公式紹介ページはこちらです: http://nhiro.org/langbook/
目次はこんな感じ
目次
第1章 言語を深く効率的に学ぶには
1.1 比較から学ぶ
1.2 歴史から学ぶ
1.3 まとめ
第2章 プログラミング言語を俯瞰する
2.1 プログラミング言語誕生の歴史
2.2 プログラミング言語の生まれた目的
2.3 まとめ
第3章 文法の誕生
3.1 文法って何だろう?
3.2 スタックマシンとFORTH
3.3 構文木とLISP
3.4 中置記法
3.5 まとめ
第4章 処理の流れのコントロール
4.1 構造化プログラミングの誕生
4.2 ifが生まれる前
4.3 while ──繰り返しのifを読みやすく表現
4.4 for ──数値を増やしながらのwhileを読みやすく表現
4.5 まとめ
第5章 関数
5.1 関数の役割
5.2 戻る命令
5.3 再帰呼び出し
5.4 まとめ
第6章 エラー処理
6.1 プログラムも失敗をする
6.2 失敗をどうやって伝える?
6.3 失敗しそうなコードを囲む構文
6.4 出口を1つにしたい
6.5 どういうときに例外を投げるか
6.6 例外の伝搬
6.7 まとめ
第7章 名前とスコープ
7.1 名前はなぜ必要だったか
7.2 スコープの進化
7.3 静的スコープは完成形?
7.4 まとめ
第8章 型
8.1 型とは何か
8.2 数値をオンとオフで表現する方法
8.3 1つの位に必要なランプはいくつか?
8.4 実数はどうやって表現しよう
8.5 型は何のため?
8.6 型のいろいろな展開
8.7 まとめ
第9章 コンテナと文字列
9.1 いろいろな種類のコンテナがある
9.2 なぜいろいろな種類のコンテナがあるのか
9.3 辞書,ハッシュ,連想配列
9.4 文字とは何か
9.5 文字列とは何か
9.6 まとめ
第10章 並行処理
10.1 並行処理とは何か
10.2 細かく区切って実行する
10.3 処理を切り替える2通りの方法
10.4 競合状態を防ぐには
10.5 ロックの問題点と解決策
10.6 まとめ
第11章 オブジェクトとクラス
11.1 オブジェクト指向とは何か
11.2 変数と関数を束ねて模型を作る方法
11.3 方法1 モジュール,パッケージ
11.4 方法2 関数もハッシュに入れる
11.5 方法3 クロージャ
11.6 方法4 クラス
11.7 まとめ
第12章 継承によるコードの再利用
12.1 継承とは
12.2 多重継承
12.4 まとめ