3行でいうと

  • 言語Schemeの習得ではなく、計算と抽象化の本質を学ぶことが目的
  • 手続き、データ、状態、言語処理系、レジスタマシンの順に抽象化を引き上げる
  • 名著だが骨のある内容で、挫折する人も多いと語られる

向いている人

言語やフレームワークの流行に左右されない、設計の考え方を身につけたい人。時間をかけて課題を解きながら読める人。

読む意味

関数型の考え方、遅延評価、インタプリタやコンパイラの仕組みといった、言語を超えて通じる概念を一つの流れで学べる。下から積み上げる『コンピュータシステムの理論と実装』と対比すると、抽象化を上から見る視点が補える。

読むときの注意

前置記法と大量の括弧という、Lisp系言語の書き方に慣れが要る。Schemeにパターンマッチングや代数的データ型がなく、初学者の入門言語として適切かどうか疑う批判もある。

どんな本か

この本は、MITで長く入門教育に使われた講義をもとにした、計算機科学の古典である。通称「SICP」(シクピー)。表紙に魔術師が描かれていることから「ウィザード・ブック」とも呼ばれる。プログラミング言語Schemeを使うが、目的はSchemeそのものを覚えることではなく、「計算とは何か」「抽象化とは何か」を、プログラムを組みながら学ぶことにある。通常なら複数の専門科目に分かれる内容を、最小限の言語機能で一つの視点から扱うのが特徴である。

全5章で、抽象化の水準を段階的に引き上げる。第1章は手続きによる抽象で、再帰や、関数を引数に取る高階手続きを学ぶ。第2章はデータによる抽象で、リストなどのデータ構造や汎用演算の設計を扱う。第3章は代入と状態を導入し、オブジェクト、ストリーム、並行処理の難しさを論じる。第4章では、Scheme自身でSchemeを解釈する評価器(メタサーキュラー評価器)を作り、遅延評価や非決定性計算、論理型プログラミングへ進む。第5章ではレジスタマシンのシミュレータを作り、コンパイラやメモリ管理の原理に踏み込む。

評価は高い一方、前置記法と括弧の多い書き方や、数式・記号処理に偏った題材が、実務のWeb開発とは距離があるという指摘もある。「名著だが挫折者も多い」と語られる本である。

中身の柱

あわせて読む本

書評データベースの全文を読む

概要

MITで長年コンピュータサイエンス入門教育に用いられてきた講義をもとにした著作で、通称「SICP」(シクピー)として世界中のプログラマーに知られる古典。原著初版は1985年にMIT Pressから刊行され、第2版は1996年に発行された。日本語版は和田英一の翻訳により、初版は1990年代に、第2版は2000年に翔泳社から刊行されている。本書はプログラミング言語Schemeを教材として用いるが、その目的はScheme習得そのものではなく、「計算とは何か」「抽象化とは何か」というコンピュータサイエンスの本質的な概念をプログラムの構築を通じて学ぶことにある。手続き的抽象、データ抽象、状態を持つ計算、並行性、言語処理系の実装(インタプリタ・コンパイラの自作)といった、通常であれば複数の専門科目に分かれて教えられる内容を、一貫した視点と最小限の言語機能(Scheme、Lispの方言)だけで統一的に扱う点に本書の際立った特徴がある。序文でアラン・ケイが「20年先を行く教科書」と評したとされる逸話が広く知られており、単なるプログラミング入門書ではなく、計算機科学者としての思考様式を養う教育書として位置づけられている。表紙に描かれた魔術師(ウィザード)の図像から、ハッカー文化圏では本書は古くから「ウィザード・ブック(Wizard Book)」の愛称で呼ばれてきた。

本の構成

本書は全5章構成で、抽象化のレベルを段階的に引き上げていく構成を取る。第1章「手続きによる抽象の構築」では、代入や副作用を用いない純粋な手続き的プログラミングを通じて、再帰、高階手続き(関数を引数や戻り値として扱う)、計算量の解析を学ぶ。第2章「データによる抽象の構築」では、ペア(コンスセル)やリストを用いたデータ構造の構築、記号微分や集合演算などの具体例を通じて、データ抽象化とメッセージパッシングによる汎用演算の設計(データ主導プログラミング)を扱う。第3章「モジュール性、オブジェクト、状態」では、代入と可変状態を導入し、オブジェクト指向的なモデリング、環境モデルによる評価の仕組み、ストリーム(遅延評価による無限データ構造)、並行処理とその困難さを論じる。第4章「超言語的抽象」では、Scheme自身を用いてScheme(の部分集合)を解釈するメタサーキュラー評価器(Metacircular Evaluator)を実装し、遅延評価、非決定性計算(amb評価器)、論理型プログラミングへと発展させる。第5章「レジスタマシンによる計算」では、抽象的なレジスタマシンのシミュレータを構築し、コンパイラの基本原理や末尾再帰の実装、メモリ管理(ガベージコレクション)にまで踏み込む。

主要な内容

