コンテンツにスキップ

SICP/text 1

提供:Wikisource

The acts of the mind, wherein it exerts its power over simple ideas, are chiefly these three: 1. Combining several simple ideas into one compound one, and thus all complex ideas are made. 2. The second is bringing two ideas, whether simple or complex, together, and setting them by one another so as to take a view of them at once, without uniting them into one, by which it gets all its ideas of relations. 3. The third is separating them from all other ideas that accompany them in their real existence: this is called abstraction, and thus all its general ideas are made.

ジョン・ロック(英 1632-1704), 『人間知性論』(1690年)第2篇第12章

今から計算機の process について学ぶことにしよう. 計算機の process は計算機の中にある抽象的な存在である. process が発動するにしたがって,process は「データ」という他の抽象的存在を操作する. process の発動は「プログラム」という一連の規則の繰り返しにより指示されている. 実際のところ,私達はプログラムという呪文によって計算機の精霊を操っているのである.

計算機 process は魔法使いのいうところの精霊とほとんど同一で,それは見えないし触れない. 物質からできているわけでもない.しかし現実に存在しているのだ. 知的作業をこなせるし,質問に答えることもできる.銀行でお金を支払うことや工場で ロボットアームを制御することで世界に影響を与えることもできる. 計算機 process を動かすために使うプログラムは記号の式で構成されている. プログラムは不可解で奥義めいてさえいる「計算機言語=プログラミング言語」で書かれており,プログラミング言語によって 計算機 process に実行することを望む仕事を記述するのだ.

計算機 processという概念,それが現実に対応するのは稼働中のコンピューターだが,それはプログラムを正確かつ精密に実行する. したがって,魔法使いの弟子と同じく,見習いプログラマーは,「まじない」の理解と結果の予測を学ばなければならない. プログラムの中のほんの小さな誤り(よくバグ(「虫」)とか glitch(ガタツキ・誤った信号)とかいわれている)でさえ, 複雑でときに予測しがたい結果をもたらすことがあり得る.

幸運にも,プログラムを習得することは,魔法を習得することよりもはるかに危険が少ない. というのも,私達が取扱う「精霊」は都合のいいことには,安全な方法で封じ込められているからだ. しかし,プログラムを実世界に応用するときには,注意と専門的技術と知恵が要求される. 例えば,計算機支援型設計プログラムに小さなバグがあったとき,それが飛行機やダムに 取り返しのつかない大崩壊を招いたり,工業用ロボットが自分で自分を破壊する,といったことが 起こることもあり得るのだ.

熟達したソフトウェア工学技師にもなると,プログラムを組織だって構成する能力があり, プログラムの結果 process は意図した仕事を実行することを,その論理的理由とともに確信することができる. 彼らは前もってシステムの振る舞いを可視化することさえできる. プログラムをいかに構成するかを知っており,予期し得ない問題が取り返しのつかない結果につながることもない. そしてもし問題が発覚しても,プログラムを修正(デバッグ)することができる. よく設計された計算機システムは,よく設計された自動車や原子炉と同じく,内部がモジュール式として 設計されており,部分・部品は個別に組み付けたり,置き換えたり,修正(デバッグ)できるようになっている.

Lisp プログラミング

[編集]

process を記述するのに適したプログラミング言語が必要であり,この目的のためにプログラミング言語「Lisp」を使用する. われわれが毎日考えるときには,通常は自然言語(たとえば英語・フランス語・日本語など)で表現する. また量に関する現象を記述するのには,数学的な記号で表現する. 同様に、私たちは process に関する思考は Lisp で表現することにする. Lisp は 1950 年代後半,ある種の計算モデルとしての論理式――「再帰方程式」と呼ばれている――の使用に関しての推論の形式化として発明された. Lisp は John McCarthy により考案され, 彼の論文 [[1]] に基づいている.

Lisp の始まりは数学的な形式化であったのだが,しかし,Lisp は実用的なプログラミング言語である. Lisp インタープリターは Lisp 言語で記述された process を実行する機械である. 最初の Lisp インタプリターは,McCarthy と彼の同僚,学生(マサチューセッツ工科大学(MIT)電子工学研究所の人工知能グループおよび MIT 計算センター)によって実装された.[1] Lisp という名前は「リスト処理(LISt Processing)」の綴りの頭文字を取ったものであり, 代数式の数式処理による微分・積分といったプログラミング上の問題を取扱うためのシンボル操作の機能を提供する目的で設計された. 「アトム」「リスト」で知られることになる新しいデータオブジェクトも,この目的で含むのだが,これは,この時期の他のプログラム言語とはまったく著しく異なるものであった.

