プログラミング言語って、何をしたいかが重要だろ

マチュアなんだから俺はそう考えるね。だから言語について暑苦しく、もとい、熱く語るってのは、買ってきたフィギュアを一日中眺めて、造形だの塗りだのをみながらニヤニヤしているようなもんだ。フィギュアってのは、ジオラマ作ってなんぼだろ(偏見)。

そういうわけで、俺が各言語について動かせるもの、つまり、向き不向きを勝手に書くことにする。

FORTRAN

FORMULA TRANSLATOR。世界最初の高級言語。高級(笑)言語、と書いてはいけない。「とてもじゃないが、アセンブラで弾道計算プログラムなんか書いていられない」という、正しい不満を、正しく認識して、より高水準の言語を作ろうという正しい解にたどり着いた先人がいた。そして、計算式を翻訳する言語を作り上げた。不幸だったのは、これが最初の言語だったことで、プログラミング言語理論というのは、FORTRANという災害を見て呆然とした人類が「これではいけない」と考えた結果あらわれたものだ。FORTRANとはタコマ橋だ。プログラミング言語について語る者は、FORTRANの名の前に跪き、その名を未来永劫忘れないと誓わなければならない。
とにかく、FORTRANはあんまりな出来だったので、すぐに追い落とされても良さそうなものだった。が、あんまりだったのは文法であって、数値計算についてこれを追い越せる言語は30年くらい現れなかった。その間、すさまじい知性がその数値計算ライブラリ群に注ぎ込まれた。それらは論文として書かれたので第一級の知性の結晶といえた。FORTRANのライバル言語ユーザーは、みな大学生レベルだったので、よいライブラリがなかなか現れなかった。C言語は型の扱いがあまりに適当だったので、精度面でも速度面でも新アーキテクチャとの整合面でも不満があった。
そんなこんなで、FORTRANはスーパーコンピューターを動かす言語として長きにわたって使われたのだった。

LISP

これは心に刻んでおかなければならないことだが、Lispは最も古い高級言語の一つである。(car ( cdr ( alpha beta gamma delta))) などという益体もない文字列を実行する。プログラムとデータは同格である。たいていの人はだからどうしたと思うのだが、そこで終わりなら貴方も所詮その程度である。
LISPはシンボルの扱いに長けていたので人工知能の分野で広く使われた。今となってはシンボルの処理など自慢するようなことではないが、この言語の発案は1950年代にさかのぼることを忘れてはいけない。
最初のころは、アメリカに掃いて捨てるほどいたカウンセラーの手口を真似るプログラムが大ヒットした。英語の単語をデータ構造として扱えるLISPならではのアプリケーションである。多くの人がこのELIZAを人間だと考えた(といわれる)。
その後、人工知能は期待ハズレに終わったが、死んだはずだよお富さん、一介の大学院生が積み木の仮想世界に関する英会話システムを作り出した。SHRDLUである。この院生論文は、学会が一冊の本として出版するほど衝撃を与えた。
LISP人工知能にとって唯一無二である時代が長かったので、SymbolicsやLambdaのようなLISPマシンメーカーまで現れた。その後、やっぱり人工知能は期待ハズレだといわれるようになった。今では人工知能という言葉が臆面もなく使われるのは、映画とゲームだけである。
LISPEMACSを動かすスクリプト言語である。

COBOL

FORTRAN以降のプログラミング言語理論は長足の歩みを遂げたが、いろいろやり過ぎた人たちが多く現れたのも事実だった。(だいぶ後に出ることになる)Alogol-68は厳密に定義され、かつ詩が書けるほど柔軟だったが、柔軟というよりフランス娘以上に奔放だったので誰の手にも負えなかった。核兵器で武装したアメリカ人たちは、よもやヨーロッパ人たちが自分たちより優れているとは思わなかったので、きれいな言語を鼻で笑った。そして、プロジェクトマネージャーにも読めるプログラミング言語COBOLを作った。COMMON BUSINESS ORIENTED LANGUAGE。COMMONと言う名前に、Adaへと連綿と続くお役所言語の流れを見て取ることができる。
COBOLは上司を動かして予算を取ることのできる言語だった。

Pascal

