Javaの歴史

最近は夏ばて.疲れて早く寝てしまう.今日くらいは寝る前に書くか.

僕ら21世紀デビューなJavaエンジニアには,知らない過去の世界が結構あるらしい.らしいとは聞きつつ,またどんなものだったのかも少しは読んだりもしつつこれまでやってきたわけだけど,今回はまじめに考えてみた.

Javaが世に出てきたばっかりの頃はクライアントサーバの時代だった.どちらかというとクライアントサーバ後期って感じかな.それよりももっと前は,メインフレームの時代があり,UNIXによってオープン化が進んで,しまいにはWindowsによって個人用PCが普及して完全にC/Sになったわけだ.

このときC/Sであると同時にもう一つ大きな特徴があって,それはWindowsによってGUIが一般化したことかな.GUIの流れは1970年代のSmalltalkから始まるわけだけど,それから長い時間をかけて実現された.

C言語Unixを書き直すために作られた言語らしい.だからかなり低レベルのプログラミングが可能なわけ.それによってC言語自体の普及も起こるわけだけど,MacintoshOS/2WindowsといったUNIX以後のOSもC言語で実装されたものだから,C言語はかなりメジャーな開発プラットフォームになった.

なぜTCP/IPが普及したのかはまだ良く知らないけれど,TCP/IPの普及とC/S系の普及,C言語の普及には相関関係があるらしい.で,C/Sが普及し,Windowsが普及し,GUIが普及となるとVisualBasicあたりもかなり出てくる.

VisualBasicの普及によってC/S系システムは一つの終わりを迎えたんだと思う.前置きが長くなったけど,要するにJavaが出てくるちょっと前は,そうしたC/Sシステムの世界だったわけで.

で,Javaが新しく出てくるからには理由がある.Javaが発表されたのは1995年末.VisualBasicの普及には,当時,C/Sで実装した部門別システムとかがいっぱいあって,ちょっとした業務プロセスの変更とかにあわせて細かい変更がかなり頻繁に発生したような状態で,VBプログラマが各部門に居ると良いね,というような流れが影響している.VBプログラマを各部門に置けば対応可能だがしかしコストがーーーーという不満がそれでもあり,そこでJavaのコンセプトに注目が集まる.

最初出されたJavaのコンセプトは「Write Once, Run AnyWhere」.WindowsでもLinuxでも動きますよ〜というのではなくて,Windows3.0でも3.1でも95でもMacでも動きますよ〜というようなものだったのではと想像する.

アプレットとかその後のJava Web Startとか,今の僕らから見るとやたら「ネットワーク経由でバイナリが自動ダウンロードされて実行,配布の手間要らず」というのが強調されてる.最初のJava(JDK1.0とかJDK1.1)では,クライアントサーバ型でプラットフォーム非依存なシステムを作るという面が実はかなり見受けられる.オブジェクト指向とかは寧ろおまけなんじゃないかというようなイメージと想像.ただまあ,Smalltalkを見るように,OOはGUIと相性が良いようなので,JavaクライアントorJavaアプレットによるGUIとかを目指していたのなら,OOがJavaに取り入られるのは自然な流れ.

で,Javaが1995年末に発表されてかなり注目されたわけだけど,実際ふたを開けてみたら,かなりひどかったらしい.GUIを作るための主力APIがAWTで,このAWTがしょぼかった.当時のAWTはNativeメソッドがメインのAPIで(要するにOS関数ラッパー),なおかつプラットフォーム非依存を謳っていたものだから,どのOSにもあるような共通関数的なもののしか使えなかった.さらに,実際AWTで書いてみると,GUIの見た目がプラットフォームによって結構違ったとか.

また基盤となるJVMもまだいろんな意味で安定していなかった.○○なブラウザの△△なバージョンでのみ使ってください,みたいな制約が発生し,当初のコンセプトを全く実現できていなかった.Microsoftが独自仕様JVMを作ったりしてSunともめたのもこの頃.また,JVM自体の性能がまだかなり低く,アプレットのダウンロード時間とかもあいまって,ほんとひどかったみたい.

