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言語としてはわずかに３回目となる，重要な新機能の導入を実現した。アンダースコア入りの数値リテラルや空のダイアモンド演算子のような，プログラムを書く上での苦労を軽減するシンプルな構文機能や，文字列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周年記念ページを用意して祝福している。