20年前の今日,Java言語の最初のアルファ版がSolarisオペレーティングシステム向けにリリースされた。“一度書けば,どこでも実行できる(Write Once, Run Anywhere)”を可能にする,新たな言語と仮想マシンの登場だ。1.0に到達したのは翌年の1996年だったが,5月23日のリリースで言語仕様の大幅な変更が始まると,すぐにTIOBEランキングのトップまで上昇し,以来(C/C++とともに)その位置に留まり続けている。
Javaは1991年,元々はC++の方言のひとつとしてスタートした。その後,Oakと呼ばれる新言語として,セットトップボックス内の組込みハードウェア上で動作する抽象仮想マシンを目指す,Greenプロジェクトの一部になった。当時のSun Microsystemにおいて,セットトップボックスは重要な戦略にはならなかったが,後にJavaは組込みハードウェアに戻ることになる。その成果は,早くも1992年にはPDA用のOSとして達成されたが,現実にJavaが名声を得ることになったのは,汎用言語としてコンピュータに移植されてからだ。商標上の要件によってOakは,Javaという名称に改められ,その時からコーヒーに掛けられた語呂合わせが始まっている。クラスファイル形式で使われているマジックナンバ“0xCAFEBABE
”などはその例だ。
1995年には最初Solaris用,翌月にWindows用のアルファ版がリリースされた。これらについては,次のような重要な事実を除くと,ほとんど注目を集めていなかった - 1995年5月のSun WorldカンファレンスでのHotJavaブラウザのリリースだ(Appletのサポートを含む)。この時Mark Andreessen氏は,NetScapeがJavaのライセンスを獲得し,NetScape Navigator 2.0の一部として組み込んでダウンロード提供すると発表している。これは1995年12月にリリースされた。JDKの初期アルファバージョンでは,当時はまだ行うことができなかった,初期のインターネットWebサイトにホスト可能な,クロスプラットフォームのアプレットの開発とテストが実現されていた。インタラクティブなページ(当時はDynamic HTMLあるいはDHTMLと呼ばれていた)を目的として,数日間のうちに開発されたLiveScriptが,このJavaの時流に乗るためにJavaScriptと改名されて,その名称が今でも使用されている。
Java 1.0は1996年1月に公式リリースされた。当初はバグが多かったが,その後リリースされたJava 1.0.2リリースは,Javaの歴史の中で重要なマイルストーンになった。その後間もなく,1997年2月にリリースされたJava 1.1では,JDBCによるデータベース接続が導入されている。インターネットのスコープ拡大やAppletによる使いやすさとも相まって,これからのエンタープライズ言語としてのJavaの評価を確立することになった。忘れてはならないのが,Java 1.1リリースで採用されたジャスト・イン・タイムコンパイラによる実行速度の向上だ。少し後のことになるが,これによって開発者は,Javaを‘インタプリタ言語’とは見なさないようになった。
1998年12月に登場したJava 1.2では,言語に対する最初の重要な変更セットとして,内部クラスが導入された。同時にJavaの変則的なバージョン番号も導入され,Java 2という別称の採用と,その後のJ2EE(遡ってJ2SE)という名称へと続いている。Java 1.2では,コアコンポーネントとしてSwingも導入されている。Java 1.1では com.sun.swing という名称下で,オプションダウンロードによって使用可能だったが,Java 1.2では新たに(‘core’ Javaライブラリと区別する目的で) javax パッケージのネームスペースが用意された。SwingはNetscapeとSunの協力によって開発され,当初は JFC(Java Foundation Class)と呼ばれていたものだ。Java 1.2からは,J2MEも生まれている。J2MEは,能力の低いデバイスや(ダム)携帯電話と,当時は機能が限られていたLCD画面や物理キーボードを対象とした,クロスプラットフォームなプログラム環境である。モバイルフォンへのJava導入は成功したが,プログラム環境のアップデートが不可能であったことや,フォンの機能(連絡先,赤外線ポートなど)と統合されていなかったことから,J2MEアプリケーションの用途は,広範囲なユーティリティというよりも,どちらかといえば単純なゲームが中心だった。(何年か後には,モバイルフォン上でJavaが人気を博するようになったのだが,それはJVMではなく,Android版の環境下でのものだ。)
Javaは,Hotspotで改善されたJVMをサポートしたJava 1.3(2000年5月リリース),JavaWebStartを備えたJava 1.4(2002年2月リリース)によって,その後も前進を続けた。しかしながら,言語に対する重要な変更としては,ジェネリックスを導入したJava 1.5(2004年9月リリース)まで待たなくてはならなかった。ジェネリックスは,ListやMapのようなコンテナクラスで,格納するオブジェクトの種類を指定可能にするものだ。ただし,それまでのバージョンとの下位互換性を確保する目的で,型の情報はコンパイル時に削除されていたため,ランタイムで使用することはできなかった。後に現れたC#などの言語は,この失敗に学び,型情報をランタイムでも保持するようにしている。
Java 1.6(2006年12月リリース,Java 6とも呼ばれる)では,言語には重要な変更は行われなかったが,悪い方向へのターニングポイントとなった。Java 1.6以降がリリースされて以降,Sun Microsystemの長期に渡る経営難と,最終的なOracleによる買収によって,新バージョンのリリースが大幅に遅れることになったのだ。この間,定期的にリリースされたセキュリティパッチを除き,外部に向けての作業はすべてストップした。
Java 7(2011年7月リリース)でOracleは,Javaを再び蘇らせるという自らの約束を守り,Java言語としてはわずかに3回目となる,重要な新機能の導入を実現した。アンダースコア入りの数値リテラルや空のダイアモンド演算子のような,プログラムを書く上での苦労を軽減するシンプルな構文機能や,文字列switch文やtry-with-resoucesなど,小さいながらもコードの冗長性低減に有効な拡張が行われている。Java 7ではまた,バイトコードが開発されてから始めてとなる,新しいバイトコードオペレータのinvokedynamicが導入されたが,Java言語ではあまり使用されることはなかった。
Java 8(2014年5月リリース)では,ラムダ式のサポート,大幅に強化された日付および時刻API,ガベージコレクションのパフォーマンス向上,permgen領域の廃止といった重要な新機能が実現されている。
次期リリース9 (2016年9月予定)では,パフォーマンスおよびサイズ改善のため,ランタイムにさらなる変更が加えられる。現在もTIOBEインデックスをリードしているJavaが,今後も長く実用的な言語として用いられていくのは間違いない。
Javaが当初照準としていた組込みハードウェアの目標については,セットトップボックスやPDAは結果的に成功しなかったものの,JVMおよびJava言語はすべてのモバイルSIMカードに組み込まれて,90億以上のデバイス上でJavaCardを実行している。さらにJavaはすべてのブルーレイプレーヤでも稼働して,その網を広げている。
Oracleは,Javaの20年の歴史を紹介するサイトとJava20周年記念ページを用意して祝福している。