やはりお前らはSICPを読むといい

この記事はVOYAGE GROUP Advent Calendar の12/24分です
なんか推敲が間に合わず、12/24に間に合いませんでしたが、今更だします。ごめんなさい。


SICP(計算機プログラムの構造と解釈)と言う本をご存知ですか?私はこのSICPという本が大好きで、社内でも何度も読書会を催しています。なぜ読書会をするかというと、一人で読みきるのは辛い(人もいる)ためです。
この記事では何がそんなに良いのかという説明をします。


そもそもこの本は、MITの6.001という計算機科学講義の教科書としてデザインされ、実際に使われていたものだそうです(今は別な本が採用されている)。

同様の初歩的な計算機科学の教科書の中でこの本が特異だと私が感じるのは、おまじないやお約束を可能な限り廃して、ごく少数の根本的な動作原理のみを仮定して、変数とは何か、関数とは何か、プログラミングするという行為は何かを説明しようとしている点です。

いわゆる有名な Hello World のC版を掲載します。これだけのプログラムの中にいくつのおまじないが含まれるでしょうか。

#include<stdio.h>   /* Q.これは何? A.おまじない */

main()  /* Q. これは何? A.おまじない */
{
    printf("hello world\n");    /* Q. printf ( " \n ) ; はそれぞれ何? A. おまじない */
}

ああ、確かにLLだともっと短くできます。しかしここで問題にしているのはおまじないの少なさで、putsって何?という初学者の至極もっともな問に真剣に答えようとすると割りと面倒なのではないでしょうか。

puts "hello world"  # putsは関数?メソッド?メッセージ?基本手続き?標準ライブラリ?

あるいは、今はもう違和感を忘れてしまっただろうけど、次の式(言語によっては文)を見て下さい。

i = i + 1

i = i + 1 だって?等式が成り立ってないじゃないか!

あなたもきっと昔はこれに違和感を覚えたはずなのです。今や違和感を忘れてしまったあなたは、これに違和感を持つ初学者にどう説明するといいのでしょうか?


なぜこれらの説明が困難かというと、それはこれが本当は難しいことをしているからです。
本当はIOは難しいし、副作用も難しいのです。

じゃあSICPではどう説明しているかというと、IOに関する説明はほとんどしていないか最小限で、副作用に関しては最初は説明しません。副作用がない最小限のルールだけで記述できる動作モデルを最初は提示します。しばらくの間、その動作モデルの中でできる色々な面白いことを説明します。そしてしかるべき後に副作用をも説明できる完全なルールを提示しています。


「動作モデル」と言いました。あるいはその前に「動作原理」と言いました。SICPはひたすら動作モデルの説明をしているのだという見方をすることもできます。
その見方の上では、SICPの章立てを以下のように見ることもできます(「手続き」という用語は、他の言語でいう「関数」と思えばよいです。プログラム言語における「関数」は厳密には数学における「関数」ではないため、SICPでは謙虚に「手続き」と呼んでいるものと思います)。

  • 1章 手続き作用の置き換えモデルと手続き抽象
  • 2章 データ抽象
  • 3章 手続き作用の環境モデルと副作用
  • 4章 動作モデルを実際にプログラムで実装する=評価器(eval手続き、またはインタープリタ)の実装
  • 5章 評価器を何かの機械語に変換する=翻訳器(コンパイラ)の実装

この本を読むと何がいいのか。それはプログラムの動作モデルが身につくことです。おまじないや、スニペットのコピペや、経験則(=よく分からないがこう書くとこう動く)ではなく、明確な原理に基づいて、明確な意思と意図をもってプログラムを記述し、読み、抽象を構築することができるようになります。

完全な初学者が読んでもまあいいのかもしれませんが、職業プログラマで一応のプログラムの書き方は分かるが、本格的な計算機科学の教育を受けたことがなく、基礎に不安があるような方が、一歩先に進むための本としてもお勧めです。
興味を持たれた方は、正月休みにでも、読んでみるといいのではないでしょうか。