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

1  手続きによる抽象の構築



単純な考えを超えて力を引き出す心の働きは, 主に次の三つである. 1. いくつかの単純な考えを合成して一つにする. すべての複雑なものはこうして出来る. 2. 第二は単純であれ複雑であれ, 二つの考えを持ちより, 一つに統合するのでなく, それらが同時に見えるようにもう一つのものでそれらを繋ぐ. それで関係という考えが得られる. 3. 第三はその実在において, それらに付随している他の考えからそれらを分離する. これを抽象といい, 一般のアイディアはこうして出来ている.

John Locke, 人間の理解に関するエッセイ(1690)

計算プロセス(computational process)を勉強していこうと思う. 計算プロセスは計算機の中に住む抽象的な存在である. プロセスは進行しながらもう一つの抽象的な存在, データ(data) を操作する. プロセスの進行は規則のパターン, プログラム(program)の指示に従う. われわれはプロセスに指示しようとしてプログラムを作る. いわばわれわれの呪文で計算機の霊に魔法をかけるのだ.

   実際計算プロセスは魔法使いのいう魂とよく似ている. 見ることも触ることも出来ない. 物質で出来ているのでもない. しかし実在し, 知的作業を遂行し, 質問に答え, 銀行でお金を支払ったり, 工場でロボットの腕を制御したりして, 実世界に影響を与えることが出来る. プロセスに魔法をかけるのに使うプログラムはまさに魔法使いの呪文である. われわれがプロセスに実行させたい仕事を示すため, プログラムは神秘で深遠な プログラム言語(programming language)の記号式で注意深く構成してある.

   計算プロセスは, 正しく動く計算機の中では, プログラムを精細かつ正確に実行する. それでプログラムの初心者は魔法使いの弟子よろしく, 魔術の結果を理解し, 予測する技法を学ばなければならない. プログラムのわずかなエラー ((bugs)とか スリップ (glitches)という)でも複雑で予測を越えた結果を惹き起す.

   ありがたいことに我々が扱おうする魂は安全に閉じ込められているので, プログラムの学習は魔術の学習より遥かに危険度が低い. だが, 実世界を相手とするプログラムには用心, 熟練, 知識を必要とする. 例えば計算機支援設計プログラムの些細な虫でも, 航空機やダムの大崩壊や工業ロボットの自己破滅を惹き起し得る.

   ソフトウェア技術の名人といわれる人達は, プロセスが期待通りの仕事を実行することが相当確かであるように, プログラムを組み上げる能力を持っている. そういう人達はシステムの振舞いを前もって見ることが出来る. 予測外の事態が壊滅的な結果にならないよう, プログラムを構成する術を心得, 事態が生じた時, プログラムの 虫とり(debug)が出来る. 巧みに設計された計算システムは, 巧みに設計した自動車や原子炉と同様, モジュラに作られていて, 部品ごとに作り, 交換し, 個々に虫とりが可能である.

Lispによるプログラム

