プログラミングを始めようとして最初に戸惑うのは、たぶん書き方そのものより前に、言語の多さではないかと思います。Python、JavaScript、Java、C、Go、Rust、Swift。少し調べるだけで名前がいくらでも出てきて、しかもどれも「これから伸びる」「現場で使われている」と書いてある。一つ覚えれば済むはずのものが、なぜこんなに分かれているのか。
数えてみると、想像よりずっと多い。プログラミング言語の歴史を集めた百科事典的なデータベースHOPL(Online Historical Encyclopaedia of Programming Languages)は、18世紀から現在までに作られた言語を8000以上収録しています。さすがにその大半は廃れているか、ごく狭い世界でしか使われていません。それでも、いま一定の利用者がいる言語に絞っても1000を超えるといわれます。人気を測る指標としてよく使われるTIOBEのランキングでも、常時250ほどの言語が順位の対象になっている。
最初の分かれ道
おもしろいのは、この枝分かれが言語の「最初期」からすでに始まっていたことです。
1957年、IBMのジョン・バッカスが率いるチームがFORTRANを世に出します。ブリタニカ百科事典の解説によれば、これは実用になった最初の高水準言語で、科学技術計算のために設計されました。名前はFORmula TRANslation、つまり数式の翻訳から来ています。バッカス自身は、コンピュータ歴史博物館に残るインタビューで、手作業のコーディングにつきまとう細かな帳簿づけや繰り返しの段取りをなくしたかった、と語っています。狙いは、技術者や科学者が数式に近い書き方で計算機に指示を出せるようにすることでした。
その2年後、まったく別の相手に向けた言語が登場します。COBOLです。こちらは事務処理が目的でした。ブリタニカによれば、1959年にアメリカ政府と民間が共同で開いた会議から生まれ、英語に近い読みやすさと、メーカーの違う計算機でも動く移植性を重視して設計されています。給与計算や在庫管理を担う事務の現場で、プログラミングの専門家でなくても文面を追えるように、という発想です。
同じ計算機でも、向き合う相手が科学者か事務員かで、ちょうどいい書き方は変わります。FORTRANとCOBOLは、その違いを最初に形にした二つでした。どちらも今に残っていて、FORTRANは数値計算の一部で、COBOLは銀行や行政の古い基幹システムに根を張ったまま、21世紀になっても動いています。
計算の前提から考え直す
用途の違いだけなら、まだ話は単純です。ところが同じころ、計算そのものの捉え方を変えてしまう言語も現れました。
ジョン・マッカーシーが1960年前後にMITで作ったLISPがそれです。ブリタニカの説明では、LISPは再帰関数の数学理論を土台にしていて、「手続きを順に並べる」のではなく「データに関数を適用する」かたちでプログラムを書きます。人工知能の研究で広く使われたのは、プログラムとデータが同じ構造(リスト)で表されるという性質のおかげでした。プログラムが別のプログラムを、ただのデータとして扱って書き換えられる。自分で自分を書き換えながら「学習」するようなプログラムを作りやすかったのです。
FORTRANやCOBOLが「機械にやらせる手順を、人間に読める形で並べる」道具だったとすれば、LISPは「計算とは何か」という前提のほうを別の場所に置いていた。言語の違いが、用途の違いを超えて発想の違いになった早い例です。
研究の世界では、もう一つALGOLという言語が大きな足跡を残しました。ヨーロッパの研究者が世界共通の言語をめざして1960年に整えたもので、実務ではあまり普及していません。それでいて、その後の多くの言語の文法はALGOLを下敷きにしています。広く使われた言語と、後に効いた言語は、ここでは別でした。
機械の近くで書く
時代が下ると、計算機そのものが変わります。部屋を占める大型機だけでなく、机に載るくらいのミニコンが現れた。木暮仁氏がまとめたソフトウェアの歴史をたどると、1960年代後半から70年代にかけて、大型機向けの言語が巨大化・複雑化し、小さな計算機では持てあますようになっていった経緯が見えてきます。
その文脈で生まれたのがC言語でした。ブリタニカによれば、Cは1969年から73年にかけてベル研究所のデニス・リッチーが開発したもので、メモリの限られたDECのPDPという小型機の上でOSを書くための、切り詰めた道具として作られています。前身には、ケン・トンプソンが作ったBという型のない言語があり、そこへ型やポインタを足してシステム記述に耐えるようにしたのがCでした。
Cの何が決定的だったか。それを理解するには、当時のOSの作り方を思い出す必要があります。OSはふつう、その機械専用の機械語やアセンブラで書かれていました。中身がハードウェアの細部とぴったり噛み合っているぶん、別のコンピュータに移そうとすると、ほとんど一から書き直すしかない。ソフトとハードが一蓮托生だったわけです。
ところが1973年ごろ、UNIXというOSの中核がこのCで書き直されると、その縛りがほどけます。ハードウェアが違っても、Cで書かれた部分は翻訳をやり直すだけで別の機械へ移せる。機械語ほど機械の近くで書けるのに、特定の機械には縛られない、という都合のいい立ち位置をCは占めていました。UNIXが多種多様なコンピュータへ広がったのも、のちのC++やObjective-C、さらには発想を受け継いだJava、C#が生まれたのも、もとをたどればこの一点に行き着きます。
なぜ一つに収束しないのか
理由の半分は、ここまで見てきたとおりです。相手にする仕事が科学計算か事務か人工知能かで書きやすい形が違い、手続き型・オブジェクト指向・関数型といった発想の流派でも分かれ、動かす機械が大型機からパソコン、スマートフォン、ブラウザの中へ移るたびに、その環境に合う言語が呼ばれてきました。
残りの半分は、もっと身もふたもない話です。プログラミング言語は、作ろうと思えば作れてしまう。既存の言語の不満を解消したい、新しいハードを使い倒したい、あるいは単に自分の理想を試してみたい。動機はさまざまで、用途が似ていても独自の売りが一つあれば、並んで生き延びられます。そこに慣性も働く。一度広まった言語は、たとえ古びても、その上に積み上がった膨大なプログラムごと簡単には捨てられません。COBOLが半世紀以上たっても銀行で動いているのは、新しさではなく、この重さのためでしょう。
「いちばん良い言語」を一つに決められないのは、突きつめれば、解くべき問題のほうが一つではないからです。速さが要る場面、読みやすさが要る場面、安全に書き換えたい場面で、優先したいものは食い違う。どれを上に置くかで、ちょうどいい言葉は変わってしまう。たくさんあること自体が、その答えの多さをそのまま映しているのかもしれません。
参考・出典
- Encyclopædia Britannica「FORTRAN」 https://www.britannica.com/technology/FORTRAN
- Encyclopædia Britannica「COBOL」 https://www.britannica.com/technology/COBOL
- Encyclopædia Britannica「C|computer programming language」 https://www.britannica.com/technology/C-computer-programming-language
- Encyclopædia Britannica「LISP|computer language」 https://www.britannica.com/technology/LISP-computer-language
- Computer History Museum「John Backus oral history / FORTRAN」 https://www.computerhistory.org/collections/catalog/102657954
- 木暮仁「プログラミング言語の歴史<ソフトウェアの歴史」 http://www.kogures.com/hitoshi/history/soft-language/index.html