1996年末あたりにJDK1.1が出る.少しAPIが追加されたようだけれども,大勢には影響少なし.Javaへの幻滅がたぶんこの頃広がったのではと想像.

1998年気合を入れたSunがJava2を発表.SDK1.2ね.JavaとJava2の簡単な区別は,パッケージ名がjava.*なのかjavax.*なのかかな.まだこの頃もクライアントサーバにこだわっていたようで,SDK1.2にSwingというAWTの上位版を入れる.SwingはPureJavaなメソッドが中心のGUIAPIで,AWTよりもかなり「Write Once, Run AnyWhere」を実現.ただSwingはかなりマシンパワーを食うAPIで「遅い」という悪評もあり.

しかしここで注目なのは,このSDK1.2でEJBとかServletとかJSPが追加されたこと.JDK1.0とJDK1.1ではSunはあくまでサーバ側はクライアントプログラムからの処理を受け付けるもの程度にしか考えていなかったっぽいのだけど,実はSDK1.2でかなり今のWebアプリケーションを意識したAPIが追加されている.でもSwingが投入されているところからも分かるように,C/Sもまだ狙っている.

運良く1999年発売の日経バイトのJava特集号を入手できた.今読むとこれが結構面白い.実は1999年当時,既にサーバサイド主力のJavaなシステムの成功例がいくつも報告されている.それに対してクライアントサイドでのJavaは相変わらず苦戦中の雰囲気が読むと伝わってくる.にもかかわらず,同時の記事の著者は,あくまでJavaのメインターゲットはクライアントサイドだと書いてあったりする.サーバサードの成功例というのがSDK1.2ではなくて,JDK1.1を使って成功していたというのが今の僕には興味深いのだけれども.要するにJDK1.1レベルで既にそれまでの開発プラットフォームよりもサーバサイドへの適正を持っていたということかな.

恐らくこのあたりからSunはメインターゲットをサーバサイドにするべきだと気づいたのかなと思う.もしかしたらJDK1.1でのサーバサイド成功報告を受けて,SDK1.2を出す時点で既に迷っていたのかもしれない.その後は言わずもがなです.

2000年にJava2 SDK1.3がリリースされる.この時点でJ2SE+J2EE+J2MEと3つのブランドが出てくる.意外と最近ですな.基本セットのJ2SEは良いとして,サーバサイドで使うJ2EE,そして組込み系で限られたリソース環境でJavaを使うためのJ2SEのサブセットであるJ2MEが出てきたということ.組込み系の話は全く書かなかったけど,こっちはこっちで結構需要があったみたい.MDA/xUMLが組込み系でさっそく取り入られているように,プラットフォーム非依存性は組込み系だとかなり重要ポイントらしい.

こうしてみると,当初のもくろみは外れたものの,何とか普及できたJavaという感じ.誰が最初にJavaにサーバサード系APIの強化を行うべきと考えたのかが気になる.

Web+サーバサイドで考えると,C/Sよりはプラットフォーム非依存性は重要ではなくなってしまう.そうすると別にバーチャルマシンな言語でなくても良いじゃん,とか思うかもしれないのだけど,バーチャルマシンな言語である,という特性が実はバイトコードエンジニアリング技術を主体としたAOPの導入を容易にしているのでは,とかも考えられるので一概には言えない.

個人的には,よっぽどの政治的理由がない限り,アプリケーションの開発プラットフォームはJavaでこのまま決まりだと思っている.Javaプログラミング言語的には第三世代言語で,かつバーチャルマシンを使うタイプなわけだけど,ここから先に行くにはもう少し大きな技術的な変化が生じる場合だけだと思う.単純にJavaの次はAspectJ,いやC#だ,とかみたいなのは無い.

敢えて予想するなら,今のところMDA/xUML系かな.ユビキタス社会の浸透によって組み込み系+サーバサイドなシステムとかが主流になるなら,MDA/xUMLこそがTCOを最も削減する手段になる,とか思ったり.

(長っ!)