プロセスを記述する手頃な言語がいるが, それにプログラム言語Lispを使おう. 日常の思考を(英語, フランス語, 日本語のような)自然言語で表し, 定量的現象の記述を数学的記法で表すように, 手続き的思考をLispで表す. Lispは1950年代の終りころ, 計算のモデルである 再帰方程式(recursion equations)という, ある種の論理表現についての推論の形式化として発明された. この言語は John McCarthyが考えだし, 彼の論文「Recursive Functions of Symbolic Expressions and Their Computation by Machine」(McCarthy 1960)に基づいている.

   初めの数学的形式化にも拘らず, Lispは実用的プログラム言語である. Lispの 解釈系(interpreter)はLisp言語で記述したプロセスを実行する機械である. 最初のLisp解釈系は, MIT電子工学研究所の人工知能グループとMIT計算センターの同僚や学生の助けを借り, McCarthyが実装した.1 Lispという名前は LISt Processingのアクロニムだが, 代数式の記号微分や積分のようなプログラム上の問題を解くための記号処理能力を提供すべく設計された. その目的のため, アトムやリストという新しいデータオブジェクトを持っていたが, それらはLispを当時の他のプログラム言語と著しく区別するものであった.

   Lispは共同開発の成果ではない. Lispは利用者の要求と実装上の考察に応じて試作的に, 非公式的に進化したものである. Lispの非公式的進化は長年継続し, Lisp利用者の社会は, 言語の「公式」定義を広めようとする動きに伝統的に抵抗してきた. この進化は, 初期のコンセプトの柔軟さと優雅さにより, 今日広く使われている言語の中で, 二番目に古い (Fortranだけがもっと古い)Lispに, プログラム設計の最新のアイディアの取込みを相変らず可能とさせてきた. それ故Lispは今では方言の一族であり, それらは初期の特徴を共有しながらも, 互いにかなり異っている. 本書で用いる Lispの方言はSchemeという.2

   その試作的性格と記号処理重視のため, 初期のLispは, 少くともFortranとの比較において, 数値計算は極めて非効率であった. しかし数年経つうちにプログラムを機械コードに翻訳するLisp翻訳系が開発されたので, 数値計算もかなり効率よく実行出来るようになった. また特定の応用にはLispは格段に有効に用いられてきた.3 Lispは昔の絶望的に非効率という評判を克服出来ずにいるが, Lispは今では効率が主たる関心事ではない多くの応用で使われている. 例えば操作系のシェル言語として, またエディタや計算機支援設計システムの拡張言語としてLispは好んで使われる.

   Lispが主流の言語でないなら, なぜわれわれはそれをプログラムの議論の土台として使うのだろうか. それはLispが, 主要なプログラムの構成やデータの構造を学び, それを言語の基礎となる言語学的機能に関係づけるのに優れた媒体とする独特の特徴を持っているからである. 特徴のもっとも著しいのはプロセスの 手続き(procedures)というLispによる記述自体がLispデータとして表現, 処理出来ることである. 「受動的」なデータと「能動的」なプロセスを区別する伝統をぼやかす点に依存した強力なプログラム設計技法が使えるからだ. やがて分るように, 手続きをデータとして扱うLispの柔軟さはこの技法を探求するための, 実在する言語で一番便利なものとしている. 手続きをデータとして表す能力はまたLispをして他のプログラムをデータとして扱うようなプログラム, 例えば計算機言語を支援する解釈系や翻訳系のようなプログラムを書かせるための優れた言語としている. その上何にもましてLispでプログラムを書くのは大いに楽しいことでもあるのだ.


1 Lisp 1 Programmer's Manualは1960年に, Lisp 1.5 Programmer's Manual (McCarthy 1965)は1962年に発行された. Lispの初期の歴史はMcCarthy 1978に書いてある.

2 1970年代の主要なLispプログラムの多くが書かれた二つの方言はMITの プロジェクトMACで開発した MacLisp (Moon 1978; Pitman 1983)と, Bolt Beranek and Newman Inc.と Xerox Palo Alto研究所で開発した Interlisp (Teitelman 1974)である. Portable Standard Lisp (Hearn 1969; Griss 1981)は, 異る機械への移植を容易にすべく設計されたLisp方言である. MacLispは, カリフォルニア大学バークレイ校で開発した Franz Lispや, MIT人工知能研究所でLispを効率よく走らせるべく設計した特殊目的の計算機に依存する Zetalisp (Moon 1981)のような多くの子方言を生んだ. 本書で使う Scheme (Steele 1975)という名のLisp方言は, 1975年にMIT人工知能研究所の Guy Lewis Steele Jr.と Gerald Jay Sussmanが工夫し, その後MITの教育用に再実装された. Schemeは1990年にIEEEの標準になった(IEEE 1990). Common Lisp方言(Steele 1982, Steele 1990)は, 初期のLisp方言の諸機能を統合し, Lispの工業標準を作るべくLisp利用者社会が開発した. Common Lisp は1994年にANSIの標準になった(ANSI 1994).

3 そういう特定の応用の一つは科学的重要性を持った革新的計算であって, 太陽系の運動に関する積分の精度を, 以前のものより二桁近く拡大し, 太陽系の力学は混沌としていることを示した. この計算が可能になったのは, 新しい積分法, 特殊目的の翻訳系, 特殊目的の計算機があったからで, すべてはLispで書いたソフトウエアツールを使って実装された (Abelson他1992; SussmanとWisdom 1992).

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