コンピュータの能力が向上するにつれプログラミング言語は発展した。人間にとって便利になる方向だ。遠い未来にはプログラムを書くという行為がなくなるかもしれない。ただ言語の進化はコンピュータ技術の中では遅い部類に入る。人間の処理能力を反映しているからだ。プログラミング言語が考え方自体を規定している面もある。

(本誌)

 これだけ情報技術が進歩したと言っても,コンピュータの本質は半世紀前からほとんど変化していません。もちろんCPUそのものは以前に比べて圧倒的に高速になり,また中身ははるかに複雑になってはいますが,今でもCPUの仕事はメモリに蓄積されたバイト列を命令として実行することだけです。

 しかし,昔も今もCPUに与える命令を数値のまま扱うのは大変です。そこでプログラミング言語が登場しました。プログラミング言語の発達の経緯については前回解説しましたが,コンピュータの歴史の中で何千,何万ものプログラミング言語が現れ,そしてその多くは消えていきました。なかにはとても長く生き延びているものもあります。また,消えていったものの中には後のプログラミング言語に影響を与えたものもあります。

古い言語も生き延びている

 プログラミング言語の進化はあたかも生物の進化のようです。主要な言語の系統図をごく簡略化して書くとイラストのようになります。これはあくまでも簡略化したもので,実際にはこの何倍もの言語が良い機能を次の言語に受け渡しつつ,進歩してきたのです。

 このイラストを見ているといくつかの興味深い点が明らかになります。まず第一に,かなり初期に登場したFORTRANやCOBOLなどが現在でも使われていることです。これらの言語は他の言語に影響を与えつつ,現在まで生き残っています。このことは条件さえ揃えばプログラミング言語の寿命は非常に長いということを意味します。

第2世代で構造が持ち込まれる

 第二に興味深い点は,プログラミング言語が大きく四つの世代に分割できることです。FORTRAN,COBOL,AlgolそしてLispなどが第1世代のプログラミング言語です。これらは数字列やアセンブラよりも高級な,より人間向けのプログラムを記述するというアイデアを実現したものです。1950年代には「高級プログラミング言語」は人工知能の一部として研究されていたのだそうです。最初の世代ですから洗練されていない点も多いのですが,それ以前のプログラミングに比較すると圧倒的に生産性が高くなりました。

 第2世代のプログラミング言語には,第1世代より大きなプログラムが開発できるよう,プログラムに「構造」という考え方が持ち込まれました。構造化プログラミングと呼ばれるプログラムの構成法が注目された時代です。Algolはその先がけとなりました。Simula,Pascal,Modula-2,C,Adaなどがこの世代になります。

 また構造化プログラミングとは異なりますが,プログラム構成に関する別の考え方(パラダイム)が導入されたのもこの世代と考えることができます。例えばスタックを利用した逆ポーランド記法をプログラム構成とするForth,述語論理を基本的な考えとするPrologなどです。これらのパラダイムは主流にはなりませんでしたが,現代でも生き続けています。

オブジェクトの時代が第3世代

 第3世代はオブジェクトの時代です。SimulaからSmalltalkへと育てられてきていたオブジェクト指向の考えが広く受け入れられ,主流になっていった世代です。この世代に属するプログラミング言語としては,Cから派生したC++やObjective-C,Adaから生まれたEiffel,Lispから生まれたCLOSなどがあります。C++の反省をベースにして生まれたJavaもこの世代に分類してよいと思います。

 系統図には登場しませんでしたが,その他にも数多くのオブジェクト指向言語が登場しました。ほとんどの言語には「OOなんとか」とか「Objectiveなんとか」というオブジェクト指向拡張版が登場したと言っても過言ではないくらいです。「Objective-Smalltalkはいつ登場するか」とか「いや,きっとSmalltalk++だろう」とかは当時よく言われたジョークです。

Perlがスクリプト言語の立場を変えた

 第4世代は厳密に言うと「次の世代」とは言えないかもしれません。その歴史は古く,第3世代までで紹介してきた「メインストリーム」の言語のそばに存在していたからです。例えばアプリケーション組み込みの小規模言語とか,簡単な制御構造を持つツールとかです。これらはインタプリタ型の言語で,言語仕様は小さく,機能は制限されていました。でも確かにプログラミング言語だったのです。テキスト処理などの小規模なタスクを手早く柔軟にこなすものもあります。このような言語は「スクリプト言語」と呼ばれてきていました。JCLやバッチスクリプト,SED,sh,AWKなどが昔からありました。

 しかし1987年に登場したPerlは,それまでのスクリプト言語とは一味違っていました。Perlはスクリプト言語としての性質を備えていましたが,OSのシステムコールをすべて呼び出せるなど,メインストリームの言語に劣らない機能性を備えていたのです。それまでのスクリプト言語には大規模プログラムに対応するスケーラビリティがなかったため,スクリプト言語のユーザーは,小規模なプログラムにはスクリプト言語を,プログラムの規模が大きくなればCなどのメインストリームの言語を使う必要がありました。しかし,Perlのような言語があれば,ほとんどのタスクをひとつの言語でカバーできます。この考えは広く受け入れられ1980年代終わりから1990年代にかけて,新しいスクリプト言語がいくつも登場します。第3世代言語がオブジェクト指向機能を備えたように,新しいスクリプト言語はオブジェクト指向機能を備えるようになりました。Perl,Tcl,Python,Rubyなどが代表的なスクリプト言語です。

処理能力の向上に合わせて言語が進化

 このようにしてプログラミング言語は進化してきました。進化を押し進める力は環境の変化です。プログラミング言語の場合はコンピュータの能力の向上です。ごく初期のコンピュータは処理速度が遅くコストが高かったため,人間ができることはコンピュータ様のために準備しておく必要がありました。ですから,コンピュータが実行するためのプログラムとなる数字の列は,人間が用意してやるものだったわけです。コンピュータのコストが下がるにつれ,人間に読める形のプログラムから命令列を生成する処理をコンピュータに任せられるようになりました。

 コンピュータには実行するプログラムが構造化されていようが,分かりやすく書かれていようが関係ありません。CPUは一つひとつの命令をものすごい速度で順に実行するだけです。構造化プログラミングもオブジェクト指向もコンピュータができないことをできるようにするわけではないのです。構造化やオブジェクト指向は人間のためなのです。プログラムがいくら複雑でもコンピュータは困りませんが,人間は困ります。ここ半世紀の間コンピュータの性能は飛躍的に向上しましたが,人間の脳の処理能力は少しも変化しません。生物はそんなに簡単には変化しないのです。その意味では人間の処理能力がプログラミングの限界となっているのです。構造化プログラミングもオブジェクト指向プログラミングも,コンピュータの助けを借りて人間の処理能力の限界を拡張しようと言う試みと言えます。

 人間はあまり複雑なものを一度に扱うことはできません。記憶力にも処理能力にも限界があります。ですから,解決すべき問題全体を小さなタスクに分割して,処理する必要があります。構造化プログラミングは制御の流れを理解しやすく整理することを助けてくれますし,オブジェクト指向はさまざまなデータとその処理をオブジェクトやクラスという単位で整理するのに役立つ考え方です。

 より人間を助ける。これがプログラミング言語の進化の方向なのです。