contentHomeWise9とは?投稿募集!JavaとJavaScriptの20年戦争まだ風邪だ。僕はいつも思うんだけど、ある種の寓話に正面からツッコミを入れたりするのは野暮だと思う。以前、アメリカ人に「侘び寂びとはなんだ?」と聞かれたことがあって、僕はうまく答えられなかった。日本語でも難しい概念を、そもそも同じ原体験を共有しているわけでもないアメリカ人に説明することができるだろうか。大学で英文学を専攻しているのに英語はしゃべれない、好きなものはヴィジュアル系バンドに甘いもの、そんな女の子にいきなりプログラミング言語の違いを説明するというのは、どだい無理なのだ。いえ、このブログは「プログラミング情報ブログ」であるから、このブログの読者でまさかこの二つの違いが解っていない、という人は居ないとは思うけれども、念のため整理しておこう。これを整理することは、現代の問題の最先端に触れることになるかもしれない。Javaだが、JavaはC++の流れを汲む言語だ。C++の源流は言うまでもなくCにあり、Cの源流はPascalやFORTRANといった手続き型言語にある。Javaが本格的に登場したのは1996年。Javaが当初ウリとしていたのは「プラットフォーム中立性」というところだ。OSやCPUを問わず、どんな環境でも同じプログラムが実行できる。仮想マシンを仲介した実装で、似たようなことができるものが世の中にないわけではなかったが、Javaはオブジェクト指向をうまくバイトコード(と呼ばれる中間コード)に取り込むことで、他の似たような技術とは違っていた。Microsoftのブラウザ戦争の最中だった。HTML自体はプラットフォームに依存しないのに、ブラウザはプラットフォームに依存していた。Javaが最初にブレイクしたのは、まさにこの時だ。Javaアプレットという考え方が生まれた。これは、Javaプログラムを既存のWebページに埋め込むことを可能にする技術で、各ブラウザーベンダーはなぜかこれに飛びついた。Javaアプレットを使うことで、いままで静的なものしか扱えなかったWebページで動的なプログラムを実行可能になった。プラットフォームに依存しない形で。これはとても鮮やかで、理想的な解決策に思えた。理想とは、その登場段階に於いては大きな代償を伴うのが常だ。Javaアプレットの場合、その代償とは、スピードだった。Javaアプレットの実行速度が遅かったわけではない。Javaアプレットを実行するために起動するプラグインやらなにやらが膨大で、それが実行までのハードルを上げていたのだ。巨人、マイクロソフトになんとか勝ちたいネットスケープ社はJavaアプレットとは無関係な動的ページ技術を開発しようとしていた。それはLiveScriptと呼ばれ、本来静的なページであるHTMLをあとから好きなように操作できるという過激な仕様を持っていた。LiveScriptのもとになったのは、プロトタイプ型オブジェクト指向という、Javaが採用しているクラスベースオブジェクト指向に比べるとかなり柔軟性が高い考え方だ。関数をオブジェクトとして扱う第一級関数をサポートしているため、Lispのような関数型言語の特性をも併せ持つ、という過激な仕様を持っている。LiveScriptを開発したネットスケープ社とJavaを開発したサン・マイクロシステムズは当時協業関係にあった。そのため、Javaアプレットのようにブラウザ上で動的なページが作れる言語、ということでJavaScriptと名称変更してしまった。これがある種の悲劇の始まりである。もとがクラスベースのJavaと、プロトタイプ型オブジェクト指向を採用し、第一級関数までサポートした変態言語のLiveScript。このあまりにも出自も成り立ちも違う両者が、たまたま時代の要請でコバンザメのように名前だけ「JavaScript」としてしまったマーケティング戦略上の決定的なミスがここにある。事態はこれから思いもよらない方向に進んで行く。ひとつはマイクロソフトだ。マイクロソフトのインターネット戦略はハッキリ言って遅れていた。彼らはインターネットがなぜ大事なのか、そこでなにをしなければならないのか、ハッキリとしたビジョンを描かないままブラウザ戦争に突入した。そこで易々と敵の侵入・・・つまりJavaの搭載・・・を許してしまった。これがトロイの木馬だということにマイクロソフトが気づいた時には、Javaアプレットは十分な成功を治めていた。マイクロソフトはあわててJavaを独自に拡張し、Windowsでしか使えない機能を追加しようとした。実際、DirectXをJavaから使えるようにする、なんていう話もあった。そんなことをするとどうなるか。Javaに互換性がなくなる危険性が生まれてくる。これに対し、SUNは訴訟を起こす。あとはお決まりの泥沼の法廷喜劇だ。ま、このあたりは事実誤認が含まれているかもしれないから、気になる人は各自@mkusunok先生に質問するように。ひとつ、思わぬ方向からJavaは窮地に陥ることになる。4.0は、非常に野心的な製品だった。Composerを始め、高機能なHTMLメーラーなどがワンパッケージになった、まさにインターネット時代のオールインワンパッケージ。華々しく登場したそれは、しかし同時にとんでもない製品だった。鳴り物入りで搭載されたJavaアプレットの実行を高速化するJIT(ジャスト・イン・タイム)コンパイラだったが、それ以前にJavaアプレットを読み込もうとするとその初期化の段階でずいぶん待たされた。Communicator4.0にひどく失望してInternetExplorerに乗り換えた。皮肉にも、Javaアプレットの起動はIEの方が断然高速だった。この、Netscapeでの起動が極端に遅くなった、ということがJavaアプレットにとっては第一の致命傷だった。それから、ほどなくして気がつくと誰もJavaアプレットなんか使わなくなった。その裏側では、代替する技術の台頭があった。Playerというプラグインを作っていた。ベクトルベースでファイルが小さく、簡単なアニメーションなど、Javaアプレットが果たして居た多くの利用目的をカバーでき、なおかつ、プラグインが軽かった。Splashの一部の文字をとって、この製品は「Flash」と名付けられた。Formatということにされた。このSWFというファイル形式が急速に拡大するWebコミュニティの流れによって、地球上を実効支配するまでにかかった時間は短かった。そのあいだにMacromedia社はAdobe社に買収されてしまったけれども、SWFは残った。これから先、Adobe社が滅ぶことがあってもSWFは生き残るような気がする。ひとつの動的ページ技術、LiveScript改めJavaScriptだが、これはさらに深刻な問題に直面していた。JavaScriptはあまりにも簡単に書けるうえ、汎用性が極めて高い。そのため、簡単にブラウザの限界を超えてしまうという問題があった。JavaScriptを使って無理にブラウザに負荷を掛け、ブラウザそのものをクラッシュさせてしまう、通称「ブラクラ」が作れてしまうというのも、JavaScriptが言語として持つあまりに強大なパワーを人類が適切に制御できなかったことの好例かもしれない。いつのまにかJavaScriptは、「ウザいページを作る人のための言語」ということにされてしまった。一体全体、各ブラウザーメーカーはなぜこぞってこんな厄介な代物を組み込んでしまったのか。マウスカーソルを追っかけるキャラクターが表示されるページとか、開くと同時に音楽が鳴り響き、★やらなんやらが降ってくるページなど、およそなんのために作られたのか、たぶん地球上の誰も、JavaScriptの有効な利用法など考えていなかったのではないかと思われる。同時に、JavaScriptの秘めた潜在的なパワーに気づいた人たちがこっそりと動き始める。1997年にソニーのCSLが提案したVRML97は、仮想空間の物体の振る舞い(ビヘイビア)の定義にJavaScriptを利用するという仕様になっていた。時を同じくして、ヨーロッパでは国際標準化団体のひとつであるECMA(欧州電算機工業会)が、ECMAscriptとしてJavaScriptを標準化する。これを受けて、日本のARIB(電波産業会)は、デジタル放送用の記述言語BMLのプログラムはECMAscript(JavaScript)で行うことと定義した。西暦2003年にECMAscript4の仕様策定がマイクロソフトとネットスケープの両者で決裂すると、その仕様の一部はAdobeが引き継ぎ、ActionScriptとしてFlashに搭載されるに至った。実はFlashとJavaScriptは兄弟関係にあるのだ。ActionScript2.0からは、クラスベースのようにも書けるので、Javaが好きなプログラマでもすんなり入って来れる柔軟性を持っていた。ActionScriptによるプログラミングが全世界で流行する。Javaは、ブラウザに組み込まれWebページの一部として実行されるというJavaアプレットの道はいったん忘れたかのように見えた。Editionがあった。日本のケータイ業界に於いては、KVM(キロ・バーチャルマシン)をベースとしたサブセット版のJavaが活躍した。ケータイは各社端末によってCPUもOSもまちまちだったので、まさにJavaのメリットが生きる場所と言えた。日本のケータイだけは、Javaにとって誰にも侵されない神聖な領域のように思えた(BREWもあるけどあれは地獄なので別物)。Lite勢の進撃で再びクライアントコンピューティングにおけるJavaの地位は脅かされ始めた。Liteと地球の裏側で激突するとは事実はまさに小説よりも奇なりと言えよう。クライアントコンピューティングといえば、すっかり世界中のコンピュータユーザから嫌われていたJavaScriptだが、ある日、突然の転機が訪れる。これはJavaScriptを使用した非同期通信(Ajax)とユーザーインターフェースにより、それまで人々が体験したことのないようなWeb体験を生み出した。Mapsを契機としてJavaScriptにルネッサンスが起きる。幸せの青い鳥は、こんなに僕の近くに居たんだね!」それから世の中は180度変わった。JavaScriptを勉強することは正義となり、JavaScriptがきちんと動作しないブラウザは粗悪品となった。いろいろな人がJavaScriptを駆使したプログラムやWebサービスを競うように作った。Googleは2007年、GMailをAjax対応させた。世の中の流れはAjaxに逆らえないものになった。地球上の全ての場所でJavaScriptを呼ぶ声が聞こえる。神よ、我にJavaScriptを与えよ!さて、一方Javaは、着々とスーツ的プログラマーの人たちにとってなくてはならないものになって行った。JavaはたいていのIT企業の新人研修で学ぶものになり、気の早い大学では必修科目となり、専門学校ではそれさえ教えておけば仕事にありつける、という理由でJavaを教え始めた。職業Javaプログラマーの人口がどのくらいなのかわからないが、たぶん全プログラマー人口のかなりの部分を占めるのではないかと思っている。少なくともC言語より多そうだ。職業Javaプログラマーというのは、情報学科卒でなくても、ヘタすると文系でも、数ヶ月の即席訓練で「ハイ一丁上がり」と認定され、現場に送り込まれてしまうたぐいのものだからだ。Javaは優れた言語であり、楽しい思い出も沢山あるが、多くのJavaプログラマがプログラミングそのものに喜びを感じているか、と聞かれたら自信をもってハイとは答えられない、そんな気がする言語でもある。いう僕も、400行ほどのJavaプログラムを書くことで、晴れてIPAから天才プログラマーとして認定してもらうことができた。その称号自体はギャグとしてしか使えないが、研究費として一千万円近いお金を貰えたのは大きかった。それを返せと言われなかったことも。その時Javaを選んだ理由は特にない。別にどの言語で書いても良かったが、Javaプログラムが一番、カネになりそうに思えたのだ。当時は、別に間違っていなかった。そのとき書いたプログラムはその後、毎年数億円の売上げを生み出す技術となった。いまのバージョンでは、僕のコードも跡形も残っていないしJavaすら使っていないけど。いえ、まだまだJavaが強いのだ。Javaが強い、というのは、あと軽く10年くらいは、お仕事系言語の大本命として生き残るであろうということだ。ここでいう「お仕事系」というのは、ミスが許されないような分野のことだ。お金や人の生命が絡むような、ユニットテストがなにより大切なプログラム。銀行とか原子炉とかね。ま、けっこうミスってるけど。クライアントコンピューティングの世界では、JavaScriptがとにかく元気がいい。ネイティブアプリに近いところまで進出して来ている。Titaniumは、JavaScriptの良さをそのままネイティブアプリにもっていこうという試みだ。プログラム自体はJavaScriptでできるけど、アプリにしかできないようなこともJavaScriptからコントロールできるようになっている。これからしばらくはこういう形式が流行るだろう。PlayStation3のブラウザや一部のアプリケーションも、表層的なところはJavaScriptとHTML5で書いてあって、PS3独自の機能やエフェクトをJavaScriptから呼び出せるように拡張してあったりする。Unityはもっと過激で、本格的な3DゲームをまるごとJavaScriptで制御しようという試みだ。だいたいの部分はネイティブで作り込んであって、アルゴリズムのコアだけをJavaScriptで記述する方式で、AppStoreの上位に食い込むような傑作ゲームが沢山つくられている。Javaは、いまのままだと少々分が悪い。いま一番見込みがあるのはAndroidだ。これは、Javaの「キッチリしたプログラムを軽量に動かす」という特性を非常にうまく使ったアーキテクチャで、しかも独自のアプリケーション間通信を実装したりとかなり野心的なOSになっている。AndroidではJava以外の方法でネイティブアプリを作ることができないのでJavaが活躍する例と言えなくもないが、Android端末では当然JavaScriptも動くしFlashさえ動いてしまうので、Javaでクライアントアプリケーションを作り込む理由があまりない。ESを駆使した本格的なゲームなどではまだまだ出番があるだろうが、既に今年のCESなどではAndroidでWebGLを使ってJavaScriptでゲームをつくる、なんていうデモが出始めているからあと何年、Javaが防衛できるかは微妙だ。Javaは開発主体であったサン・マイクロシステムズがOracleに買収されてしまった、というのもなんだか据わりが悪い。サーバ技術としてJavaはなくてはならないものであるのは間違いないが、クライアントサイドで過去ほとんど成功したことのないOracleがサーバ用途以外のJavaをどうするつもりなのか見えにくいのは不安材料のひとつだ。クロスプラットフォームをウリにしていたJavaだが、iPhone、iPadなどのiOS上では全くカスリもしない。いや、あれの場合、むしろJavaScriptが動作することが奇跡なのだ、とも言える。サーバサイドに関しても、最近はnode.jsなど、サーバサイドプログラムをJavaScriptで書こうという動きが活発化しはじめてきている。これは僕も大賛成で、実は僕自身も2007年頃はRhinoを使ってJavaScriptサーバコンテナを作って遊んでいたりしたことがある。クライアントサイドでJavaScriptを使うなら、サーバサイドでも同じ言語を使う方が頭が混乱しなくていい。仮にnode.jsが成熟して来て、サーバサイドでもJavaScriptでいいや、ということになってしまったら、まさにJavaは軒を貸して母屋を乗っ取られた形になってしまうだろう。いえJavaがすぐになくなるとは考えられない。前述のようにJavaを教える学校、学部学科は数多くあるが、JavaScriptを教えるそれはほぼ皆無だ。それはJavaScriptが今まで軽視されてきたことや、そもそもJavaScriptを実用的に使うというのがどういうことなのかわからないまま人類はそのあまりに強大な力を持て余して来たということかもしれない。Javaでは数ヶ月の促成栽培でも言語仕様が厳格なため、新人が書いたコードが混じっても「なんとかなりそうな気がする(事前にバグなどを発見しやすい気がする)」が、JavaScriptではまだそのへんのノウハウが少ないため、下手な奴を仲間に入れると致命傷になりかねない(あまりに強力すぎるが故の問題とも言える)。どちらにせよ、「ブラウザの中でしか動かないのがJavaScriptで、どこでも動くのがJava」と一言では語り尽くせない状況ではあるので、これだけの歴史的背景があるというところをまとめてみた。