見出し画像

プログラミング進化論(2)(2009)

2 プログラム言語の誕生
 他国に先駆けて産業革命が進展したイギリスであったが、いかんせん島国であるため、原材料と製品の輸送には海上交通が不可欠である。しかし、経度を知るのに、天測に時計、それと三角計算だけでは、その安全性・確実性を確保することは至難の業である。しかも、グリニッジ天文台発行の航海暦や対数表に不備があることがこの頃には明らかとなっている。これを解決するためには、産業革命の時代にふさわしい機械が必要だ。数値の正確な計算と転記に伴うミスをなくす計算結果の自動印刷が可能な機械を開発しなければならない。

 この使命にとりつかれ、ケンブリッジ大学教授の椅子を捨てて、一生を捧げたのがチャールズ・バベジである。

 彼は、まず、「階差機関(The Differential Engine)」を考案する。三角関数などの複雑な計算を階差の計算に分解し、その単純な加算にして結果を出せばいい。歯車と歯車の回転を組み合わせれば、加算を表現できる。しかし、政府が資金を渋り、機械加工業者とももめたため、1833年、この計画は中止に追い込まれる。

 そこで、バベジは、翌年から階差機関を発展させた「解析機関(The Analytical Engine)」の開発にとり組み始める。第三の歯車を連結させれば、計算の途中結果に従って、別の計算手続きも重ね合わせられる。このアイデアを進めるなら、多くの歯車を円周上に配置すると、計算に計算をさらに重ねあわせることもできるし、途中で関連計算を挿入できる。

 これは、現代の用語で言うと、「サブルーチン」に相当する。バベジの機関は、明らかに、計算器ではなく、コンピュータである。実際、彼の設計にはメモリやレジスターに当たるものが見られる。なお、彼の予測では、このエンジンの処理速度は加減算で1秒、100桁×50桁の乗算なら1分、メモリの容量は10進数で1000個である。。

 バベジはジャカード織機からインスピレーションを受け、演算・変数・定数の三種類のカードを使う構想を立てている。演算カードは孔の位置で加減乗除を指示する。変数カードは演算対象の数値を示し、歯車機構にそれを装填する。定数カードは必要に応じて対数の値など定数を挿入する。この三種類のカードを用いれば、先の目的を効率よく実行できる

 この解析機関の本体は、結局、部分的試作品だけで終わる。しかし、計算手続きに関しては非常に発展している。それを彼にもたらしたのがエイダ・ラブレス夫人である。このジョージ・バイロン卿の娘はif文(判断)やgoto文(飛び越し)などを考案し、アルゴリズムの発想を導入している。父の言葉は人間の心を揺り動かしたが、娘は機械を動かす言語のアイデアを導き出している。「ジャカード織機が花や葉を織り出すように、解析機関は代数を織る(The Analytical Engine weaves algebraic patterns just as the Jacquard loom weaves flowers and leaves)」。そう彼女は言い残している。

 アルゴリズムはプログラムをそれによる計算を通じて変更することを可能にする。これは極めて画期的なアイデアである。理論上はアルゴリズム化できる問題は機械で解けるということになるからである。しかし、以降、さまざまな計算をする機械が考案・開発されてきたが、これを実現するものはなかなか登場しない。1946年に誕生したコンピュータENIACでさえ、記憶したプログラムに対して計算することはできない。何しろ、演算速度が遅いため、計算途中にカードからの読みこみでプログラム変更が十分間にあうからである。

 ENIACでは、ケーブルの配置がプログラムであり、プログラミングは非常に手間暇のかかる作業である。プログラム手順は、数多くの孔が開いた金属板のパッチボードにパッチコードを差しこむようにして表わされている。プログラムを変更するためには、ケーブルを差し替える必要がある。

 しかも、この約1万8000本もの真空管によって構成された電子計算機は10進法、より正確には2進化10進法を用いている。10進数をそのまま電圧や電流で表わそうとすると、0から9に対応する10種類の値を使わなければならない。そのため。電圧や電流がわずか数%変動しただけで、値が違ってしまう。一方、2進法なら、0と1の区別だけですむ以上少々電流や電圧の値がずれたところで、影響は受けない。

 2進化10進数は10進法での1桁を0から9までを表す4桁の2進数、すなわち0000から1111で表わす表現法である。この4桁はそれぞれ2の3乗、2の2乗、2の1乗、2の0乗に当たる。5は2の2乗と2の0乗であるから、0101、8は2の3乗であるので、1000と示される。2進化10進数はデータの入出力には便利であるが、表現に少々無駄が生じる。この表現では0000から1111.までの2の4乗、すなわち16通りの組み合わせのうち、1010から1111の6通りが使われない。純2進数の方が効率がよい。しかも、2進法を採用しても、10進法と比較して、桁が増えることはない。10進数を純2進数で表わした場合、桁数は3.3倍にしかならない。3桁の10進数は10桁の2進数で表現できる。2の10乗は1024.である以上、999.までの10進数は収まる。2進1桁を「ビット」と呼ぶ。64ビットあれば、19桁の10進数を表わせる。

 2進化10進数は、とは言うものの、デジタル世界から完全に追放されたわけではない。誤り訂正符号理論の応用と共に、ある意味で、復活する。この理論は、詳細は省くが、0から15までの数を4桁の2進数で表わすことで可能になる。10進数の15は2進数の1111である。これを使うと、数字当てマジックを披露できるので、興味のある人はチャレンジしてみることを尾お勧めする。現在市販されているCDには、誤り訂正符号理論を応用して、同一の情報が三つ並べて記録されている。この配置により、一部データが失われたとしても、誤りを訂正して元の情報に復元できる。2進化10進数から姿を変えた16進数は、これ以外にも、デジタル技術に数多く応用されている。

 しかも、19世紀、イギリスの数学者ジョージ・ブールは、2進法を使うことで、論理命題のような定量化できない実体に数学的手法を応用できることを明らかにしている。のみならず、コンピュータの計算機構の設計上でも基本的な原理を提供している。これは「ブール代数」と呼ばれ、0と1の二つの元からなり、次のような独特な演算法則を持っている。

 0×0=0 0×1=0 1×0=0 1×1=1
 0+0=0 0+1=0 1+0=1 1+1=0

 これらは2進法の計算であり、最後の式は1+1=10でなければならないが、1の位だけを使うことにする。この×を「交わり(∩)」、すなわち積集合、+が「結び(∪)」、すなわち和集合を意味するとすれば、次の二つの分配が成り立つ。

 A×(B+C)=(A×B)+(A×C)
 A+(B×C)=(A+B)×(A+C)

 前者は通常の計算でも成り立つが、後者はそうではない。一県縁遠いに見えるかもしれないが、コンピュータの一般ユーザーであっても、このブール代数の最も身近な応用例を頻繁に使っている。それは検索エンジンにおけるOR検索やAND検索である。

 プログラムはコマンド、すなわち命令が組み合わされているが、そこでも2進数が非常に有効である。コマンドにはOF文のような分岐命令がある。この分岐命令が一つであれば、確かに、「イエスかノーか」の二つの区別しかない。しかし、分岐命令の使用は区別をネズミ算式に増えていく。分岐命令が10段であれば、その区別は2の10乗、すなわち1024通りである。数は、予想の反して小さくなることもあれば、大きくなることもある。

 プロフラムを備えた2進数のコンピュータという発想は、むしろ、ENIACの後継機として開発されたEDVACの方にある。1946年、ペンシルヴァニア大学において、ジョン・プレスパー・エッカートやジョン・ウィリアム・モークリーなどが着手する。エッカートがデータの出し入れを飛躍的に速くできる水銀遅延線と呼ばれるメモリを考案し、演算速度をさらに高める可能性が生まれる。

 そこで、コンピュータにプログラムを内蔵させ、必要に応じてそれを計算途中でも変更できるようにしたらどうかと試行錯誤し始める。プログラムを構成する命令を2進数で表わし、その組み合わせをコンピュータのメモリに記憶させておいて、実行する。この方式、すなわち「プログラム内蔵方式(Stored Program)」は、そのアイデアを耳にしたジョン・フォン・ノイマンらが1945年から46年にかけてまとめたレポートに初めて登場している。ところが、このEDVACは、諸般の事情により、大幅に完成が遅れてしまう。結局、史上初の稼動したプログラム内蔵方式かつ純2進数のコンピュータの栄誉は、ケンブリッジ大学のモーリス・V・ウィルクスらが開発したEDSACに譲ることになる。

 ただし、当時のコンピュータ開発は軍事機密であるため、不明の点も多い。情報公開が進めば、新事実が明らかになり、歴史が書き換えられる可能性もある。

 しかし、この段階では真空管方式であったため、コンピュータのサイズは巨大、電力消費量も膨大で、世界にとってほとんどスペース・シャトル並みの存在でしかない。ハードディスクやLSIなどまだ夢の世界である。

 世界最初の商用コンピュータUNIVACが1951年の大統領選挙の結果予想に採用される。開票率わずか7%の段階でドワイト・アイゼンハワーの当選を的中させ、これがコンピュータの力を世界に知らしめることになる。ここからコンピュータは小型化・高速化・信頼性・汎用性という四つの目標を達成すべく発展していく。

 1952年、合衆国の数学者グレース・マレー・ホッパーは、UNIVAC I 向けに、世界初のコンパイラ「A-0 System」を開発する。これはコンピュータ上で動作し、コマンドを機械語に返還するソフトウェアである。正しく稼動することが確認されたサブルーチンを集めて、ライブラリを作成しているうちに、この発想にたどり着いている。こうした経緯から、現在ではコンパイラは自然言語に近い文法を持ったプログラム言語を自動的に機械語に翻訳するソフトを指すが、A-0 Systemは、むしろ、機械語の断片を結合させるリンケージエディタの機能を果たしている。

 コンピュータの「中央演算処理装置(Central Processing Unit: CPU)」の行う情報処理は、単純な作業の組み合わせである。その個々の処理に1対1で対応するコマンドが「機械語(Machine Code)」にほかならない。機械語はメモリ上に書き記しておいて実行されるので、基本的に、2進的記号である。最近は16進数も用いられるが、これも2進数の延長である。ハードウェアのためのコードである以上、人間が直接記述することは非常に難しい。特に、最近はプログラムとデータが混在しているので、コードを直接読み書きすることは名人技だ。

 そこで、人間が解読しやすいように、機械語に1対1で対応するアセンブリ語が考案される。アセンブリ語のプログラムは、アセンブラと呼ばれるプログラムによって、機械語に変換される。1950年代のコンピュータのプログラム記述には、このアセンブリ言語がよく用いられている。機械語同様、CPUに依存しているため、ハードウェアが違うと使えない事態も起きる。

 アセンブリ言語では、2進数的記号だけでなく、アルファベットも用いられる。”mov”が”move”の意味であるように、それぞれの命令を想起させるアルファベットの単語を対応させ、アセンブラが数値に変換して機械語に翻訳する。この語呂合わせは「ニーモニック」と呼ばれる。

 今日、機械語やアセンブリ言語は、CPUに依存しないプログラム言語の「高級言語」と区別して、「低級言語」と呼ばれている。これらは一般的には馴染みは浅くないが、その分、一度その魅力の虜になると口では言い表しがたい奥深さと快感もある。単純なコマンドを組み合わせて複雑な作業を実行するプログラムを書く苦役に背筋がぞくぞくさせながら、恍惚の表情を示す姿は、余人には理解しがたいだろう。

 そういったプログラムの快楽以外にも、低級言語は主に二つの理由から今でも習得されている。低級言語の規則を理解していると、高級言語で記述した際にも、効率のよいプログラムに仕上げることができる。また、自社の知的財産権を守るために、機械を管理するハードウェアから製作する企業もあり、そのコンピュータ独自の低級言語でプログラムを書けば、コピーしようとしても割に合わない。

 コンパイラが開発されたということは、CPUに依存せず、汎用性のあるプログラムのための言語が可能になったことを意味する。アセンブラもコンパイラも、基本的には、その元となるプログラムである「ソース・コード」を機械語の「オブジェクト・コード」への翻訳ソフトである。コンパイル以前のコードは「テキスト・ファイル」、機械語プログラムは2進数化されたファイルということで「バイナリ・ファイル」と呼ばれる。

 なお、Javaというプログラム言語はこうした変換過程を辿らない。ソース・コードは、Javaにおいて、コンピュータの種類を問わない「バイト・コード」と呼ばれる中間プログラムにコンパイルした後、各ハードウェアごとに用意されたソフト「Java仮想マシン(JVM)」を通じて逐次翻訳しながら、実行する。

 1957年、IBMのジョン・バッカスが最初の高級言語の「FORTRAN(Formula Translator)」を発表する。学術計算に優れたこの言語は、アセンブリ語しかない当時にあって、非常に使い勝手がよく、急速に研究者の間に浸透している。複素数を扱えることができ、また数の数学関数を組み込み関数としてサポートする。さらに、汎用コンピュータ・システムで使用することができるため、科学技術計算用の膨大なライブラリを利用できる。現在に至っても、この言語は数値計算界では依然として王者の地位を保ち続けている。

 グレース・ホッパーが、1959年、データ処理向きの高級言語の「COBOL(Common Business-Oriented Language)」を開発する。英吾に近い文法博文をし、簡易言語の先駆と言える。インデックス付きファイル・アクセスや10進数演算機能、簡便な画面定義機能など事務計算に特化した特徴がある。ライブラリ・プログラムを持っていないため、力ずくが必要な計算には適さない。煩雑な事務処理に頭を悩ませていた企業や官庁が飛びつき、COBOLは爆発的に普及し、現在でも、民間企業を中心に世界で最も使われているプログラム言語である。

 FORTRANとCOBOLは、コンピュータが計算する機械であると同時に、データ処理装置であるという二面性をよく表している。また、FORTRANとCOBOLの生まれた順序も計算器が先に考案され、その後にジャカード織機が発明されたという歴史とも符合する。その上、エイダ・ラブレスやグレース・ホッパーという女性がデータ処理のためのプログラムの発想を思いついたということも、「ジェンダーとコンピュータ」を言い出すまでもなく、興味深い。

 男味のほうが集中的とするなら、女味のほうが分散的だろう。なんでも一つにかたまって集中するのがよいように考えられてきたが、そうでもない。
 たとえばテストのときは集中力と言い、たしかに一つの方向に世界を定めて集中するのが有効だが、そうばかりでもない。テストのあとでぼんやりと心を開いていると、なんでもない解き口が見つかったりすることがある。
 よいアイデアは、世界を閉じるより、できるだけ心を開いて外からの兆候を感じたほうがよい。そして、そのアイデアをかためるときは集中力が必要。(略)
 あるいは、男味は計画達成型で、女味は状況反応型であろう。男味がすぎると計画にこだわるし、女味がすぎると状況に流される。男文化のモラルでは、「男はいったん決めたら、まわりを気にせずとことんやる」ことで、女文化のモラルでは、「まわりの様子への気くばりがなにより」となる。それで、男の子と女の子がいると、男の子がなにか欲しいときは自分の熱意と理屈で迫り、女の子だと親の機嫌の流れを読みとる。
 男味のほうが安定性を必要とするものづくり産業に向いていて、女味のほうがアパレルのような情報付加産業に向いていよう。時代としては情報の部分が増えて、女味に向かっている。
(森毅『男文化の行方』)

いいなと思ったら応援しよう!