[ 目次, 前節, 次節, 索引 ]

第一版への前文



計算機はヴァイオリンのようだ. まず蓄音器, 次にヴァイオリンを試す初心者を思ってみよう. 後者について彼はひどい音だという. これはヒューマニストや殆んどの計算機科学者から聞いてきた議論である. 彼らは計算機は特定の目的には役にたつが柔軟性を欠くという. ヴァイオリンもタイプライタもその使い方を学までは柔軟でない.

Marvin Minsky, 「プログラミングが不十分にに理解され, 雑然と形式化された思考を表すのに絶好の媒体である理由」

「計算機プログラムの構造と解釈」はマサチューセッツ工科大学の計算機科学での入門レベルの科目である. これはMITで電気工学か計算機科学を専攻するすべての学生にとり「共通コアカリキュラム」の四半分として必修である. 他には回路と線形システムの二科目とディジタルシステムの設計の科目がある. われわれは1978年からこの科目の開発に関ってきており, 1980年の秋学期からこの教材を現在の形で毎年600名から700名の学生に教えた. これらの学生のうち, 多くは計算機で少しは遊んだことがあり, 僅かはプログラムやハードウェア設計の経験を持っているが, 大部分は計算の正式教育を少ししかまたは全く受けていない.

   この計算機科学の入門科目の設計には二つの主要な関心事があった. 第一に計算機言語は単に計算機に演算を実行させる方法だけでなく, 方法に関する考えを表現する新しい形式的媒体であるという考えを樹立したかった. そこでプログラムは人びとが読むように, そして計算機はたまたま実行するように書くべきである. 第二にこの科目が扱う実質的な材料は, このレベルが特定のプログラム言語の構成の構文でも, 特定の関数を効率よく計算するアルゴリズムでも, アルゴリズの解釈や計算の基礎でもなく, 巨大なソフトウェアシステムの知的複雑性の制御に使う技法であった.

   われわれの狙いはこの科目を修めた学生は, プログラミングの各種の流儀と美学に健全な感覚を持つべきであるということだ. 彼らは巨大システムの複雑さを制御する主要な技法の力を持つべきである. 彼らは模範的な形で書いてあれば50ページのプログラムも読めるべきである. 彼らはいつでも何を読まず, 何を理解しないでよいか知るべきである. 彼らは元々の作者の精神と文体を維持したまま, プログラムの修正に確信を持つべきである.

   これらの技法は計算機科学の学生に限られたものではない. われわれが教え, 頼る技法は工学設計のすべてに共通する. われわれは複雑さを制御するのに場合により細部を隠す抽象を構成する. 複雑さを制御するのに標準的でわかり易い部品を「取り替え引き替え」して組み合せ, システムが構築出来るよう, 公認インターフェースを用意する. 複雑さを制御するのに設計のある面を強調し,他を軽視する設計記述用の新言語を用意する.

   この科目の基礎には, 「計算機科学」は科学ではなく, その重要さに計算機はあまり関らないというわれわれの確信がある. 計算機革命は, われわれが物を考える方法, 考えを表現する方法での革命である. この変化の本質は手続き認識論(procedural epistemology)---数学の古典的主題で採用するより宣言的観点より命令的観点からの知識の構造の研究---と呼ぶのが最適なものの出現である. 数学は「何である」の概念を精密に扱う枠組を提供する. 計算機科学は「いかにして」の概念を精密に扱う枠組を提供する.

   この教材を教えるのに, プログラム言語Lispの一方言を使う. われわれはその必要がないので, 言語を形式的に教えることはない. ただ使うだけだが, 学生は数日でそれに慣れる. これはLisp様の言語の一つの大きな利点である: 合成式を形作る方法は非常に少なく, 構文構造も殆んどない. 形式的な性質はチェスの規則のように一時間もあれば話せる. しばらくすると言語の構文に関する細部は(何もないので)忘れ, 実の論点---何が計算したく, 問題を扱える部分にどう分解し, 部分をどう扱うか---に進める. Lispのもう一つの利点は, 他のどの言語よりもプログラムの部品分解の大型戦略を多く支援する(が, 強制はしない)ことである. 手続きをデータが抽象化出来, 利用の共通パターンを捕える高階関数が使え, 代入とデータ変更で局所状態がモデル化出来, プログラムの部品をストリームと遅延評価で連結出来, 組込み言語が容易に実装出来る. これらのすべては漸進的プログラム設計, 構築, テスト, 虫とりの優れた支援のある対話的環境に組み込まれている. John McCarthyを祖とし, 空前の能力と気品のある繊細な道具を作った歴代のLispの達人のすべてに感謝したい.

   われわれの使うLisp方言のSchemeはLispとAlgolの能力と気品を統合しようとする試みである. Lispからは単純な構文から引き継いだ超言語能力, データオブジェクトとしてのプログラムの一様な表現, ごみ集めされるヒープ領域に割り当てたデータを貰った. AlgolからはAlgol委員会にいたプログラム言語設計の開拓者からの贈物である静的有効範囲とブロック構造を貰った. われわれはChurchのλ算法とプログラム言語の関係における彼らの識見についてJohn RaynoldsとPeter Landinの名を挙げたい. 視野に計算機が現れる何十年も前にこの領域を開拓した数学者への借りを認めたい. そういう開拓者にはAlonzo Church, Barkley Rosser, Stephen KleeneおよびHaskell Curryがいる.


[ 目次, 前節, 次節, 索引 ]