Lisp は努力して設計をあらかじめ定めておく,といったものではなかった. そうではなく,実験的なやり方で個々のユーザーが必要に応じて,あるいは実践的に実装上の考慮にそって,非公式的に進化していった. 「公式 Lisp」なるものがないまま長年進化していき、そもそも Lisp ユーザーのコミュニティは伝統的に「公式なる」 Lips の定義を発布するという試みには抵抗するようになった. 最初の着想が持っていた柔軟性と簡潔さを保ちながら進化する Lisp, それは今日広く使われるコンピュータ言語の中では二番目に古い(一番古いのは Fortran)のだが, 絶え間なく進化することでプログラム設計に関する最新の概念を包み込むように適合させることを可能としたのだ. したがって Lisp は今日ではさまざまな系統を含む族であり,オリジナルの持つ特長のほとんどを持ちながらも,それぞれの系統は重要な点では互いに異なっていてもよい. この本で扱う Lisp は Scheme と呼ばれている. [2]


Lisp は,その実験的な性格とシンボル操作への重点化から,初期には,すくなくとも Fortran と比較すると数値計算には非効率的であった. しかし数年を経て,Lisp プログラムを機械語に翻訳する Lisp コンパイラが開発され,数値計算に対しても十分に効率的に計算できるようになった. そして特別な応用のために非常に効率のよい Lisp が使われるようになった [3] Lisp は昔の「どうしようもないほど効率がない」という評判を乗り越えてはいないのだけれども,Lisp は今は効率性が中心的な課題ではないアプリケーションでは多く使われている. 例えば,Lisp はオペレーティングシステムのシェルの言語,エディターや計算機支援デザインシステムの拡張言語などに選択される言語となってきている.

  1. 「Lisp 1 プログラマーズマニュアル」は1960 には著され、「Lisp 1.5 プログラマーズマニュアル」(文献 <McCarty その他, 1965>) は 1962 年に出版された. Lisp の黎明期については文献 <McCarty 1978> に記述されている.
  2. 1970年代に,プログラムを書くのに使用されていた Lisp 族の二大系統の一つは MacLisp(文献<Moon 1978>, 文献<Pitman 1930>)で,これは MIT の MAC プロジェクトで開発された, もう一つは Interlisp(文献 <Teitelman 1974>)で,これは BBNテクノロジーズおよびゼロックス・パロアルト研究所で開発された.Portable Standard Lisp(文献<Hearn 1969>, 文献<Griss 1981>)は 異なるアーキテクチャーの計算機の間でも簡単に移植できるように設計された Lisp 族の系統であった.MacLisp からは多数のサブ系統が生まれ,それは例えば,カリフォルニア大学バークレー校で開発された Franz Lisp,Zetalisp(文献<Moon and Weinreb 1981>),これは Lisp を非常に効率的に動作させるために MIT 人工知能研究所で設計された特殊用途プロセッサー上につくられた.この本で使われる Lisp の系統は,Scheme(参考文献<Steele and Sussman 1975>) と呼ばれ,1975年に Guy Lewis Steel Jr.Gerald Jay Sussman によって MIT 人口知能研究所にて発明され, 後に MIT での教育用途に再度実装しなおされた.Scheme は 1990 年に IEEE にて標準化された(文献<IEEE 1990>).Common Lisp (文献<Steele 1982>, 文献<Steele 1990>)は,工業規格を作るためこれらの初期の Lisp 系を結合して開発されたものである.Common Lisp は 1994 年に ANSI 規格となった(文献<ANSI 1994>).
  3. そのような特別な応用の一つは計算能力の大進歩により科学的に重要な発見をもたらした――例えば太陽系の動きの積分計算で、以前の結果よりほとんど二桁のオーダーで拡張された. その計算結果は,太陽系の動力学的振る舞いはカオスであることを示した.この計算は,新しい積分アルゴリズム,特殊用途のコンパイラ, そしてLisp で記述されたソフトウェアツールの支援により実装された特殊用途の計算機によってはじめて可能となった.(文献<Abelson その他 1992>, <Sussman and Wisdom 1992>)