tech
ハッカーの遺言状──竹内郁雄の徒然苔
第46回:プログラミングのパラダイム
元祖ハッカー、竹内郁雄先生による書き下ろし連載の第46回。今回のお題は「プログラミングのパラダイム」。
ハッカーは、今際の際(いまわのきわ)に何を思うのか──。ハッカーが、ハッカー人生を振り返って思うことは、これからハッカーに少しでも近づこうとする人にとって、貴重な「道しるべ」になるはずです(これまでの連載一覧)。
文:竹内 郁雄
カバー写真: Goto Aki
私は研究所で仕事をしていたのに、学位(博士号)を取ることに興味がなかった。プログラミングが好きな人にありがちなのだが、システムを作るほうに興味があったのだ。当初から上司に早く学位を取るように言われていたのだが、依怙地にそれに反発していた。どうも学位を取ってしまうと、管理部門的な仕事に回されてしまう事例が多かったこともその一因だった。学位を取ると「上がり」になるような雰囲気だったのだ。
生涯一保守のような研究所生活だったが、好きなことを好きなようにやれていたので私は満足だった。しかし、50歳に近付くにつれ、次の仕事に移らなければならない状況になってきた。学界での知合いがたくさんいたので、大学に移るのが最も妥当な選択肢だったが、あら、学位がない。これでは大学に移れない。
しょうがないので、(当時はまだ可能性が高かった)論文博士号を取るために、49歳になってから学位論文を書き始めた。まさに泥縄である。しかし、書き始めたら、逆に面白くなって、自分のしてきたシステム作りで考えたこと(過去形)、考えてきたこと(現在完了進行形)などよしなしごとを、まさに徒然なるままに書き綴ったら、なんと400ページを超す分厚い論文になってしまった。分厚すぎて、面倒を見ていただいた武市正人先生にはずいぶんご迷惑をかけてしまった。
学位論文のタイトルは「パラダイム融合言語の研究」である。1970年代末からずーっと開発してきたTAOというプログラミング言語の設計思想に関するものである。TAOにはなんと3世代あり、第1世代は習作なのでさておき、第2世代TAOをDAOと呼ぶことにしたが、このDAOからTAOへの「進化」の思考過程を、いわば比較言語学的に記述した。と言えば恰好いいが、要するに気取った「開発日誌」である。
今回は、この論文のタイトルに出てくる「パラダイム」のお話である。
これまで、夥しい数のプログラミング言語が、特定の応用に特化して設計・実装されてきた(いわゆるDSL)。 また1990年代、商業的に大きな成功を収めたコンピュータゲームのプログラミングでは、ゲームごとにプログラム作成用のツールキットを作り直すことが、市場での目新しさにつながる成功のカギだと聞いたことがある。子どもは同じツールキットで作られたゲームを直感で見抜く感受性を持っているのだ。しかし、この方向を押し進めることは、プログラミング技術全体を見る大局的な観点では、むしろ技術的な退歩につながる。応用や要求に対応してその都度、プログラミング言語やツールを一から作り直すことは、トータルではかえって効率を落とすことになるからである。
ところで、プログラミングの効率とは何だろう? 効率の定義は多様かつ多軸だ。プログラムが早く作れること、プログラムが読みやすいこと、プログラムの保守性が良いこと、プログラムの汎用性が高いこと、プログラムの実行効率が良いこと、プログラムの信頼性が高いことなど、さまざまな評価基準があり、同一次元に乗りにくい。
プログラムを書く作業という意味に限定したプログラミングではなく、プログラムを書くことと、そのプログラムがコンピュータで実際に動作して何らかの効用を生むところまでを含めた、広い意味でのプログラミングの効率を考える必要がある。だから、プログラミングより、「コンピューティング」という言葉を使うほうが適切かもしれない。
コンピューティングの効率は、大別するとコンピューティングを行おうとする人間の効率と、機械(コンピュータ)の効率、つまり、
● 思考の効率と作業の効率──プログラミングを行うときに、プログラマにかかる知的な負担(認知負荷)と肉体的な負担の小ささ、つまり、人的資源の経済性
● 計算の時間効率とハードウェア資源の効率──プログラムを実行するコンピュータの負荷の小ささ、つまりコンピュータ資源の経済性
が複合したものだ。ここで、プログラマの肉体的負担とは、(知的でない)退屈な反復作業が強いられるような負担を指す──例えば、プログラミング環境が悪いと、このような肉体的負担がかかる。
人間の効率と機械の効率を両立させることは容易ではない。しかし、これまで両者を歩み寄らせる方法論がいくつも提唱されており、それらが着実にプログラミング技術の進歩を支えてきた。逆に人間の効率と機械の効率を真に両立させることの難しさも明らかになってきた。実際、コンピューティングの効率を上げるための絶対的方法論が存在するのかという疑問にはまだ確固たる答えがあるという気がしない。
これと類似した事情を科学哲学において打ち出したのが、トマス・クーンの「科学革命の構造」(中山茂訳、みすず書房、1972年)である。
クーンの主張は、従来の累積的で定方向的な科学史観を打ち破る衝撃的なものだった。クーンは、それまで狭い意味でしか使われていなかった「パラダイム(paradigm、ギリシャ語の「規範」が原義)」という言葉を再生させ、新しい意味を与えた。クーンはパラダイムという言葉を、それまでの科学史が扱ってきたような、理論、原理、ルールといった既成の概念の枠をはみだしたものを表現するために選んだ。「科学革命の構造」の本文で最初に出てくるパラダイムの定義(らしきもの──全編を通じてパラダイムの厳密な定義は出てこない)は
「ある科学的業績が、(1) ほかの対立する科学研究活動を棄てて、それを支持しようする熱心なグループを集めるほど前例のないユニークさを持ち、(2) その業績を中心として再構成された研究グループに解決すべき問題を提示しているとき、それをパラダイムと呼ぶ」
である。
しかし、クーンはパラダイムという言葉をやや不注意に多義的に使っており、それが多くの批判と論争を呼んだ。実際、「科学革命の構造」の中で、パラダイムは上に述べたような「特定の科学的業績」から「ある学派に特徴的なもろもろの信念とその先入観の集合」に至る22通りの使い方がなされているという研究があった。こんな研究があること自体、この本の影響力のすごさが窺える。
後年、クーン自身はこのような混乱を避けるため、パラダイムという言葉ではなく、「専門母型」(disciplinary matrix、※1)という、より明確に規定された言葉を提唱している。専門母型は、(1) 記号的一般化(科学者集団の中で疑問の余地なく通用する記号的表現のこと)、(2) モデル(集団の中で共通的に好まれるアナロジー──例えば、電気回路を定常流体力学系とみなすこと)、(3) 見本例(具体的な問題の解き方で、その分野に入る人はこういった共通の演習問題を解くことで、共通の言語、共通のパラダイムを持つようになる)の3つからなるとされる。
このうち、クーンのオリジナルのパラダイムは最後の「見本例」に近い。事実、paradigmの本来の語義は、規範、つまり見本例である。このような細かい定義の問題はあるにせよ、クーンのいうパラダイムは「自然に対する問い方と答え方の手本を科学者に与える思考の枠組み」と捉えてよい。
パラダイム論が衝撃的だったのは、物理学や化学のような、自然科学の中で最も絶対的真理に近いと思われていた学問に、科学者集団に特有のパラダイムという、いわば人間的なフィルターを通して自然を見ているところが、少なくとも科学史上あったということを明らかにしたことである。クーンの意図せざるところであったらしいが、これは科学哲学において、真理は(パラダイムごとに)相対的であるという相対主義を補強した。もっとも、人文科学や社会科学では対立する流派の存在が当たり前なので、これは自明に近いことである。
後年、クーンは科学者集団とパラダイムという、ニワトリとタマゴの関係にあるものを、パラダイムの側からではなく、科学集集団の構造とその成り立ちのダイナミズムを社会科学的に観察・分析する態度になったが、これは「理論、原理、ルール」といった概念では測れない科学進歩の原動力としてのパラダイム概念を一層明解に示すことになった。
これ以来、パラダイムシフトという言葉に代表されるように、パラダイムはどの分野でも使われる流行語となった。それを苦々しく思った人もいるに違いない。
プログラミングの世界で、パラダイムという言葉を公に使って有名にしたのはロバート・フロイドである。フロイドは1978年のチューリング賞受賞記念講演「プログラミングのパラダイム」(The Paradigms of Programming)の中で、プログラミングの方法論、プログラム書法、プログラミングの教育法、プログラミング言語の設計論におけるパラダイムの役割について論じた。
フロイドのいうプログラミングのパラダイムは、補食・被補食系などの個体群力学に出てくる
W, R = f(W, R), g(W, R)
という並列代入のような低レベルのプログラム書法(※2)から、ソーティングのアルゴリズムのような典型的規範、さらには構造化プログラミングやプログラミング言語の階層的構成といった抽象度の高いプログラミング方法論まで、およそプログラミングにかかわるすべての手本、スタイル、規範、方法論、思想を包括している。
フロイドは、過去数世紀の(ニュートン力学から、アインシュタインの力学へといった)科学革命は支配的なパラダイムの不連続的変遷から生じたというクーンのパラダイム論を引用し、プログラミングの分野にもそれが当てはまると述べている。そして、科学者集団が複数存在することを引用して、コンピュータ科学にもお互いに独自の主張を持つ「科学者集団」があると述べた。具体的には(1970年代当時の視点で)Lispプログラミング、APLプログラミング、Algolプログラミングというはっきりした、お互いに対立するプログラミング流派の存在を挙げ、データフローとコントロールフロー、再帰と繰り返し、データ構造の共有とコピー、名前呼び(call by name)と値呼び(call by value)といった二元的に対立するパラダイム群を例示している。
フロイドはこのように述べつつ、プログラミング技術をもっと高めるためには、パラダイムのレパートリをもっと豊かにするべきだと主張した。これは、プログラミング技術がまだ、クーンのいう前パラダイム期にあるということと考えることもできるし、そもそもコンピューティングの絶対的効率化が困難であるという意識の表明であるともいえる。これは、クーンが科学史においてパラダイムという概念に特別の意味をこめた発想とは微妙に異なる。例えば、クーンの科学哲学におけるパラダイムでは、真理と考えられるものを記述できるかどうかというAll or Nothingが問題になるが、プログラミングのパラダイムでは、コンピューティングの効率が上がるかどうかが問題になる。もっとも、クーンも最終的には真理の記述の効率のようなものを考えていたようだ。
フロイドが指摘したように、プログラミング言語やツールのような比較的高いレベルのパラダイムに対応して、クーンのいう科学者集団に相当するプログラミング・コミュニティなるものが存在する。コンピュータの短い歴史を見るかぎり、プログラミング・コミュニティの生成・成長・減衰・消滅・変遷は科学史における科学者集団のダイナミズムに似ている。しかし、時代を巻き込んだ大きな潮流の変化につながった例はなかったと思う。あるプログラミング言語で原理的にできなかったことが、別のプログラミング言語で急にできるようになったという劇的な革新が、プログラミング言語の進化では起こらなかったからである。
このように、決定的差異がないにもかかわらず、複数のプログラミング・コミュニティが並存するところが、プログラミングのパラダイムの大きな特徴である。それは冒頭で述べたように、プログラミングの応用が多岐にわたっていることと、人間の効率とコンピュータの効率がすべての応用において最大化できないゆえに、パラダイムのあいだの比較が一次元的にならないからである。
例えば、言語やツールが設定された状況でプログラミングを行う際のプログラマの認知負荷は、そのプログラマがどのプログラミング言語に習熟しているか、どのようなプログラミングスタイルでこれまでプログラムを書いてきたかに大きく依存することが示されている(ワインバーグの「プログラミングの心理学」、木村泉、角田博保、久野靖、白濱律雄訳、技術評論社、1994年)。つまり、そのプログラマの持っているパラダイムでうまく対処できる問題もあれば、(最終的にはできるにしても)困難を伴うような問題もあるということである。別のプログラミング・コミュニティのプログラマだと、得意・不得意問題が逆になるケースもあり得る。
また、応用分野に適合しない言語やツールを選択してしまった場合、たとえ、その言語やツールにいかに習熟したプログラミング・コミュニティをもってしても、生産性が上がらず、またプログラムの性能も出ないことがあり得る。逆に、一般的な意味で古い非効率的なパラダイムと考えられるものでも、それを支えるプログラミング・コミュニティが特定の応用分野そのものに習熟しているために、少なくともその時点で、ほかを圧倒する生産性を発揮する場合がある。これらはコンピューティングの効率を考えることの難しさを示している。
クーンは、物理学や化学、さらに細分化されたX線回折学などの学問分野の成立そのものが、専門家集団の成立とパラダイムの確立という科学革命の結果であると論じている。これと同様なことが、例えば、構造化プログラミング、抽象データ型プログラミング、オブジェクト指向プログラミング、論理型プログラミング、関数型プログラミングなど、さらに抽象度の高いプログラミングのパラダイムの成立において起こった。これらは、プログラミングの現場のコミュニティのみならず、コンピュータ科学の研究者のコミュニティをも形成した。このように集団の成員の社会的性格(現場と研究者)が多種性を持つのも、プログラミングのパラダイムを考察するときに問題を複雑にする。
昔取った杵柄の学位論文の序文の一部をベースに、何だかややこしいことを書き綴ってきたが、要するに、科学哲学という七面倒くさいところで論争になったようなことが、プログラミングの世界にも適用できるということだ。だから、プログラミングの義務教育化が、昔の「職業・家庭」科目のような扱いになっているのはボタンのかけ違いだろうという気分になっていただければ、と思う。
もっとも、ハッカーたるもの、プログラミングのパラダイムではなく、プログラミングのパラダイスを目指すべきなのかな?(つづく)
※1:専門図式という訳語もある。
※2:これを通常のプログラミング言語で書こうとしたら、一時的な変数tempを使って
temp = f(W, R) ;
R = g(W, R) ;
W = temp
と「汚く」書かないといけない。まさに人間にとって非効率である。Common Lispでは、これを
(psetq W (f W R) R (g W R))
というふうに書ける。簡単なことなのだが、この代入機能が備わっている言語は少ない。
竹内先生への質問や相談を広く受け付けますので、編集部、または担当編集の風穴まで、お気軽にお寄せください。(編集部)
変更履歴:
2017年09月03日:「また1990年代、商業的に大きな成功を収めたンピュータゲームのプログラミングでは、」という文章が誤って挿入されていたので、削除しました。失礼致しました。ご指摘いただきありがとうございました。
2017年09月03日:「しょうがいないので、」を「しょうがないので、」に修正しました。失礼いたしました。
SNSシェア