プログラミング進化論(3)(2009)
3 構造化プログラミングと構造主義
FORTRANやCOBOL以降、多種多様のプログラム言語が誕生する。電算界におけるヨーロッパの威信回復という反米イデオロギー色の濃いALGOL。OSの必要性からそれを記述するプログラム言語として生まれたBが発展し、UNIXの普及と共に、その小回りのよさから受容されたC。初期のパソコンの際に入門としてユーザー層を拡大したインタープリタ言語BASIC。その見通しのいい文法によりプログラミング教育に用いられたPascal。児童向けの教育プログラムとして知られるLOGO。モジュール式プログラミングを強調したいささかアナーキーなModula-2。超ド級の巨大なプログラム執筆に適したC++やJava。 FORTRAN・COBOL・ALGOLの重要な特色を統合するという野心的なPL/1。リスト形式のデータを扱うのに用い、人工知能向けの標準的言語のLISP。関係データベースとくればこれと確固たる地位を誇るSOL。交通や軍の管理制御システムで重宝されているAda。その理想の高さに熱狂的な信奉者に支持されるSmalltalk。日本発のオブジェクト指向言語と脚光を浴びたRuby。インターネットの普及と共に最も身近なプログラム言語と認知されるHTML。ブラウザ上で動作するスクリプト言語の代表格JavaScript。列挙すればきりがない。
これだけプログラム言語が出現すれば、分類・整理する動きが生ずるのも当然であろう。すでに言及した高級言語と低級言語の区分もその一つである。市販ソフトウェアは、一般的に、コンパイラ済みの機械語の形式で配付される。実行速度が速いし、多数の異なった種類のファイルの管理も可能で、なおかつ解読されにくいというのが主な理由である。なお、機械語のファイルを解読してアセンブリ語に変換する逆アセンブラのソフトウェアもあるが、商業ソフトでは厳しく禁止されている。
他にも、高級言語を翻訳する手順によるコンパイラ型とインタープリタ型という分類もよく知られている、前者はコンパイラによってプログラム全体を一気に機械語に翻訳するプログラムである。FORTRANやCがその代表である。後者はインタープリタがプログラムを一行ずつ読みこんで逐語的に訳すプログラムである。この特性によってかつてユーザーを爆発的に獲得したのがBASICである。今ではPythonも好まれるけれども、四半世紀前にはパソコンを手にしたら、最初に覚えるプログラム言語というのが半ば常識である。コンパイラ型と比べて、インタープリタ型は実行速度の点で、どうしても遅くならざるをえない。しかし、バグを見つけやすいという利点がある。
ただ、この区別は、プログラミングで見るコンピュータという観点からは、本質的ではない。パソコンの処理速度の飛躍的な向上もあり、両者の差異は一般ユーザーにとっては必ずしも決定的ではない。また、Perlのように、コンパイラとインタープリタの区分が曖昧な言語もいくつか出現している。付け加えると、言語と言語処理系の処理方式は別物と考えるべきである。Cにもインタープリタ型が存在するし、Javaでも機械語に直接コンパイルする方式もある。
むしろ、「プログラミング」という点から分類する方がプログラム言語の本質を踏まえている。コンピュータの性能が向上するにつれ、要求される範囲が広がり、求められるレベルも高くなる。それに呼応して、プログラムの規模も大きくならざるをえなくなる。巨大化に伴い、プログラミングにも、チーム・ワークが導入され始める。個人で作成できる時代ではない。かつてはどこの職場や研究所、大学にも書いたプログラムが動かない場合は、エラー箇所を見つける達人が一人はいたものである。しかし、そんな牧歌的な時代は過ぎ去っている。アセンブリ語が生まれ、さらに高級言語が登場したのは、プログラムの書きやすさや見直しの便利さを追求してきたからである。
巨大化した際に、最も問題となったのがgotoである。エイダ・ラブレスの洞察以来、gotoはプログラム作成者にとって非常にありがたいコマンドである。それを使えば、ドラえもんの「どこでもドア」のごとく、プログラムのどこにでも飛ぶことができる。しかし、それは「スパゲッティ・プログラム」という弊害も生み出すことになる。多用されたgoroが複雑に絡み合ってしまい、プログラムが解読不能に陥る
。
1967年、オランダのコンピュータ科学者エドガー・ダイクストラが『構造化プログラミング(Structured Programming)』を発表する。構造化プログラミングは、見通しを浴するために、gotoを使わず、サブルーチンの呼び出し、およびifとwhileによる制御だけでプログラムを書くという発想である。要約すると、「gotoレス」・「モジュール化」・「トップダウン設計」が基本原理となる。翌年のパリ5月革命を皮切りに、ジャン=ポール・サルトルの実存主義に代わり、クロード・レヴィ=ストロースの構造主義の天下が訪れる。コンピュータ界にも構造主義の時代が到来したというわけだ。
構造主義は20世紀を代表する思想潮流であるが、数学の世界が最も早く、1930年代半ばから始まっている。ブランスの急進的数学者たちは「ニコラ・ブルバキ」という集団的匿名を用いて次々と新たな数学の方法論を発表している。
ブルバキの数学再編成の方法は、「構造」という用語に代表される。それ以前の公理主義から潜在的にあったことではあるが、数学を公理主義的に建設することによって、その具体的内容ではなしに、理論の構成内容、基本的法則とその結合のされ方が完成される。それは、その理論の対象とするものの法則性そのものを、直接に定式化している。そこでは、今までは、ことなる理論の間のアナロジーとして、ややプラグマティックに考えられていたものが、そんなアヤフヤなものではなく、確定した共通理念として定式化され、こうして、分野の専門性の持っていた壁がとりはらわれるのである。
それは、数学的対象(集合)に基本法則(公理)を設定することによって定式化される。理念として、「構造」とは、この「対象」における「法則」の存在様式と考えられる。それは、ブルバキは、集合の要素、または部分(部分集合)、部分集合の族(部分集合の集合)などの結合形式の形で、形式的で集合論的な定式化を行う。こうして、その構造以外の夾雑物を捨象して、議論を展開することが可能になるのである。
(森毅『数学的思考』)
構造化プログラミングはダイクストラの前段階があるけれども、問題の同時代的な共有意識がコンピュータ研究者の間にあり、1970年代に入り、IBMによるソフトウェア開発の技術師範「IPT(Improving Programming Technologies)」を通じて普及する。ALGOLやPascal、Cなど構造化プログラミングに基づいた言語が開発され、さらに、FORTRANやBASICのような構造化プログラムに適していない言語もそれを踏まえたFortranとBasicに生まれ変わる。
構造化プログラミングにおいて、プログラマたちは処理手順と記述を一致させ、gotoをできる限り、可能であれば一切使わない。プログラムは、それにより、「連接(sequence)」・「反復(iteration)」・「選択(selection)」の三つの要素によって折り目正しく構成される。プログラミングにはスケール・メリットはない。そこで、規模の大きいプログラムは、管理しやすい適度なサイズに分割統治、すなわち「モジュール化(module)」し、それらを連接・反復・選択などに注目して抽象化する。端的に言うと、それ以外の情報は捨てる。プログラマは断片化されたプログラムを段階的に詳細化させる。細部の情報を具体的に記述し、段階を追って詳細なものに仕上げていく。このようにして出来上がったプログラムには、その中にアルゴリズムと同時にデータ構造も記述されている。
巨大なプログラムを多人数で書くにはどうしたら合理的かという問いは、しかし、これで解決したわけではない。構造化プログラミングも、80年代が近づくにつれ、スタジアム・ロックよろしく、大規模化し続けるプログラムには対応しきれなくなる。
これはちょうど構造主義の思想的な流行が一段落つき、ポスト構造主義が台頭してくる時期に当たる。何でもありのお祭騒ぎの80年代には構造主義は静かすぎる。構造主義は、日常生活のような繰り返しの多い中で、小さな変化が決定的である場合を考察するのに向いている。文化人類学や発達心理学、言語学、歴史学、文学などの対象を構造化する際に、非常に成果を挙げたのもそのためである。頻繁なもしくは大きな変化になると、構造主義的手法は適用するのが難しい。小津安二郎の映画の分析には構造主義は適しているが、黒澤明には不向きである。
巷に構造主義の入門書が溢れている。しかし、それら以上に構造化プログラミングのアイデアがコンパクトにその要点をまとめている。その点でも、構造化プログラミングが過去のものとして顧みられないのはもったいない現状である。
「中心と周縁」や「トリック・スター」など数々の魅惑的概念により構造主義は非常に見通しのよい図式を提供してくれる。短絡的な見立ては、構造主義によって、容易に批判することができる。ジョージ・W・ブッシュ大統領の「テロとの戦い(War on Terror)」はその典型だろう。アメリカ=中心、テロリスト=周縁というわけだ。その単純な図式は、8年間に渡って世界を翻弄し、退任直前、デヴィッド・ミリバンド外相から2009年1月15日付『ガーディアン』紙に「『テロとの戦い』は誤り」と寄稿されることになる。それによると、ブッシュ政権が掲げてきた「テロとの戦い」は、テロの脅威を強調するのに効果的であったことは否定しないけれども、異なる背景や目的を持った勢力を結びつけることを促進させ、イスラム教徒の集結を狙うアルカイダにつけこまれる結果になってしまっている。また、ハード・パワーへの極端な偏重は、テロを力で抑えこむべきだという誤った考えも世界に広めている。テロの封じこめるためには、暴力や弾圧に頼ることなく、法秩序を重んじ、それぞれ個別に問題を解決していかなければならない。テロも個別のオブジェクトとして捉え直す必要がある。