アメリカがCOBOLに続いてPL/Iでも間抜けな失敗を繰り返す間、ヨーロッパではN.WirthがAlgol-68の失敗の原因を見抜いて、「アルゴリズムとデータ構造」を簡潔に記述できるPascalを作り上げた。彼は授業の教材としてこれを使用し、要望があれば、どの大学にも磁気テープのコピーを認めた。また、移植性のためにP-CODEを開発し、Pascalコンパイラの出力をP-CODEに落とした。その結果、P-CODEだけ移植すればPascalの移植が完了した。今で言う仮想マシンである。
Pascalは史上初の、「自分自身のコンパイラをきちんと記述できる」実用言語だった。多くの大学が移植性の容易さ、入手コストの低さからPascalを採用し、野火のように教育機関で広まった。これが、Pascalが「教育用言語」と間違って受け取られる理由である。
Pascalを笑ってはいけない。
Pascalは、コンピューティングだけを見つめた言語のうち、最初に成功したものといえる。それは弾道計算も、事務計算も、人工知能も目指さず、コンピュータ科学にいかにシンプルに向き合うかを考えて作られた言語である。コンピュータ・プログラミングが「好き」な人間は、この純粋さを胸に刻むべきである。PascalをP-CODEに落とすコンパイラPascalで4000行しかなかった。その小さくて簡潔にまとまった仕様のため、PascalはConcurrent PascalやObject Pascal、Clascal、PL/0など多くの実験言語の母体となった。
Pascalはコンピュータ科学の基本を実践するための言語である。

C言語

米国の産学共同で開発されたMulticsは、悲惨な結果に終わった。しかしながら、一部の利用者は「使い心地はそれほどひどくなかった」と思った。彼らのうち、AT&Tベル研究所に勤めていた何人かは、仕事の合間を縫って、というか、仕事中に「Multics並みに使いやすいが、小さなOS」をもらってきたPDP-7に移植することにした。仕事も予算もない人たちだったのだ。いい時代である。Unixは、「ゲームを動かすために」とか「ワープロを動かすために」開発されたと間違っていわれるが、それらはUnixが動き出した後に、思いつきや予算確保のために行われた仕事である。
当時OSはアセンブリ言語で書くのが常識だったが、PL/IMulticsを書けたことだし、俺たちも高級言語で書いてみるかと言うことになった。そこで、C言語を開発することになった。C言語は弾道計算も事務処理も人工知能も目指していなかったのでそのあたりの分野での特性はへなへなである。しかし、恐ろしいほどCPU…というか、PDPシリーズ…に密着した設計になっており、それほど最適化しなくてもそこそこの性能を出せた。C言語のこの特性は、後に組み込みで遺憾なく発揮される。C言語はCPUを動かすための言語である。

PL/M

C言語と同じようにアーキテクチャに近い高級言語というアプローチは、IntelがPL/Mでも試してみたが、一定の成果を挙げた後、フェードアウトした。
PL/Mの設計者はゲイリー・キルダールである。彼はPL/M( Programming Language / Microcomputer )用のディスクIOシステムとして、簡単なモニタをIntelに提案したが蹴られた。そこで独立して会社を興し、CP/M ( Control Monitor / Micorocomputer )を開発した。

Ada

PL/Iで書かれたプログラムがあまりに低品質なことに気づいた国防総省は、こんな言語に核兵器だのミサイルだのを任せることの恐ろしさに突然震え上がった。そこで、バグの種類を徹底的に解析した国防総省は、型に厳格で、読みやすく、演算精度をプログラマが制御でき、タスク同期と通信をOSに依存せず取り扱える言語に関する要求仕様を出した。今で言う本質安全、機能安全である。
国防総省の要求仕様は膨大だっため、コンペに応募した言語はいずれも巨大だった。その中からフランスのハネウェル・ブルのチームが提案した言語が選ばれ、Adaと呼ばれた。Adaの初期の実装はコンパイラソースコードサイズが20万行を超えたといわれる。Pascalの初期の実装が4000行だったことは上に述べた。
Adaは国防総省の後押しなどがあったが、パソコン市場の爆発がC/C++を押したため、Adaは陰に消え去った。非常に読みやすいことから惜しむ声も少なくないが、国防総省御用達とあって、なかなかプログラマにお目にかかれないのも特徴である。そのことから、Read Only Languageなどと言われる。Ada、かわいそうだよ、Ada。
国防省を動かして防衛予算を分捕るための言語である。

C++

C言語オブジェクト指向パラダイムを動かすための言語である。そうとしか言いようがない。C++言語に関しては広く使われているにもかかわらず多くの批判がある。たとえば、オブジェクトの代入に関する規則はほとんど黒魔術といえる。
これらに対して、STL, BOOSTなどのライブラリが開発されているが、結局のところ死体で山を作って塀を越えているような印象はぬぐえない(開発者には頭が下がる)。一時流行した「お母さん、僕にもスマートポインタが書けたよ」ブログは、なんだかなーというC++言語に関する印象を一層強くした。
Microsoftは早い時期からC++に取り組んでいたが、MFC、ATLを送り出した後、あきらめて.Net体系に移行することに決めた。

Java

