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

序文



教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. 大規模な問題への攻撃はプログラムを次々と利用するが, その殆んどは途中で現れる. プログラムには手元の問題に特有と思われる議論が多い. プログラミングをそれ自身で知的活動と評価するには計算機プログラミングに向わなければならない. 計算機プログラム---その多くを読み, 書きしなければならない. そのプログラムが何に関するものか, どの応用のためかということには関係しない. 関係するのはいかにうまく動作するか, 更に大きいプログラムを作るために他のプログラムといかにうまく適合するかということである. プログラマは部品の完成度と集積の妥当性の両方を求めなければならない. 本書では「プログラム」の利用は, 電子計算機の実行に使うLispの一方言で書いたプログラムの創作, 実行と研究を対象とする. Lispの使用はわれわれが何をプログラムするかではなく, プログラム記述の記法だけに限定し制限する.

   本書の主題との関係でわれわれは三つの現象: ひとの心, 計算機プログラムの集積と計算機に関る. 計算機プログラムは心に生れた物理的, 心理的プロセスのモデルである. ひとの経験と思考から生じたこれらのプロセスは数において巨大であり, 細部において複雑であり, 一時には部分的にしか理解されない. それらは計算機プログラムによって永遠に満足出来るようにモデル化されることは殆んどない. 従ってプログラムが注意深く細工した離散的な記号の集積, 相互作用する関数の組合せであっても, 絶えず進化する. われわれはモデルの認知が深まり, 広まり, 一般化するにつれ, まだ苦闘中の他のモデルの間で, モデルが究極的に準安定な場所を得るまで変化を続ける. 計算機プログラミング対応した陽気な気分の源泉は, プログラムとして表現した機構の心の中と計算機の上での絶えまなき解明と, それらが生成する認知の拡大である. 技術が夢を解釈するなら, 計算機はプログラムを装って夢を実行するであろう.

   その力において計算機は苛酷な仕事師である. そのプログラムは正確でなければならず, 言わんと欲することを細部に至るまで正確に言わなければならない. 他の記号的活動と同様に, 議論を通じてプログラムの正当性を確信する. Lisp自身は意味論(もう一つのモデル)を与えられ, プログラムの機能が, 例えば述語論理で明記されていれば, 合意可能な正当性の議論をするのに論理の証明技法を使うことが出来る. 困ったことにプログラムが殆んどの場合そうであるように, 巨大になり,複雑になると, 仕様自身の適切さ, 一貫性や正当性は疑わしくなるので, 正当性に関する完全で形式的な議論が巨大なプログラムに寄り添うことはあまりない. 巨大プログラムも小さいものから成長するので, その正当性の構造が確信出来るような標準のプログラムの貯蔵庫---それを成句という---を開発し, 証明された価を組織化する技法を使い, それらをより大きな構造に組み合せることを学ぶのが重要である. これらの技法は本書で十分に扱われ, それらの理解はプログラミングというPrometheusの事業に関るのに必須である. 何よりも強力な組織化技法の発見と熟練が巨大で重要なプログラムを創造する能力を加速する. 反対に巨大なプログラムを書くのは負担なので, 関数の重みを減らす新しい方法の発明に迫られる.

   プログラムと違い, 計算機は物理法則に従う. 急速に---状態の変化に数ナノ秒と---実行したければ, 電子を短距離(1½フィート程度)に運ばなければならない. 膨大な数の部品が発生し, 空間に集中する熱はどけなければならない. 精巧な工学技法は機能の多重と装置の密度の間のバランスを生み出した. どういう場合でもハードウェアはわれわればプログラムを考えるレベルより基底のところで動作する. Lispプログラムを「機械語」プログラムに変換するプロセスはそれ自身プログラムされる抽象モデルである. それらを研究し創作することは, 任意のモデルをプログラム化する組織化プログラムへの大きな見通しを与える. もちろん計算機自身もモデル化することが出来る. こう考えてみる: 最小の物理敵スイッチ要素を微分方程式で記述した量子力学でモデル化し, その細部の振舞いを捕えるには計算機プログラムで表現した数値近似を使い, その計算の実行は....

   三つの焦点を別個に認識することは, それらがよくいわれるように頭に入っているとしても, 単なる戦術的便宜の問題ではない. 論理的分離はこれらの焦点間での記号のやりとりの加速を惹き起す. 豊富と活力と能力は人間の経験を超え, 最良の場合でも焦点間の関係は準安定である. 計算機は十分大きくも, 十分速くもない. ハードウェア技術のブレークスルーは, 更に巨大なプログラム事業, 新しい組織化原理と豊かな抽象モデルをもたらす. 読者な繰り返し「何のため?何のため?」と問うべきである. ---しかし, ほろ苦い哲学による便秘のためにプログラムの楽しみを放棄するといけないから, あまり頻繁に問うてはならない.

   われわれの書くプログラムの中には, (さほど多くはないが)数の並びのソートや最大値探し, 素数性の決定, 平方根の計算のような厳密な数学関数を実行するのがある. そういうプログラムを算法といい, その最適な振舞い, 特に実行時間とデータの記憶容量という二つの主要なパラメタに関して多くの知見がある. プログラマは優れた算法と成句を獲得すべきである. プログラムによっては精密な記述に抵抗するものもあるが, その性能を見積り, 常に改善に努めるのはプログラマの責任である.

   Lispはほぼ四半世紀の間使われた長命者である. 現役のプログラム言語ではFortranだけが先輩である. 両言語は, Fortranは科学と工学の計算のため, Lispは人工知能のため, 重要な応用分野でプログラミングの要求を支えてきた. これらの領域は重要であり続け, LispとFortranは少なくとも次の四半世紀では活発に使われるよう, そこでのプログラマは二つの言語に専念しよう.

   Lispは変容する. 本文で使うScheme方言は元々のLispから進化したが, Lispとは重要な点で少々違っている. 変数の束縛は静的有効範囲を使っていること, 関数が値として関数を返すことが許されていることなど. 構文構造ではSchemeは初期のLispに似ているようにAlgol 60にも非常に似ている. Algol 60は現役の言語としては二度と使われないであろうが, SchemeとPascalの遺伝子の中に住んでいる. これの二つの言語の周囲の文化よりもっと違った二つの文化の通用通貨である二つの言語を見つけるのは困難であろう. Pascalはピラミッド---重い石を定位置へ運ぶ軍隊が作った堂々とした, 息もつけぬ静的構造---を作るためである. Lispは組織---変動する数万の, より単純な器官を定位置へはめ込む連隊が作った堂々とした, 息もつけぬ動的構造---を作るためである. 使われた組織化の原則は二つの場合で同じである. ただ極めて重要な違いがある: 個々のLispプログラマに任された自由裁量で輸出出来る機能は, Pascalの事業で見出されるそれより桁違いに多い. Lispプログラムライブラリはその効用がそれを生み出した応用を超越するような関数で膨張する. Lispの素朴なデータ構造であるリストはそういう効用の成長に大きな責任を持つ. リストの単純な構造と自然な応用力は驚くほど没個性である. Pascalの過度の宣言的データ構造は,関数の特殊化を惹き起し, 偶発的な協力を不可能または困難にする. 一つのデータ構造に働く100の関数の方が10のデータ構造に働く10の関数よりありがたい. 結果的にはピラミッドは千年もの間立っていなければならず, 組織は進化するか消滅しなければならない.

   この違いを示すため, この本の題材や問題をPascalを使った入門教科書にあるそれらと比べてみよう. この本がMITだけで, 特にそこに住む若者により消化可能な本文だという幻想で働いてはいけない. これはまさにLispをプログラムする真面目な本があるべきもので, 学生が誰だとかどこで使われるかは関係しない.

   これは人工知能の研究の準備に使われる殆んどの本と違ってプログラミングの教科書であることに注意しよう. 要するに, ソフトウェア工学と人工知能におけるプログラミングの重要な関心事が, 検討するシステムが大きくなるにつれ合体する傾向なのである. これが人工知能以外でもLispへの関心が増しつつあることの説明だ.

   その目標から期待されるように, 人工知能の研究は重要なプログラミングの問題を多く生み出した. 他のプログラミングの文化では, 問題の洪水は新しい言語を産卵した. 非常に巨大なプログラミングの仕事では, 有用な組織化原則は仕事の部分間のやりとりの制御し隔離は, 言語の発明による. 言語は人間との対話が非常に多いシステムの境界に近づくに従い, 基本的でなくなる傾向を持つ. その結果, そういうシステムは何度も写された複雑な言語処理機能を含むことになる. Lispは斯く単純な構文と意味論を持つので, 構文解析は初歩的な仕事として扱える. 従って構文解析技法はLispプログラムでは何の役目も果さず, 言語処理系の構築は大きなLispシステムの成長と変化の速度に殆んど障害にならない. 最後にLispプログラマの担う重荷と自由に対する責任は, 構文と意味論のこの非常な単純さにある. 数行を超えるどの大きさのLispプログラムも, 自由裁量の関数で満たされずに書かれることはない. 発明し適合させよう; 興奮し発明し直そう. 自己の考えをかっこの入れ子に囲い込むLispプログラマに乾杯.

Alan J. Perlis
コネティカット, ニューヘブン


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