本書全体を貫くテーマは「抽象化の階層を自らの手で構築し、その階層を必要に応じて行き来する能力を養うこと」である。第1章の高階手続きの議論では、和の総和(sigma)や不動点探索といった数学的な操作を、共通のパターンを抽出した汎用手続きとして表現する手法が示され、プログラムを単なる命令の羅列ではなく数学的な構成物として捉える視座が提供される。第2章の「データ主導プログラミング」と「メッセージパッシング」は、後のオブジェクト指向プログラミングの基礎概念(ポリモーフィズム、ディスパッチ)を、クラスという言語機構なしに素朴な形で構築して見せる点が特徴的である。第3章では、代入を導入することで得られる表現力の増加と引き換えに生じる「時間」という概念の複雑さ(同一性と等価性の区別、副作用の管理)が丁寧に論じられ、続くストリームの議論では遅延評価によって副作用を避けつつ無限のデータ列(フィボナッチ数列や素数列など)を扱う手法が示される。第4章のメタサーキュラー評価器は本書のハイライトであり、eval-apply循環(評価器の中核ループ)を実装することで、プログラミング言語の意味論そのものをプログラムとして表現し理解する体験を提供する。ここから非決定性計算やストリームベースの制約伝播システムへと発展させる過程は、言語設計の自由度と可能性を強く印象づける。本書は1985年の初版刊行後、MITの必修科目「6.001(Structure and Interpretation of Computer Programs)」の教科書として2007年秋学期まで長く採用され続けたが、共著者の一人であるジェラルド・サスマン自身が後年のインタビューで、ロボット工学やメカトロニクスの発展によりハードウェアが安価かつ複雑になった結果、「原理を理解することが以前ほど本質的ではなくなった」と述べ、同科目自体を旧来のカリキュラムから置き換えることを長年主張していたことも知られており、実際MITは2000年代後半にPythonを用いた別カリキュラムへと入門講義を移行させている。

具体例

具体例としては、ニュートン法による平方根の近似計算、記号微分プログラム、集合をリストや二分探索木、非順序リストなど複数の表現で実装し比較する演習、電気回路のシミュレーション(制約伝播プログラミング)、Alyssa P. HackerとLouis Reasonerという架空の登場人物による誤答と正答のやり取りを通じた対話的な解説などが繰り返し登場する。特に有名なのが、第2章で構築される「絵の言語(Picture Language)」で、再帰的なパターンによって幾何学模様を生成するプログラムを通じて、高階手続きと合成可能な抽象化の威力を視覚的に体感させる構成になっている。また第3章の銀行口座オブジェクトのシミュレーションは、代入とカプセル化によって現実世界のオブジェクトをモデル化する典型例として広く引用される。刊行から間もない1986年、専門技術者向け雑誌『BYTE』は本書を「自らの専門性に真剣に向き合うプログラマーのための一冊」として推奨し、経験を積んだプログラマーにも新旧双方の話題への理解を深めさせる書物であると評した一方、平易な入門書ではなく骨のある読み物であることも同時に指摘している。

実践への応用

SICPで扱われる概念は特定の言語やフレームワークの使い方ではなく、抽象化・再帰・高階関数・遅延評価・メタプログラミングといった、あらゆる言語に通底する設計思考そのものである。関数型プログラミングの興隆(JavaScriptにおける高階関数の多用、Reactの宣言的UI、Rxのストリーム処理、Pythonのジェネレータによる遅延評価など)は、本書が扱う概念の応用形として理解できる。また、DSL(ドメイン特化言語)の設計やインタプリタ・コンパイラの実装に携わるエンジニアにとって、第4章・第5章で構築される評価器やレジスタマシンは実務的な処理系実装の縮図であり、パーサコンビネータや構文解析、バイトコード生成の基礎理解に直結する。ソフトウェア企業の経営や技術選定においても、「言語やフレームワークの流行に左右されない、計算そのものへの理解」を土台とする人材育成の観点から、本書の学習は長期的な技術力の基盤形成として評価されることが多い。

位置づけ・評価

本書はMITの必修科目「6.001」の教科書として1980年代から2000年代にかけて長く使用され、その後MITではPython等を用いた別カリキュラムに移行したものの、SICP自体は計算機科学教育史上の金字塔として世界中の大学・独学者コミュニティで参照され続けている。ハル・アベルソンとジェラルド・サスマンはいずれもMITの著名な計算機科学者であり、本書の内容はACM SIGCSEなどの計算機科学教育の議論でもたびたび引用されてきた。近年ではクリエイティブ・コモンズ(CC BY-SA 4.0)ライセンスの下で原著テキストが公開されているほか、JavaScript版(SICP JS、2022年発行)も刊行され、教育現場での題材の変化に合わせた展開も見られる。一方で、プログラミング言語学者フィリップ・ウォドラーらは、Schemeがパターンマッチングや代数的データ型を欠き、評価戦略の選択が初学者を混乱させうる点を挙げ、入門言語としてのSchemeの適性に疑義を呈する批判を行っている。またLisp系言語特有の構文(前置記法・大量の括弧)に対する学習コストの高さや、数式処理・記号処理に偏った題材が実務的なWebアプリケーション開発とは距離があるという指摘もあり、「名著だが挫折者も多い」書籍として語られることが多い。それでもなお、本書に触発された後継教科書として『How to Design Programs』や『Essentials of Programming Languages』などが生まれており、抽象化能力そのものを鍛える教材としての価値は色褪せておらず、計算機科学の基礎体力を養う書物として現在も版を重ねて参照されている。