Java
Java(ジャバ、ジャヴァ)は、汎用プログラミング言語とソフトウェアプラットフォームの双方を指している総称ブランドである。オラクルおよびその関連会社の登録商標である。1996年にサン・マイクロシステムズによって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの版権もそちらに移行した。
プログラミング言語Javaは、C++に類似の構文、クラスベースのオブジェクト指向、マルチスレッド、ガーベジコレクション、コンポーネントベース、分散コンピューティングといった特徴を持ち、平易性重視のプログラム書式による堅牢性と、仮想マシン上での実行によるセキュリティ性およびプラットフォーム非依存性が理念とされている。Javaプラットフォームは、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、ビジネスサーバ、モバイル機器、組み込みシステム、スマートカードといった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術であるJava仮想マシンは各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている。このテクノロジは「write once, run anywhere」と標榜されていた。
2019年の時点でGitHubによると、Javaは特にクライアント/サーバモデルのWebアプリケーションで使用されている最も人気の高いプログラミング言語の1つであり、全世界でおよそ900万人の開発者がいるとレポートされている。最新バージョンは、2022年9月にリリースされたJava 19と、2018年9月にリリースされたJava 11の長期サポート(LTS)版、2014年3月にリリースされたJava 8のLTS版である。オラクルは未解決のセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールと新バージョンへの移行を強く推奨している。
現在の正規ベンダーであるオラクルの公式アピールは、以下の通りである。特に業務用システムの構築に最適であるとしている。
Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector.
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造・自動車・保険・公共部門などの多くの業界で使用されています。オラクルによると、全世界の3億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚のJava Cardが発行されている、と統計されている。
Javaの文法Javaプログラム構文は、C++によく似たものである。オブジェクト指向言語の一面が強調されがちだが、C言語のような手続き型言語としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。
Javaは、同時にマルチパラダイム言語でもある。JDK 1.1でJavaBeans/JavaRMI/CORBAによるコンポーネントプログラミングと、リフレクションAPIによるメタプログラミングが備えられた。J2SE 5.0でジェネリクス構文/APIによるジェネリックプログラミングが追加された。Java SE 7で並行APIによる並行プログラミングが追加された。Java SE 8ではラムダ式/関数型インターフェース/ストリームAPIなどによる関数型プログラミングが追加された。2014年(Java 8)以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。
オブジェクト指向プログラミングJavaは、クラスベースのオブジェクト指向である。クラス、インターフェース、インスタンスといった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスはカプセル化、継承、多態性をサポートしている。
カプセル化は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、privateは同クラス内限定、packageは同クラス内と同パッケージ内限定、protectedは同クラス内と同パッケージ内と派生クラス内限定、publicは制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位のpackageなので隠蔽性よりも利便性が重視されている。
継承は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスはObjectクラスをルートクラスとしてデフォルト継承する。Objectクラスにはロック機能が備えられており、これは並行プログラミングを前提にした仕様である。
多態性は、仮想関数、抽象クラス、インターフェース、動的ダウンキャストでサポートされている。スーパークラスのvirtualメソッドを、サブクラスの同名メソッドでオーバーライドできる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、サブタイピングになる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストはinstanceof演算子の実行時型チェックが可能で、ダウンキャスト失敗時は例外発生する。
Java仮想マシンプラットフォーム非依存とは、Javaプログラムが特定のハードウェアやオペレーティングシステムに依存せずに、あらゆる環境での共通動作を保証する概念である。"Write once, run anywhere"(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。
Javaコンパイラは、Javaソースコードを、Javaバイトコードという中間表現にコンパイルする。Javaバイトコードは、Java仮想マシン用の実行コードである。Javaバイトコードは通常、Javaクラスファイルにまとめられる。
Java仮想マシンは、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームにJava実行環境の中核としてインストールされる。
Java仮想マシンは、任意のJavaクラスファイルをJavaクラスローダーで読み込み、そのJavaバイトコードを解釈実行する。インタプリタ式の解釈走行と、実行時コンパイラで解釈走行させるものがある。
Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめてネイティブコードにコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界とバッファオーバーフローのチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。
マルチスレッドJavaプログラムは、複数以上のスレッドを同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これはクライアント・サーバシステムの実装向けである。また、多数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。
Javaのマルチスレッド並行計算は、クリティカルセクション同期が基準にされている。Javaの全インスタンスは、ロック機能を備えているObjectクラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaではsynchronizedで指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、ミューテックスのモニタである。synchronizedメソッドはその全体が排他セクションになり、そこではThisインスタンスがロックオブジェクトになる。synchronized静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、synchronized(指名変数)構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。
ミューテックスのモニタ以外の、カウントセマフォやバリアや読み書きロックなどのロック手法は、並行APIの方で用意されている。
Javaプログラムのメモリ管理は、Java仮想マシンのガベージコレクションによって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、メモリリークや不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。
ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。世代別ガベージコレクタ、応答時間短縮化のレイテンシ重視ガーベジコレクタ、休止時間短縮化のスループット重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。
Javaの分散コンピューティングプログラミングは、オブジェクト要求ブローカーに準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する分散システムの構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格のCORBAまたはJava独自規格のRMIが提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。
業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルはIIOP、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くはJakarta EEに属している。分散オブジェクトの中でサーバ機能に特化されたものはEJB (Enterprise JavaBeans) と呼ばれている。
EJBは、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、EJBコンテナに内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。JNDIは、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。
EJBコンテナは、WEBコンテナと連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナはサーブレットとJSP(Java Server Pages)を内包しているWEB用サーバアプリケーションであり、HTTPプロトコルを通して一般的なWEBブラウザとの同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。EJBコンテナではJBossやWebSphereなどが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。WEBコンテナではApache Tomcatが有名である。
分散ネットワークプログラミングを重視しているJavaは、サンドボックスモデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム(Javaバイトコード)による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは、Javaクラスファイルを遠隔ロードする機会が多いので、サンドボックス実行は必須になる。Javaのサンドボックスは、大抵は以下の手順になる。
クラスローダーは、バイトコードをダウンロードして順次クラス化する。
実行環境内のセキュリティポリシーファイルに従って、各種パーミッションが各クラスに付与される。セキュリティポリシーは主に、クラス名とそのパーミッションのペアで記述されている。
実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
その際は、スレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
遠隔ロードされたappletクラスなどのパーミッション皆無のクラスのメソッドを一度でも通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。
実際には上記に加えて、各クラスを役割やセキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
家電向けプロジェクトの立ち上げ(1990年12月)
Javaの歴史は、1990年12月にサン・マイクロシステムズ(サン)が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するための水面下プロジェクトをリサーチ段階を兼ねて試験的に立ち上げた事から始まる。サンはこの分野が今後の重要市場になると予測していた。サンのエンジニアであるジェームズ・ゴスリンやパトリック・ノートンらの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らはカリフォルニア州メンローパーク市サンドヒルロードに用意された比較的小さなオフィスで開発を始めた。
Oak言語とGreen OSの誕生(1991年)
グリーンチーム内では当時の主流であったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語であるC++に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の組み込みシステムであったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では移植性に対応できない点も指摘され、プラットフォーム非依存も重要な議題として提起された。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。
一方で、Mesa言語とC言語の長所を理想にしていたサンのエンジニアのビル・ジョイは、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーにFurtherという題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。これがJavaの前身である。
携帯端末、テレビ機器市場への参入と撤退(1992年 - 1994年5月)1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった携帯情報端末 (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。
1992年11月、サンはファーストパーソンという会社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソンは、ケーブルテレビ用セットトップボックス事業への参入を決めて、タイム・ワーナーと3DOにそれぞれOakテクノロジを提示した。しかし、その余りに高度な柔軟さが却って倦厭されてしまい契約実現には到らなかった。サン本社はファーストパーソンの解散を決め、グリーンチームも本社に戻された。
ワールドワイドウェブ参入(1994年6月~1994年9月)
1994年6月、サン技術部長ジョン・ゲージがジェームズ・ゴスリン、ビル・ジョイ、パトリック・ノートン、エリック・シュミットら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らはワールドワイドウェブをプロジェクトの本命に据える事で一致した。革新的なウェブブラウザである「NCSA Mosaic」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
Javaの始動(1994年10月~1996年1月)
1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「HotJava」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。
1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術がセールスポイントとしてアピールされた。同時にネットスケープが「Netscape Navigator」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
Javaプログラムでは全てのフィールドとメソッドがclass内に記述される。
Javaプログラムは静的メソッドpublic static void main (String[] args)から開始される。argsはプログラム開始時のコマンドライン・パラメータである。
System.outはSystemクラスの静的フィールドoutを意味する。outはPrintStream型のインスタンスである。out.println("文字列")はoutがprintlnメソッドを呼び出す。
Javaプラットフォーム (Java Platform) は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティー側からも提供されており、その標準化はJavaコミュニティプロセス (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大なITエコシステムを構築している。
2019年現在、Java権利元のオラクルは、対象環境に合わせたJavaプラットフォームの4つのエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。
Java Platform, Standard Edition (Java SE)
スマートフォンやタブレット端末を含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
サーバマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバ及び多層クライアントサーバ、業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
2017年9月にオラクルは今後のJava EEのバージョンアップがエクリプス財団によって行われる事を発表した。Java EEの商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった。
Java Platform, Micro Edition  (Java ME)
組み込みシステム、マイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。2019年3月ではSIMカードやATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。
Java実行環境 (Java Runtime Environment; JRE) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、Java.exeのスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
基礎ライブラリ - Java言語の基礎を扱う。
入出力ライブラリ - ファイル入出力など。
コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
数学ライブラリ - 各種計算を扱う。
国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
ネットワークライブラリ - ソケット通信を扱う。
GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
アプレットライブラリ - アプレット生成用。
Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
データベース接続ライブラリ - SQLを扱う。
リモートメソッドライブラリ - 分散オブジェクトを扱う。
セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。
Javaアプリケーション (application)