メモリーにプログラムを格納する

 パッチボードの時代にはプログラムはコネクタとケーブルによる回路で物理的に表現されていましたが,その後情報を電気的・磁気的に記憶できるデバイス(コアメモリー)が発明されると,プログラムも同じようにメモリーに格納できる手法が考え出されました。俗に言うノイマン・アーキテクチャの登場です。この辺りから現在のコンピュータに近いものになってきます。

 ノイマン・アーキテクチャでは,プログラムはメモリーに記憶された情報であり,CPUに対する命令の集まりです。初期のプログラマはこのビットで表現されたプログラムをトグルスイッチでぱちぱちと入力したそうです。もちろん,やりたい処理をビットに直すのは人間が自分の脳味噌と紙と鉛筆を使って行うのです。パンチカード入力機があっても,機械を立ち上げるためのコード(ブートストラップ・コード)はトグルスイッチからという機械は珍しくなかったそうです。

 実は私は前述の実習でトグルスイッチも経験しました。私が使ったタイプでは,8個のトグルスイッチで1バイトを表現し,9個目のスイッチでメモリーに書き込みます。ちょっとしたプログラムでも非人間的な苦労を強いられます。

 トグルスイッチ時代のエピソードで,自作のOS全体を完全に暗記していて,なにも見ずに数万回トグルスイッチをぱちぱちとやったエンジニアなどの伝説が残っています。昔の人は偉かった。

 当時はコンピュータの方が高価でしたし,コンピュータはそれだけのコストを払ってもおつりがくるほど高速に処理できる夢の計算機械だと考えられていたのです。

機械的な処理はコンピュータに任せる

 しかし,コンピュータをとりあえず動かすのが最優先という時代が終わりに近づくと,そのような非人間的な作業はコンピュータ自身にさせる方が効率的だという認識が現れました。そのような認識が,コンピュータに行わせる処理を人間向きの表記で記述し,それからコンピュータ向けの命令列に変換するという現代のプログラミング言語につながる発想が生まれたのです。

 世界最初のプログラミング言語は1954年に設計されたFORTRANだと言われています。しかし,あまり知られてはいませんが,これより前の1942年にKonrad Zuseという技術者によってPlankalkülという言語が設計されています。PlankalkülはFORTRANよりも10年以上前に設計されたというのに,(1)代入文,(2)サブルーチン,(3)条件判断,(4)ループ,(5)浮動小数点数計算,(6)配列,(7)レコード型(構造体),(8)例外処理,などの概念を含んでいたのだそうです。「プログラム」という言葉さえない時代の産物としては驚異的です。ただし,Plankalk殕の処理系は作られなかったそうですから,最初に実際にコンピュータで処理されたプログラミング言語はFORTRANで間違いないのでしょう。

 FORTRANはFORmula TRANSlator(数式翻訳機)から取られた名前です。名前が示す通り,元々は計算式の処理を人間がコンピュータの命令列で延々と記述するのではなく普段使う数式のまま記述したいというのが,その開発の基本的な動機だったようです。ですから,プログラミング言語の基本的な目的は,人間,特にプログラマに楽をさせるというものだったのです。

プログラミング言語が百花繚乱

 その後のプログラミング言語の進化の歴史は,いかにすればプログラマが楽になるかということに関する試行錯誤の歴史です。

 例えば,日常使う言語(英語)に近い表現でプログラムできれば,より多くの人がプログラムできるようになるのではないか,とのアイデアから生まれたCOBOL(COmmon Business Oriented Language)とか,FORTRANとCOBOLの良いところを両方取り込めば一つのプログラミング言語であらゆる分野に適用できるのではないかと考えたPL/I(Programming Language One)。S式と呼ばれるリスト表現とLambda計算という単純なモデルによって計算を行うことを目指したLisp(LISt Processor)。FORTRANよりも美しい言語を目指して設計されたAlgol(ALGOrithmic Language)。1950年代から60年代にかけて,新しい言語が数多く登場しました。

 これらの言語の中で現代でも生き残っているものの代表はやはりFORTRANとCOBOLでしょう。FORTRANは数値計算や科学技術計算の分野で,COBOLはビジネス分野でいまだに根強く使われています。

 しかし,面白いことに次の世代に影響を与えた言語は,生き残ったFORTRANやCOBOLではなく,どちらかというと消え去ってしまった言語の方でした。例えばAlgolはその後に登場したPascal,AdaやCなどに大きな影響を与えました。また,Lispは自分自身も完全には消え去ることなくCommonLispなどの形で生き残るとともに,Lispから生まれた機能や発想は,形を変えて数多くの言語に受け継がれています。例えばJavaで有名になったガーベジ・コレクションや例外処理などはみんなLispから生まれたものです。また,多くのオブジェクト指向言語は多少の差こそあれLispの影響を受けています。

構造化からオブジェクト指向へ 

 1970年代から80年代にかけてはいくつかの新しい動きがありました。一つはAlgolの子孫たちの繁栄です。Algolそのものは学術的には高い関心を集めたものの,あまり処理系も作られず実用的に使われる機会は多くなかったのですが,すでに述べたようにPascalやCをはじめとする多くの言語にその性質が受け継がれました。

 もう一つはまったく新しいタイプの言語の登場です。70年代から80年代にかけては,人工知能向け言語やオブジェクト指向言語などが登場しはじめました。人工知能向け言語としては,述語論理を採用したPrologやゴール探索という手法を採用した言語が数多く現れました。オブジェクト指向言語としては,最初のオブジェクト指向言語であるSimulaが誕生したのは60年代末ですが,多くのオブジェクト指向言語の先祖であるSmalltalkが開発されたのは70年代で,世間に広く公表されたのは1981年8月号のBYTE誌でした。

Webが実行の舞台になる

 1990年代以降では,プログラミング言語の分野ではそれまでのような劇的に大きな動きは少なくなります。目立った動きとしてはWebプログラミング(特にCGI)に対応するためのスクリプト言語の台頭と,Javaの活躍でしょう。

 1970年代から80年代にかけて特定目的に細々と使われてきたスクリプト言語は,1987年ごろに誕生したPerlという万能スクリプト言語と,Webという新しい適用分野を得て非常に発展します。そしてPerlの欠点を補うような新しいスクリプト言語も次々と誕生しました。「よりきれいなスクリプト言語」としてのPython,私が開発した「純オブジェクト指向スクリプト言語」であるRuby,またWeb向けスクリプト言語であるPHPなどが代表格でしょう。

 また,スクリプト言語は単なるテキスト処理やWebプログラミングの分野を超えてほとんどあらゆる分野で使われています。いまやバイオインフォマティックス分野ではPerl,Python,Rubyを使うのは当たり前ですし,その他の分野でも以前ではスクリプト言語を使うなどと考えられなかった目的にまで使われています。

 Javaは1995年に米Sun Microsystems社から発表された言語です。印象としては「単純化されたC++」という感じがありますが,ガーベジ・コレクションや例外処理などいままで一般にはあまり知られていなかった便利な機能を取り込んでいる先進的な側面もあります。ただ先進的と言ってもLispでは何十年も前から提供されていた「枯れた」機能ではあるのですが。そのような冒険をしない姿勢もJavaの長所と言えるかもしれません。私個人はプログラミング言語としてのJavaにはあまり魅力を感じないのですが,ビジネスの素材としてのJavaは大成功していることを認めざるをえません。