「言語Xの悪いところを正して言語Yを作った」という例は枚挙に暇がない。というか、世の中はどうやらほとんどこれらしい。JavaC++の悪いところを正して作られた。
Java仮想マシン上で動く。仮想マシンさえ作り直せば、どこでも動く。だからWrite Once Run Anywhareなどといわれた。だが、ライブラリまでJavaで書くと遅くて仕方がない。これが結構脚を引っ張ることになった。JITコンパイラが長足の進歩を遂げたのはJavaの登場がきっかけといえる。その後、プラットホームのネイティブ・コードでライブラリを構成する技術が現れて速度問題が緩和されたが、移植性が悪くなった。また、x86のパワーはJavaの遅さをかなり助けてくれるはずだったが、MS (Microsoftの俗称)とSM (Sun Microsystemに俺が勝手につけた俗称)の喧嘩のせいで、Windowsでは普及しなかった。
Linuxに関しては、プラットホームもそれを支持している人たちのことも、よく分からない。
Javaはクライアントでは普及しなかったが、サーバー上のビジネス・システムではよく使われている(らしい)。多くの基幹システムがJavaで書かれている(らしい)。Javaの特徴は、過去の言語の欠点をよく調べて作られた、頑強な文法(C#と同じ)、多くの開発者(C#と同じ)、充実したライブラリ(C#と同じ)、多くの成功例(らしい)である。
ともかく、Javaはサーバーで広く使われている(らしい)ので、一般人にとってJavaとはEclipseを動かす言語である。笑ってはいけない。これだけでも感謝しきれない成果である。

C#

「言語Xの悪いところを正して言語Yを作った」という例は枚挙に暇がない。というか、世の中はどうやらほとんどこれらしい。C#C++の悪いところを正して作られた。C++++ -> C#である。
C#仮想マシン上で動く。仮想マシンさえ作り直せば、どこでも動く。Microsoftは組み込みまで含めて仮想マシンで覆い尽くそうとしてる。彼らの仮想マシンはガーベージコレクタを持っているので、MSの戦略に乗っかっている限り、一般プログラマがポインタの開放で悩むことは金輪際無くなる。
Linuxに関しては、互換システムであるMonoが開発中であるが、プラットホームもそれを支持している人たちのことも、よく分からない。
大規模処理を必要としない.Netアプリケーションの多くがC#に移行している(らしい)。C#の特徴は、過去の言語の欠点をよく調べて作られた、頑強な文法(Javaと同じ)、多くの開発者(Javaと同じ)、充実したライブラリ(Javaと同じ)、多くの成功例(らしい)である。
C#にはVisual Studio Expressエディションというフリーの開発環境があり、充実したヘルプによって安心して開発を進めることができる。

Perl

スクリプト系言語の代表格、と言うとRuby信者に噛み殺される、PHP信者に粘着される。
割と頻繁に「XXXだなんて、そんな批判をするのはPerlには**が作られたのを知らないからだ」という声を聞く気がする。気のせいかもしれないが。気のせいじゃないなら、もう10年くらいして安定してから勉強しても遅くない気がする言語。
かつてはフリーの掲示板やフリーのWikiを動かす言語だった。

Ruby

日本で一番戦闘的なプログラマ達を遊ばせるための言語である。オブジェクト指向が強い(らしい)。開発者は海外でも活躍している(らしい)。Ruby on RailsというDBフレームワークがあって、一時はハテナのトップがRuby on Rails村の住人で溢れかえっていた。
RubyRailsを動かす言語である。

PHP

WEBページに埋め込んで、サーバー側でプログラムを動かすためのプログラミング言語。DBと連携したシステムをよく見る。LAMP : Linux Apache MySQL PHPということばがある*1。これらをセットにしたシステムはサーバーとして広く利用されており、開発者も多い。
PHPのプログラムは$だらけである。実に読みにくい。PHPの開発者はよほど才能があったのだろう。才能のある人は往々にして、引きこもりがちになり、他人とのコミュニケーションのしやすさに気を払わない。1から100まで足すだけのプログラムに、一体何ドル必要なのか。
ともかく、PHPLAMPでDBベースのWEBアプリケーションを動かすためのプログラミング言語である。

Scheme

教科書の例題を解くための言語である。

Haskell

関数型言語Wikipediaの以下の一説を読むと、大体の感じはつかめる
http://ja.wikipedia.org/wiki/Haskell

Haskellはパターンマッチングやカリー化、リスト内包表記、ガード、定義可能な演算子といった特徴的な構文上の機能を含んでいる。遅延評価のみならず再帰的な関数や代数的データ型までもサポートしているほか、独自の概念として圏論のアイデアを利用し参照透過性を壊すことなく手続き型言語的な記述(例えば 代入、入出力、配列など)を実現するモナドや型クラスを含む。このような機能の組み合わせにより、手続き型プログラミング言語では記述が複雑になる関数でもHaskellではたいていは実装が容易になる。

つまりまぁ、先生たちがほかの先生を感心させるための言語である。うがった見方をすると、学者が論文を書くために開発された題材である。Haskellと書いてマッチポンプと読ませる漫画が現れるかもしれない。

ああ、暑苦しく語ってしまった。

*1:PはPerlでもある、と書いておかないとPerl信者から噛みつかれる

/* -----codeの行番号----- */