「たしなみ」ではなく「たのしみ」としてのSICP

こんにちは、SICPが好きな高橋です。って、どんだけ好きかはこの辺を読んでいただければ(ちなみに「このときの様子がなんとなく目に浮かんでいるのではないか」というのは控えめな表現で、100%かんぺきな再現力だと思います。私は爆笑してしまいました)。

さてさて、またまたSICPが話題になっていたようですね。しかもちょっとネガティブな意味でも。まあ、確かに新版の翻訳はちょっと読みにくいのもありますし、万人におすすめ、というわけではないのもわかりますが。
だがしかし。

http://d.hatena.ne.jp/nowokay/20090322#1237667055

じゃあ、SICPはどういう本か。
LISPを使って仮想マシンを作って、LISPコンパイラを作って実行させて、プログラムがどのように動くかを勉強する本だ。

えええええ。いやいやまさか、そういう本じゃないはず、ですよね?
とは言うものの。でも、こちらのように、

よくわからないけど全部やると大人の仲間入りできるらしいとか、よくわからないけどこの先に何かあるかもとか、よくわからないけどオレは今SICPをやってるんだという満足感とか、よくわからないけどオレは今Schemeをやっているんだという満足感とか、そういうちょっとずれた満足感

をおぼえるための本、と思ってる人もいるのかなあと思うと、ちょっと残念になってきました。SICPって、そんなつまんない本じゃないですよ。

では、SICPとはどのような本なのでしょうか。

いや、もちろんそんなのは読み手によって変わってくるもので、私のそれも勝手な受け取り方、解釈の一つでしかないのですが、それを前提に言わせていただくと。少なくとも私にとってSICPとは、「プログラム」そして「プログラミング」という営為の見方を変えるもの、もっと言うと世界に対する見方、すなわち「世界観」を与えてくれるものなのです。

その世界観とは何か。ずばりまとめてみましょう。

これです。これ。プログラミング言語好きにはなんと都合のいい世界観でしょう。でも、わりとそういう読み方を素直に許してくれるような本だと思うんですよ。

1番目についてはあまり議論の余地はないでしょう。本書の第4章にも、こう書いてあります。

この点を認めるのはプログラマとしてのわれわれ自身の見方を変えることである。われわれは他人の設計した言語の利用者であるよりは、言語の設計者として自分を見るようになる。

つまり、プログラマ、プログラムを作る人とは、「新たな言語を作る人」、なのです。

なんで本書の第4章では言語処理系を作るのでしょうか。それは単に知的好奇心、あるいはペダンチックな感情を満足させるためのものでもなければ、単なる教養のためでもないのです。あらゆるプログラムは、本質として言語処理系なのです。であれば、よいプログラムを書くためには、言語処理系を書くための技術が役に立つはずです。ふつうに作る様々なプログラムを良いものにするために、言語処理系の実装を学ぶのです。

しかし、それは第4章で突然始まったものではありません。第3章で出てくるオブジェクト指向はもちろん、計算の環境モデル、遅延評価、これらはプログラミング言語の処理系を理解する上で重要な概念でもありますが、それはすなわち言語処理系としてのプログラムを作る上でも重要なわけです。そしてもちろん、そのためには、第1章での処理の抽象化、第2章でのデータの抽象化も学ばなければならないのです。

さらに、本書で取り上げているサンプルにも注目してほしいところです。デジタル回路や銀行口座、プログラミング言語レジスタ計算機……基本的に、シミュレーションのようなものが多いことに気づくはずです。これらはすなわち、プログラムを単に何かのツールとなるものと考えるのではなく、世界を映し出す一つのモデルとして、その記述形態として、プログラムというものをとらえているのです。

この2つが合わされば。この世界のさまざまな振る舞いが、CやJavaRubyErlangといったようなプログラミング言語……とはだいぶ違っているけど……のような、一種のプログラミング言語処理系のそれに近いように思えてくるはずなのです。強引だけど。でもそう見えません? そしてそう見えると、はっとしませんか? ああ、世界は、言語処理系なんだ! そうだったのか!! とか。

それは、とてもたのしい経験だと思うんです。得られる知識によってたのしい、というのではなく、その驚きが、興奮が、それを感じることが、とてもたのしい経験なんじゃないかと。それはきっと、プログラムというものを知っている人ならではの、プログラマならではのたのしみです。プログラミングをおぼえて、プログラマになってよかった、そう思える経験なんじゃないかと。

プログラミング言語の入門書や、プログラミングの入門書や、言語処理系の入門書はたくさんありますが、こういうたのしみを得られるような本はあんまりないと思うのです。だからこそ、プログラマな人なら、SICPはぜひ一度読んでいただきたいなあ、と思うのでした。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