削除された内容 追加された内容
出典のない記述をリバート。
編集の要約なし
27行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、狭義では多目的多用途に扱われる[[プログラミング言語]]としてであり、そ開発環境([[Java Development Kit|JDK]]など)と実行環境([[Java Runtime Environment|JRE]]など)を指し、広義ではす[[Java言語によるコンピュプラットフォティングム|プラットフォーム]]意味内にまれている<ref>[https://www.java.com/en/download/faq/whatis_java.xml What is Java and why do I need it?]</ref>。[[Javaプラットフォーム]]これらJava言語仕様だけでなく、[[Javaラスライブラリ]]や[[Java仮想マシン]]、[[Java SE]]や[[Java EE]]ノロジ」いった[[Application Programming Interface|API]]セット、総称らには開発環境である[[Java Development Kit|JDK]]や実行環境である[[Java Runtime Environment|JRE]]などを指すこともある。場合によっは公式以外のサードパーティ製の実装を含めたエコシステム全体を指すこともある。言語機能として仕様''[[C++言語]]の構文''をベースにしており、[[オブジェクト指向]][[プログラミ並行コンピューティングパラダイム|パラダイム]]、[[ガベージコレクション]]による|自動メモリ管理]]などが主な[[プログラミングパラダイム|パラダイム]]として導入されている。Javaテクノロジの主眼は、従来のソフトウェアが抱えていた[[移植性]]問題の解決を目標とし、ハードウェア環境に依存せず、らゆる[[プラットフォーム (コンピューティング)|プラットフォーム]]上で動かせるプログラムの開発・実行環境の実現を目指して開発された。''"[[Write once, run anywhere]]"''(一度書けばどこでも動く)がそのキャッチコピーだっにし、ハードウェア環境に依存しない理想的な[[クロスプラットフォーム]]・プログラムの実現を目指して誕生した。
 
Javaプログラムは特別な[[Javaバイトコード|バイトコード]]と呼ばれる中間言語([[中間表現]])にコンパイラ|コンパイル]]されて、これが[[Java仮想マシン]]と呼ばれるソフトウェア上で実行される。各[[プラットフォーム (コンピューティング)|プラットフォーム]]に対応したJava仮想マシンがハードウェア間の差異を吸収し、環境に依存しないプログラム動作を実現する仕組みとなっている。Java登場初期の対象であった家電機器の[[組み込みシステム]]を始め、から[[パーソナルコンピュータ|パソコン]]、[[モバイル端末]]、[[サーバー (コンピューター)|サーバーマシン]]までさまざ[[スーパーコンピュータ|スパコン]]での様々な環境にJavaソフトウェアは普及し、動作速度と信頼性の面では高い評価を得たが、元々の眼目であったプラットフォーム非依存性に関しては未だに課題が残されている。
 
Javaは、1995年に[[サン・マイクロシステムズ]]社のソフトウェア技術者[[ジェームズ・ゴスリン]]によって開発された。2010年にサン社は[[オラクル (企業)|オラクル]]社に吸収合併され、Javaの著作権もそちらに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年1月現在の最新メジャーバージョンは、2018年9月25日に公開された第11版となっている。
== 概説 ==
Javaは当初、それ以前の多様な言語の際立った特徴を引き継ぎ、[[プログラマ]]の使い勝手と動作速度のバランスを考えて設計された。主には下記のような特徴を持つ。
*構文は[[C言語]]および[[C++]]ユーザーの学習コストを減らすため、意図的に[[C++]]に似せているが、メモリ管理は完全に自動化されており、[[デバッグ]]を難しくする低水準なメモリアクセスは行えないようにしている。
*[[オブジェクト指向プログラミング]]をサポートしている。[[オブジェクト (プログラミング)|オブジェクト]]モデルは{{要検証範囲|date=2019年2月|[[Smalltalk]]や[[Objective-C]]と同様の}}簡潔なものを採用している。
*実行環境の構成は{{要検証範囲|date=2019年2月|[[Smalltalk]]に似せている}}。[[ソースコード]]は機械語にコンパイルされるのではなく、中間言語 ([[Javaバイトコード]]) にコンパイルされ、[[仮想マシン]] ([[Java仮想マシン]]) の上で動作する。これにより、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない[[アプリケーションソフトウェア]]を開発できる。
 
== 特徴 ==
Javaは[[組み込みシステム]]や[[携帯機器]]([[携帯電話]]・[[PHS]]や[[携帯情報端末|PDA]]・[[スマートフォン]]等)のシステムから、企業の[[情報システム]]を担う大規模な[[データベース]]、[[サーバ]]、[[スーパーコンピュータ]]まで、多くの分野で使用されている。[[1995年]]のリリース時は他に似たような言語が無く、鳴り物入りで登場した。[[仮想機械|仮想マシン]]に基盤を置いたため、歴史の初期には動作速度や信頼性などの面で懐疑的な評価が行われることが多かったが、長年の実績の積み上げにより使い勝手の良さが広く認知され、基幹系や業務系のシステム開発では特に重宝されるようになっている。
=== Javaの理念 ===
Javaは以下の5つの理念に基づいて開発された<ref>"1.2 Design Goals of the Java™ Programming Language". Oracle. January 1, 1999. Archived from the original on January 23, 2013. Retrieved January 14, 2013.</ref>。
 
# 言語仕様はシンプルで、オブジェクト指向で、見慣れたものにする(''simple, object-oriented, and familiar'')
== 概要 ==
# 堅牢性(エラー動作の抑止)と安全性(不正アクセスの防止)を重視する(''robust and secure'')
[[プログラミング言語]]Javaおよび[[Javaプラットフォーム]]は、[[1990年代]]前半当時、[[サン・マイクロシステムズ]]に在籍していた[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]を始めとする人々によって設計・開発され、1995年にリリースされた。その後2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの著作権および管理もオラクルに移行した。Javaに対する追加提案などは、サン時代から続いている[[Java Community Process]] (JCP) というプロセスによって進められる。
# 特定のプラットフォームに依存せず、また移植を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''executing with high performance'')
# インタプリタ(仮想マシン)式で、マルチスレッドで、コードを動的に再解釈できる(''interpreted, threaded, and dynamic'')
 
=== オブジェクト指向プログラミング ===
Javaに関わる呼称とその意味内容は、[[コンテクスト|文脈]]に応じていくつか使い分けられている。サン・マイクロシステムズは、「Javaテクノロジ」(Java技術、Java technology)という呼称を使い、一方でJavaのさまざまな技術の形容詞として「Java」の呼称を使ってきた。<!--多くの[[プログラマ]]は、[[プログラミング言語]]の意味で「Java」の呼称を使っている。--><!-- ← 根拠不明。 -->Javaの実行環境は、Java実行環境 ([[Java Runtime Environment]]; JRE) と呼ばれる。Javaの基本的な開発環境は、Java開発キット ([[Java Development Kit]]; JDK) と呼ばれる。
Javaは[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である。[[オブジェクト指向]]とは、現実世界をモデル化する手法のひとつであり、データ(状態)とそれに関連する振る舞い(処理)をまとめて[[オブジェクト (プログラミング)|オブジェクト]](物体)として扱う。
 
Javaのプログラム複数の[[クラス (コンピュタ)|クラス]]から構成される。[[オブジェクト指向プログラミング言語]]におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[#オブジェクト指向 (プログラミング)|オブジェクト]]はインスタンスと呼ばれる[[C++]]類似のクラス構文をベースとしつつ、機は再利用可を絞って簡素かつ明快言語仕様ソフトウェア部品の単位としてよく使われる。Javaのクラスは[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[ポリモーフィズム]]をサポートする。
 
Javaでは、クラスに定義する状態を「[[フィールド (計算機科学)|フィールド]]」([[インスタンス変数]])と呼び、振る舞いを「[[メソッド (計算機科学)|メソッド]]」と呼ぶ。それぞれ、[[C++]]で「メンバー変数」「メンバー関数」と呼ばれているものに相当する。なおJavaのオブジェクト指向は、[[Smalltalk]]に代表されるような[[メッセージパッシング]]によるオブジェクト指向ではなく、C++に代表されるようなクラス機構を中心としたオブジェクト指向である。後者は、限られた計算機資源でもオブジェクト指向を実現できるというメリットがある。
Javaは[[例外処理]]機構を備えており、[[プログラム (コンピュータ)|プログラム]]実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述できる。
 
[[継承 (プログラミング)|継承]]とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。継承は拡張とも呼ばれ、Javaのクラス構文では継承の際に<code>extends</code>キーワードが使われる。Javaのクラスはすべて、暗黙的に基底クラス{{Javadoc:SE|name=java.lang.Object|java/lang|Object}}から派生する。また、C++のような実装の[[多重継承]]はサポートせず、単一継承のみをサポートする。ただし、クラスは複数の[[インタフェース (抽象型)|インタフェース]]を実装 (<code>implements</code>) することができる。Javaのインタフェースは、C++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である。ただし、Java 8以降はインタフェースのデフォルト実装により、実装の多重継承も限定的にサポートするようになった。なお、実装の多重継承をサポートしないという設計思想は、[[C Sharp|C#]]でも採用されている。
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ ([[主記憶装置]]) を管理する負担を軽減する。プリミティブ型を除き、あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。C/C++では、ヒープ領域に動的に確保・生成したデータやオブジェクトについては、もはや必要が無くなったときに破棄する指示をプログラマが自分で責任をもって行わなければならないが、これはプログラマにとって負担が大きく複雑で間違いやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能によって、動的に生成したオブジェクトの破棄が自動化されるため、プログラマの負担は大きく軽減される。
 
Javaで扱うデータ / オブジェクトの型([[データ型]])は、強い[[静的型付け]]を採用している。静的型付けにより、Javaの[[コンパイラ]]および実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
 
Javaのデータ型には、大別して[[参照 (情報工学)|参照]]型 (reference type) と[[プリミティブ型]](原始型、primitive type)の2種類がある。Javaのオブジェクトはすべて参照型である。一方、Javaのプリミティブ型はオブジェクトではなく、単純な構造のデータ(数値、論理値、文字など)を扱うための型である。[[Javaクラスライブラリ|Javaの標準ライブラリ]]は、[[ボックス化]]によりプリミティブ型の値をオブジェクトとして扱えるようにするための[[プリミティブラッパークラス]]を提供している。
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし、またバージョン間の[[互換性]]に注意して開発が進められている。Javaプラットフォーム自体への依存を除き、オペレーティングシステムなどのプラットフォームには依存しない[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはオペレーティングシステムやプロセッサ ([[CPU]]) アーキテクチャに依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、中間言語([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された([[pコードマシン]]など、過去にもあったものだが、{{要出典範囲|date=2017年10月|なぜか新しいものであるかのように宣伝される}})。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。
 
* Java 1.5 (J2SE 5.0) 以降は、コンパイラが自動的にプリミティブ型のデータとそれに対応する参照型([[プリミティブラッパークラス]])のオブジェクトとの間の変換を行う。これを自動ボックス化/自動ボックス化解除([[オートボクシング]]/オートアンボクシング)と呼ぶ。これにより、プリミティブ型と対応する参照型の2種類のデータ型が存在することによる複雑さや煩雑さは軽減されているが、性能面での変化はない。
プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
* Java 1.5以降は、[[総称型]]による[[ジェネリックプログラミング]]をサポートするようになった。これにより、プログラマによる明示的な[[型変換]]を減らすことができ、安全性が向上した。
 
なお、Javaは純粋なオブジェクト指向言語ではなく、オブジェクト指向を強制しない<ref>[https://www.ibm.com/developerworks/jp/java/tutorials/j-introtojava1/index.html Javaプログラミング入門, 第 1 回: Java 言語の基本]</ref>。すべてのデータおよび処理は何らかのクラスに属していなければならないという制約はあるが、静的フィールド、静的メソッド、静的インポートなどを使うことで、必要に応じて手続き型プログラミングのスタイルをとることも可能であり、オブジェクト指向プログラミングのスタイルを採用するかどうかはプログラマの裁量にゆだねられている。
 
=== プラットフォーム非依存 ===
[[ファイル:GC SwingDemo.jpg|thumb|250px|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
<!--
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存していないことであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
Javaのプラットフォーム非依存性は、次のようにして実現されている。
 
* ほとんどのJavaの[[コンパイラ]]([[Javaコンパイラ]])は、Javaの[[ソースコード]]を中間言語([[中間表現]])に[[コンパイル]]する。このJavaの中間言語のコードを[[バイトコード]]という。バイトコードは[[Java仮想マシン]](Java VM、[[仮想機械|仮想マシン]]の一種)で実行可能な簡潔な[[機械語]]命令からなる。
* Javaプログラムを実行する際には、このバイトコードをJava仮想マシン上で実行する。Java仮想マシンは、実行するハードウェアにネイティブなソフトウェアであり、中間言語であるバイトコードを解釈して実行する。
* Java実行環境は、Java仮想マシンの他に、標準[[ライブラリ]]を備えている。この標準ライブラリを利用することにより、Javaプログラムは、グラフィクス、[[スレッド (コンピュータ)|スレッド]]、[[コンピュータネットワーク|ネットワーク]] など実行するマシンのさまざまな機能を、プラットフォームに依存しない単一の方法で使うことができるようになる。プラットフォームごとに異なる方法を使い分ける必要は無い。
* Javaのバイトコードの実行時には、Java仮想マシンにより、最終的にはハードウェアにネイティブな[[機械語]]コードに変換されて実行される。このバイトコードから機械語コードへの変換は、Java仮想マシンが[[インタプリタ]]として行う場合と、Java仮想マシンが[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]を使って行う場合とがある。
 
また、実際には[[Javaコンパイラ]]の[[実装]]として、[[ソースコード]]から直接にプラットフォームのハードウェアにネイティブな[[オブジェクトファイル|オブジェクトコード]]([[機械語]]コード)を生成するものがある。このようなJavaコンパイラの実装としては[[GNUプロジェクト]]の[[GNU Compiler for Java]] (GCJ) などがある。この場合、バイトコードを生成するという段階は省かれる。しかしこの方法で生成されるJavaの実行コードは、コンパイル時に指定したプラットフォームでしか動かない。
 
Javaの実行コード([[バイトコード]])を生成する手段としては、[[プログラミング言語]]Javaでプログラムを書くことが標準的な方法である。Javaのバイトコードの実行は、[[Java仮想マシン]]という[[仮想機械|仮想マシン]]の環境上で行われる。Java仮想マシンは実行時にバイトコードをネイティブコードに変換する。なお、Javaのバイトコードを生成する他の手段としては、[[Ruby]]([[JRuby]])、[[Python]]([[Jython]])、[[Groovy]]、[[Scala]]、[[Kotlin]]、[[Ceylon]]、<!--[http://www.jabaco.org Jabaco]--><!-- Jabacoは2009年で更新が止まっており、ここで列挙するにはマイナーすぎる存在のためコメントアウト。 -->などのプログラミング言語でプログラムを書く方法もある。
 
[[サン・マイクロシステムズ]]のJavaのライセンスは、すべてのJava実行環境の実装は「[[互換性]]」を備えるべきであることを要求していた。このことに関連して、[[サン・マイクロシステムズ]]と[[マイクロソフト]]との間で法的な争いが起こったことがあった。この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。
*[[Java Remote Method Invocation|RMI]]と[[Java Native Interface|JNI]]の機能が無い。
*マイクロソフトのプラットフォーム ([[Microsoft Windows|Windows]]) に特有の機能を備えている。
サンは訴訟を起こして勝訴し、約2000万ドルの違約金の支払いを受けた。また裁判所は、マイクロソフトに対してサンのライセンス条件に従うことを命じた。この決定を受けて、マイクロソフトは自社のOSであるWindowsにJava実行環境を同梱しない方針を採った。また{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsでは自社の[[ウェブブラウザ]]である[[Internet Explorer]]でJavaをサポートしないようにした。その結果、Internet Explorerで[[Javaアプレット]]を動かすためには、別途に[[プラグイン]]が必要となった。しかし、サンなどの企業は、{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどのWindows PCのユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。
 
最初期の[[Java Runtime Environment|Java実行環境]]の実装では、Javaプログラムの実行速度が遅かったが、{{いつ範囲|date=2019年2月|近年}}では大きく改善されて、高速に実行できるようになった。最初期のJava実行環境の[[Java仮想マシン]]の実装は、[[移植性]]を実現するために[[インタプリタ]]として動作する[[仮想機械|仮想マシン]]を採用した。こうした初期のJava実行環境の実装では、Javaプログラムの実行速度が[[C言語|C]]や[[C++]]のプログラムと比べて遅かった。そのため、Javaプログラムの実行速度は遅いという評判が広まった。{{いつ範囲|date=2019年2月|近年}}のJava実行環境の実装では、いくつかの技術を導入することにより、{{いつ範囲|date=2019年2月|以前}}と比べて、Javaプログラムをかなり高速に実行できるようになった。
 
Javaプログラムを高速に実行するために使われる技術を説明する。
*Java仮想マシンに高速化の技術を導入する。
**Java仮想マシンに[[ジャストインタイムコンパイル方式]](JITコンパイル方式)を導入する。ジャストインタイムコンパイラは、Javaプログラム(バイトコード)の実行時に、バイトコードをネイティブコードに変換する。
**さらに洗練されたJava仮想マシンでは「動的再コンパイル」(dynamic recompilation) を行う。こうしたJava仮想マシンでは、実行中のプログラムを分析して、プログラムの重要な部分を特定して再コンパイルを行い[[最適化 (情報工学)|最適化]]する。動的再コンパイルは、静的コンパイルよりも優れた最適化を行うことができる。その理由は、動的再コンパイルは、実行環境と実行中にロードされている[[クラス (コンピュータ)|クラス]]に関する情報に基づいて最適化しているからである。
**Java仮想マシンに[[世代別ガベージコレクション]]の技術を導入して[[ガベージコレクション]]を効率化する。
*あるいは、先に述べたように、Javaのソースコードを、従来の言語のコンパイラと同様に、単純にネイティブな機械語コードにコンパイルする。この場合、バイトコードを生成する過程は全く省かれる。この技術を使うと、良好な実行速度を得ることができる。ただし[[移植性]](プラットフォーム非依存)は損なわれる。Java仮想マシンにジャストインタイムコンパイルと動的再コンパイル、世代別ガベージコレクションの技術を導入することにより、Javaプログラムは、移植性を保ちつつ、ネイティブコードと同水準で高速に実行することができるようになった。
 
Java の[[移植性]]([[プラットフォーム (コンピューティング)|プラットフォーム]]非依存性)がどの程度実現できているかについては、議論の対象となっている。技術的には、移植性とは実現が難しい目標である。多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは、可能である。{{要出典範囲|date=2019年2月|しかし実際には、Javaを利用できるプラットフォームによってはちょっとしたエラーが発生したり、微妙に異なる動作をしたりする事例が多い。こうしたことから一部の人々は、[[サン・マイクロシステムズ]]のJavaの売り文句であった ''"[[Write once, run anywhere]]"''(一度コードを書けば、どの環境でも動く)をもじって ''"Write once, debug everywhere"''(一度コードを書けば、どの環境でもデバッグが必要)と皮肉をいわれることがある。}}<!-- WARN: Java仕様の不備だったのか、それとも各プラットフォームにおけるJava実装に問題があったのか、それが論じられていないので意味がない。仕様に適合しない処理系や実行環境であれば、プログラムの動作互換性が保証できないのはどの言語でも同じ。 -->
 
しかし、Javaのプラットフォーム非依存性は、[[サーバ]]側や[[組み込みシステム]]のアプリケーションに関しては成功を収めている。サーバ側 ([[Java Platform, Enterprise Edition|Java EE]]) では、Java の[[Java Servlet|サーブレット]]、[[Webサービス]]、[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 ([[Java Platform, Micro Edition|Java ME]]) を使った[[OSGi]]を基にした開発が広く行われている。
 
=== マルチスレッド ===
Javaでは[[スレッド (コンピュータ)|スレッド]]を言語仕様で規定しており、[[マルチスレッド]]による[[並行計算]]や[[マルチコア]]CPUを活かした[[並列計算]]を、従来の言語と比べて簡単に実装できる。
 
=== ガベージコレクション ===
Javaでは充実した[[Javaクラスライブラリ|標準クラスライブラリ]]により、[[コンピュータネットワーク]]を活用するソフトウェアを、効率良く開発できる。Javaはその初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] のライブラリを備えていた。分散オブジェクト環境 ([[Java Remote Method Invocation|Java RMI]], [[Common Object Request Broker Architecture|CORBA]]) のソフトウェアの開発も早い時期からできるようになっていた。{{いつ範囲|date=2017年10月|近年}}では、さまざまな[[ネットワークプロトコル]]の高水準なライブラリが使えるようになっている。[[W3C]]により標準化された、汎用[[マークアップ言語]]のひとつである[[Extensible Markup Language|XML]]で記述された文書を扱うライブラリも早期に実装・標準サポートされた。{{いつ範囲|date=2017年10月|近年}}では、XMLプロセサと[[XSL Transformations|XSLT]]プロセサがJava標準ライブラリに統合され提供されている。充実したネットワーク機能とXML文書を扱う機能を有効に組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。
Javaは[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
ガベージコレクションを備えていない[[C++]]やその他の言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]をするプログラマは一般に、Javaと同様メモリ内の[[ヒープ領域|ヒープ]]に[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合に、必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不十分なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、不適切な指示などで、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことで、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
Javaは[[コンピュータセキュリティ|セキュリティ]]を考慮して設計されており、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる([[Javaアプレット]])。
 
ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。プログラマは任意の時点で[[オブジェクト (プログラミング)|オブジェクト]]を生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任を持つ。
また、[[名前空間]]の機構をもつ言語であり、ライブラリおよびアプリケーションに含まれる多数の Java のプログラム(クラスとインタフェース)は、[[パッケージ (Java)|パッケージ]]という階層構造で管理できる。
 
プログラム(オブジェクト)は、他のオブジェクトへの[[参照 (情報工学)|参照]]を持ち、そのオブジェクトの[[メソッド (計算機科学)|メソッド]]を呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内の[[ヒープ領域|ヒープ]]という領域上に確保されたそのオブジェクトを指すアドレスのことである。
[[Javaに対する批判]]も少なくない。いくつかの批判に対しては、サン(後にはオラクル)やJCPに参加する人々の努力により、Javaの改良が行われている。一方で{{いつ範囲|date=2017年10月|現在}}、{{要出典範囲|date=2017年10月|多くのソフトウェア開発者は、Javaについて、広く使われている言語としては優れた言語の一つと評価している}}。
 
オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリ量が減っていく[[メモリリーク]]を防ぐ。
[[JavaScript]] ([[ECMAScript]]) は、Javaにちなんで命名されたスクリプト言語である。とはいえ基本構文の一部がJavaやC系言語に似ているだけであり、またクラスベースではなく[[プロトタイプベース]]のオブジェクト指向言語であるため、言語仕様的な共通点は少ない。
 
ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。[[プログラマ]]が、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。
 
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装された[[Java仮想マシン]]を使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。
 
C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
 
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
 
=== ネットワーク機能 ===
Javaでは充実した[[ライブラリ]]により、[[コンピュータネットワーク]]を使うソフトウェアを、効率良く開発できる。Javaの初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] ([[IPv4]]) のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになった。[[Java Remote Method Invocation|Java RMI]]もしくは[[Common Object Request Broker Architecture|CORBA]]の分散オブジェクト技術を標準で使うことができる。{{いつ範囲|date=2019年2月|近年}}では、標準、拡張その他のライブラリにより、さまざまな[[通信プロトコル|ネットワークプロトコル]]を高水準で扱えるようになっている。
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
*[[Simple Mail Transfer Protocol|SMTP]]/[[Post Office Protocol|POP]]/[[Internet Message Access Protocol|IMAP]]、[[Network News Transfer Protocol|NNTP]]([[電子メール]]送受信、[[ネットニュース]])
*[[Secure Shell|SSH]]、[[Transport Layer Security|TLS/SSL]](セキュアな通信により盗聴やなりすましを防ぐ)
*[[Server Message Block|SMB]]([[ファイルサーバ]]へのアクセス)
*ほか
{{いつ範囲|date=2019年2月|現在}}では[[IPv6]]も扱えるようになりつつある。
 
[[Extensible Markup Language|XML]]文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。
 
=== セキュリティ ===
Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード([[Javaアプレット]])を安全に実行できるよう設計されていた。
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
*Java実行環境のセキュリティマネージャ機能([[サンドボックス (セキュリティ)|サンドボックス]])により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
*Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。
 
=== その他 ===
Javaは「[[例外処理]]」の言語仕様を備えており、[[プログラム (コンピュータ)|プログラム]]実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述できる。
 
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
 
Javaは「[[パッケージ (Java)|パッケージ(''package'')]]」という[[名前空間]]を持つ。これはクラスとインターフェースを文字列レベルで分類し、またクラス名定義の衝突を回避する為の機能である。パッケージ名は任意の数だけカンマで繋ぐ事が出来る。実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際は、先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、パッケージ内のクラスをデフォルト指定出来るので短いコード記述が可能となる。
表記は"J"のみが大文字の「Java」が正しい。「JAVA」は正式な表記ではない<ref>きしだなおき 「創るJava[改訂第2版] NetBeansでつくって学ぶ Java GUI & Webアプリケーション」 毎日コミュニケーションズ、26頁。</ref>。
 
== 歴史 ==
289 ⟶ 364行目:
* [[Webサービス]]
 
====='''Java SE 6 Update 10====='''
 
Java SE 6 Update 10が[[2008年]]10月22日にリリースされた。Update 8と9が省略され、7の次が10となった。Javaの動作速度が改善され、アプリケーションやアプレットの起動を高速化するJava Quick Starterが搭載され、Javaのインストールを高速化する、Java Kernelが搭載された<ref>[http://internet.watch.impress.co.jp/cda/news/2008/10/22/21274.html 「Java SE 6 Update 10」公開、動作速度を高速化]</ref>。[[Javaアプレット]]や[[Java Web Start]]の起動を容易にするための、配備ツールキットが公開された[http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/jweb/deployment_advice.html]。
 
333 ⟶ 409行目:
JSR 384<ref>[http://jcp.org/en/jsr/detail?id=384 JSR 384: JavaTM SE 11 (18.9)]</ref> にて仕様が規定され、[[2018年]]9月25日にリリースされた。[[オラクル (企業)|オラクル]]によるビルドはOracle JDKと[[OpenJDK]]の二種類が提供され、Oracle JDKの商用利用は有償サポート契約を結んだ顧客のみとなっている。なおリリースモデル変更後の初LTSリリースとなるが、[[オラクル (企業)|オラクル]]による長期サポートはOracle JDKを対象にしたものであり、[[オラクル (企業)|オラクル]]による[[OpenJDK]]の提供がJava SE 12リリース以降も行われるかは、2018年10月時点で未定である。
 
== 特徴Java言語の構文 ==
Javaの主な特徴を述べる。
 
=== 思想 ===
Javaを開発する上では、5つの目標があった。
 
* [[オブジェクト指向プログラミング]]の方法論を採用する
* 異なるOS上で同一の[[プログラム (コンピュータ)|プログラム]]が動くようにする
* [[コンピュータネットワーク]]を扱う機能を標準で備える
* 遠隔のコンピュータ上にある実行コードを安全に実行できるよう設計する
* 開発をしやすくするために、従来の[[Smalltalk]]、[[C++]]などの[[オブジェクト指向プログラミング言語]]から良い部分を引き継ぐ
 
ネットワーク機能および遠隔コンピュータの実行コードの実行を実現するために、場合によっては、Java[[プログラマ]]は、[[Common Object Request Broker Architecture|CORBA]]やInternet Communications Engine、[[OSGi]]のような拡張機能を使う。
 
=== オブジェクト指向プログラミング ===
Javaは[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である。[[オブジェクト指向]]とは、現実世界をモデル化する手法のひとつであり、データ(状態)とそれに関連する振る舞い(処理)をまとめて[[オブジェクト (プログラミング)|オブジェクト]](物体)として扱う。
 
Javaのプログラムは複数の[[クラス (コンピュータ)|クラス]]から構成される。[[オブジェクト指向]]におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[オブジェクト (プログラミング)|オブジェクト]]はインスタンスと呼ばれる。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスは[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[ポリモーフィズム]]をサポートする。
 
Javaでは、クラスに定義する状態を「[[フィールド (計算機科学)|フィールド]]」([[インスタンス変数]])と呼び、振る舞いを「[[メソッド (計算機科学)|メソッド]]」と呼ぶ。それぞれ、[[C++]]で「メンバー変数」「メンバー関数」と呼ばれているものに相当する。なおJavaのオブジェクト指向は、[[Smalltalk]]に代表されるような[[メッセージパッシング]]によるオブジェクト指向ではなく、C++に代表されるようなクラス機構を中心としたオブジェクト指向である。後者は、限られた計算機資源でもオブジェクト指向を実現できるというメリットがある。
 
[[継承 (プログラミング)|継承]]とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。継承は拡張とも呼ばれ、Javaのクラス構文では継承の際に<code>extends</code>キーワードが使われる。Javaのクラスはすべて、暗黙的に基底クラス{{Javadoc:SE|name=java.lang.Object|java/lang|Object}}から派生する。また、C++のような実装の[[多重継承]]はサポートせず、単一継承のみをサポートする。ただし、クラスは複数の[[インタフェース (抽象型)|インタフェース]]を実装 (<code>implements</code>) することができる。Javaのインタフェースは、C++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である。ただし、Java 8以降はインタフェースのデフォルト実装により、実装の多重継承も限定的にサポートするようになった。なお、実装の多重継承をサポートしないという設計思想は、[[C Sharp|C#]]でも採用されている。
 
Javaで扱うデータ / オブジェクトの型([[データ型]])は、強い[[静的型付け]]を採用している。静的型付けにより、Javaの[[コンパイラ]]および実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。
 
Javaのデータ型には、大別して[[参照 (情報工学)|参照]]型 (reference type) と[[プリミティブ型]](原始型、primitive type)の2種類がある。Javaのオブジェクトはすべて参照型である。一方、Javaのプリミティブ型はオブジェクトではなく、単純な構造のデータ(数値、論理値、文字など)を扱うための型である。[[Javaクラスライブラリ|Javaの標準ライブラリ]]は、[[ボックス化]]によりプリミティブ型の値をオブジェクトとして扱えるようにするための[[プリミティブラッパークラス]]を提供している。
 
* Java 1.5 (J2SE 5.0) 以降は、コンパイラが自動的にプリミティブ型のデータとそれに対応する参照型([[プリミティブラッパークラス]])のオブジェクトとの間の変換を行う。これを自動ボックス化/自動ボックス化解除([[オートボクシング]]/オートアンボクシング)と呼ぶ。これにより、プリミティブ型と対応する参照型の2種類のデータ型が存在することによる複雑さや煩雑さは軽減されているが、性能面での変化はない。
* Java 1.5以降は、[[総称型]]による[[ジェネリックプログラミング]]をサポートするようになった。これにより、プログラマによる明示的な[[型変換]]を減らすことができ、安全性が向上した。
 
なお、Javaは純粋なオブジェクト指向言語ではなく、オブジェクト指向を強制しない<ref>[https://www.ibm.com/developerworks/jp/java/tutorials/j-introtojava1/index.html Javaプログラミング入門, 第 1 回: Java 言語の基本]</ref>。すべてのデータおよび処理は何らかのクラスに属していなければならないという制約はあるが、静的フィールド、静的メソッド、静的インポートなどを使うことで、必要に応じて手続き型プログラミングのスタイルをとることも可能であり、オブジェクト指向プログラミングのスタイルを採用するかどうかはプログラマの裁量にゆだねられている。
 
=== プラットフォーム非依存 ===
[[ファイル:GC SwingDemo.jpg|thumb|250px|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
<!--
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存していないことであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
Javaのプラットフォーム非依存性は、次のようにして実現されている。
 
* ほとんどのJavaの[[コンパイラ]]([[Javaコンパイラ]])は、Javaの[[ソースコード]]を中間言語([[中間表現]])に[[コンパイル]]する。このJavaの中間言語のコードを[[バイトコード]]という。バイトコードは[[Java仮想マシン]](Java VM、[[仮想機械|仮想マシン]]の一種)で実行可能な簡潔な[[機械語]]命令からなる。
* Javaプログラムを実行する際には、このバイトコードをJava仮想マシン上で実行する。Java仮想マシンは、実行するハードウェアにネイティブなソフトウェアであり、中間言語であるバイトコードを解釈して実行する。
* Java実行環境は、Java仮想マシンの他に、標準[[ライブラリ]]を備えている。この標準ライブラリを利用することにより、Javaプログラムは、グラフィクス、[[スレッド (コンピュータ)|スレッド]]、[[コンピュータネットワーク|ネットワーク]] など実行するマシンのさまざまな機能を、プラットフォームに依存しない単一の方法で使うことができるようになる。プラットフォームごとに異なる方法を使い分ける必要は無い。
* Javaのバイトコードの実行時には、Java仮想マシンにより、最終的にはハードウェアにネイティブな[[機械語]]コードに変換されて実行される。このバイトコードから機械語コードへの変換は、Java仮想マシンが[[インタプリタ]]として行う場合と、Java仮想マシンが[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]を使って行う場合とがある。
 
また、実際には[[Javaコンパイラ]]の[[実装]]として、[[ソースコード]]から直接にプラットフォームのハードウェアにネイティブな[[オブジェクトファイル|オブジェクトコード]]([[機械語]]コード)を生成するものがある。このようなJavaコンパイラの実装としては[[GNUプロジェクト]]の[[GNU Compiler for Java]] (GCJ) などがある。この場合、バイトコードを生成するという段階は省かれる。しかしこの方法で生成されるJavaの実行コードは、コンパイル時に指定したプラットフォームでしか動かない。
 
Javaの実行コード([[バイトコード]])を生成する手段としては、[[プログラミング言語]]Javaでプログラムを書くことが標準的な方法である。Javaのバイトコードの実行は、[[Java仮想マシン]]という[[仮想機械|仮想マシン]]の環境上で行われる。Java仮想マシンは実行時にバイトコードをネイティブコードに変換する。なお、Javaのバイトコードを生成する他の手段としては、[[Ruby]]([[JRuby]])、[[Python]]([[Jython]])、[[Groovy]]、[[Scala]]、[[Kotlin]]、[[Ceylon]]、<!--[http://www.jabaco.org Jabaco]--><!-- Jabacoは2009年で更新が止まっており、ここで列挙するにはマイナーすぎる存在のためコメントアウト。 -->などのプログラミング言語でプログラムを書く方法もある。
 
[[サン・マイクロシステムズ]]のJavaのライセンスは、すべてのJava実行環境の実装は「[[互換性]]」を備えるべきであることを要求していた。このことに関連して、[[サン・マイクロシステムズ]]と[[マイクロソフト]]との間で法的な争いが起こったことがあった。この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。
*[[Java Remote Method Invocation|RMI]]と[[Java Native Interface|JNI]]の機能が無い。
*マイクロソフトのプラットフォーム ([[Microsoft Windows|Windows]]) に特有の機能を備えている。
サンは訴訟を起こして勝訴し、約2000万ドルの違約金の支払いを受けた。また裁判所は、マイクロソフトに対してサンのライセンス条件に従うことを命じた。この決定を受けて、マイクロソフトは自社のOSであるWindowsにJava実行環境を同梱しない方針を採った。また{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsでは自社の[[ウェブブラウザ]]である[[Internet Explorer]]でJavaをサポートしないようにした。その結果、Internet Explorerで[[Javaアプレット]]を動かすためには、別途に[[プラグイン]]が必要となった。しかし、サンなどの企業は、{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどのWindows PCのユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。
 
最初期の[[Java Runtime Environment|Java実行環境]]の実装では、Javaプログラムの実行速度が遅かったが、{{いつ範囲|date=2019年2月|近年}}では大きく改善されて、高速に実行できるようになった。最初期のJava実行環境の[[Java仮想マシン]]の実装は、[[移植性]]を実現するために[[インタプリタ]]として動作する[[仮想機械|仮想マシン]]を採用した。こうした初期のJava実行環境の実装では、Javaプログラムの実行速度が[[C言語|C]]や[[C++]]のプログラムと比べて遅かった。そのため、Javaプログラムの実行速度は遅いという評判が広まった。{{いつ範囲|date=2019年2月|近年}}のJava実行環境の実装では、いくつかの技術を導入することにより、{{いつ範囲|date=2019年2月|以前}}と比べて、Javaプログラムをかなり高速に実行できるようになった。
 
Javaプログラムを高速に実行するために使われる技術を説明する。
*Java仮想マシンに高速化の技術を導入する。
**Java仮想マシンに[[ジャストインタイムコンパイル方式]](JITコンパイル方式)を導入する。ジャストインタイムコンパイラは、Javaプログラム(バイトコード)の実行時に、バイトコードをネイティブコードに変換する。
**さらに洗練されたJava仮想マシンでは「動的再コンパイル」(dynamic recompilation) を行う。こうしたJava仮想マシンでは、実行中のプログラムを分析して、プログラムの重要な部分を特定して再コンパイルを行い[[最適化 (情報工学)|最適化]]する。動的再コンパイルは、静的コンパイルよりも優れた最適化を行うことができる。その理由は、動的再コンパイルは、実行環境と実行中にロードされている[[クラス (コンピュータ)|クラス]]に関する情報に基づいて最適化しているからである。
**Java仮想マシンに[[世代別ガベージコレクション]]の技術を導入して[[ガベージコレクション]]を効率化する。
*あるいは、先に述べたように、Javaのソースコードを、従来の言語のコンパイラと同様に、単純にネイティブな機械語コードにコンパイルする。この場合、バイトコードを生成する過程は全く省かれる。この技術を使うと、良好な実行速度を得ることができる。ただし[[移植性]](プラットフォーム非依存)は損なわれる。Java仮想マシンにジャストインタイムコンパイルと動的再コンパイル、世代別ガベージコレクションの技術を導入することにより、Javaプログラムは、移植性を保ちつつ、ネイティブコードと同水準で高速に実行することができるようになった。
 
Java の[[移植性]]([[プラットフォーム (コンピューティング)|プラットフォーム]]非依存性)がどの程度実現できているかについては、議論の対象となっている。技術的には、移植性とは実現が難しい目標である。多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは、可能である。{{要出典範囲|date=2019年2月|しかし実際には、Javaを利用できるプラットフォームによってはちょっとしたエラーが発生したり、微妙に異なる動作をしたりする事例が多い。こうしたことから一部の人々は、[[サン・マイクロシステムズ]]のJavaの売り文句であった ''"[[Write once, run anywhere]]"''(一度コードを書けば、どの環境でも動く)をもじって ''"Write once, debug everywhere"''(一度コードを書けば、どの環境でもデバッグが必要)と皮肉をいわれることがある。}}<!-- WARN: Java仕様の不備だったのか、それとも各プラットフォームにおけるJava実装に問題があったのか、それが論じられていないので意味がない。仕様に適合しない処理系や実行環境であれば、プログラムの動作互換性が保証できないのはどの言語でも同じ。 -->
 
しかし、Javaのプラットフォーム非依存性は、[[サーバ]]側や[[組み込みシステム]]のアプリケーションに関しては成功を収めている。サーバ側 ([[Java Platform, Enterprise Edition|Java EE]]) では、Java の[[Java Servlet|サーブレット]]、[[Webサービス]]、[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 ([[Java Platform, Micro Edition|Java ME]]) を使った[[OSGi]]を基にした開発が広く行われている。
 
=== ガベージコレクション ===
Javaは[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
ガベージコレクションを備えていない[[C++]]やその他の言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]をするプログラマは一般に、Javaと同様メモリ内の[[ヒープ領域|ヒープ]]に[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合に、必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不十分なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、不適切な指示などで、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことで、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
 
ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。プログラマは任意の時点で[[オブジェクト (プログラミング)|オブジェクト]]を生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任を持つ。
 
プログラム(オブジェクト)は、他のオブジェクトへの[[参照 (情報工学)|参照]]を持ち、そのオブジェクトの[[メソッド (計算機科学)|メソッド]]を呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内の[[ヒープ領域|ヒープ]]という領域上に確保されたそのオブジェクトを指すアドレスのことである。
 
オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリ量が減っていく[[メモリリーク]]を防ぐ。
 
ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。[[プログラマ]]が、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。
 
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装された[[Java仮想マシン]]を使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。
 
C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
 
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
 
=== ネットワーク機能 ===
Javaでは充実した[[ライブラリ]]により、[[コンピュータネットワーク]]を使うソフトウェアを、効率良く開発できる。Javaの初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] ([[IPv4]]) のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになった。[[Java Remote Method Invocation|Java RMI]]もしくは[[Common Object Request Broker Architecture|CORBA]]の分散オブジェクト技術を標準で使うことができる。{{いつ範囲|date=2019年2月|近年}}では、標準、拡張その他のライブラリにより、さまざまな[[通信プロトコル|ネットワークプロトコル]]を高水準で扱えるようになっている。
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
*[[Simple Mail Transfer Protocol|SMTP]]/[[Post Office Protocol|POP]]/[[Internet Message Access Protocol|IMAP]]、[[Network News Transfer Protocol|NNTP]]([[電子メール]]送受信、[[ネットニュース]])
*[[Secure Shell|SSH]]、[[Transport Layer Security|TLS/SSL]](セキュアな通信により盗聴やなりすましを防ぐ)
*[[Server Message Block|SMB]]([[ファイルサーバ]]へのアクセス)
*ほか
{{いつ範囲|date=2019年2月|現在}}では[[IPv6]]も扱えるようになりつつある。
 
[[Extensible Markup Language|XML]]文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。
 
=== セキュリティ ===
Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード([[Javaアプレット]])を安全に実行できるよう設計されていた。
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
*Java実行環境のセキュリティマネージャ機能([[サンドボックス (セキュリティ)|サンドボックス]])により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
**Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。
 
=== 名前空間 ===
Javaは、[[パッケージ (Java)|パッケージ]]という[[名前空間]]の機構を持つ言語であり、[[ライブラリ]]および[[アプリケーションソフトウェア]]に含まれる多数の Java の[[プログラム (コンピュータ)|プログラム]]([[クラス (コンピュータ)|クラス]]とインタフェース)を、パッケージの階層構造に分類・整理することができる。名前空間の機構を持たない言語と比べて、多数のクラスとインタフェースの管理が容易となり、クラスとインタフェースの命名についても、既存のクラス/インタフェースとの名前の衝突回避を考慮する労力が、大きく軽減される。
 
== 実行形態 ==
Java の[[バイトコード]]には複数の実行形態があると考えることができる。ただしいずれのバイトコードも、[[Java Runtime Environment|Java実行環境]] (JRE) の下で実行されるという点では、同じと考えることもできる。
;[[Javaアプリケーション]]
:ローカルのコンピュータで実行されるJavaプログラム。
;[[Javaアプレット]]
:[[コンピュータネットワーク|ネットワーク]]上に置かれ[[ウェブブラウザ]]上で実行できるJavaプログラム。ワンクリックで実行できるため、その動作には[[サンドボックス (セキュリティ)|サンドボックス]]機構の下で厳しい制限が加えられている。
;[[Java Servlet|Javaサーブレット]]
:[[ウェブページ]]を動的に作るJavaプログラム。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
;[[JavaServer Pages]] (JSP)
:[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラム。サーバ側で解釈して動的にウェブページを作り出す。コードの見た目は似ているが、[[ECMAScript]] ([[JavaScript]]) のようにブラウザ側で実行するスクリプトではない。サーブレットの機能を補完するもの。類似の技術に [[Active Server Pages]] (ASP)、[[ASP.NET]]、[[PHP (プログラミング言語)|PHP]] などがある。
;[[Java Web Start]]
:[[Javaアプリケーション]]を簡単に配備し実行する仕組み。[[拡張子]]がjnlpとなっているファイルをウェブブラウザなどでワンクリックしただけで自動ダウンロード、自動インストールを行い、また最新バージョンがあるかをネット上で自動チェックしあれば自動アップデートしてから実行する。[[Javaアプレット]]のように実行時にウェブブラウザを必要とすることはない。類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnce がある。
 
== 構文 ==
{{main|Javaの文法}}
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも習得しやすいと、{{要出典範囲|date=2017年10月|メーカーや信者は宣伝した}}。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。
627 ⟶ 581行目:
*<!--'''<code>[http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/PrintWriter.html#close() close()]</code>{{Javadoc:SE|name=close()|java/io|PrintWriter|close()}}'''メソッドを呼び出して<code>PrintWriter</code>のストリームを閉じる。-->そして応答データは[[ソケット (BSD)|ソケット]][[ストリーム (プログラミング)|ストリーム]]に書き出され、クライアントに返される。
 
== Javaプラットフォーム ==
== 構成 ==
[[Javaプラットフォーム]]の構成を説明する。
*[[#Java実行環境]] (JRE) は、[[Javaプラットフォーム]]に配置されたJavaアプリケーションを実行するために必要な、[[ソフトウェア]]である。[[Javaクラスライブラリ|標準クラスライブラリ]]や[[Java仮想マシン]]などから構成される。
635 ⟶ 589行目:
*[[#拡張機能と関連技術]]で、Javaの主な拡張機能と関連する技術を述べる。
 
=== Java実行環境(JRE) ===
{{Main|Java Runtime Environment}}
 
644 ⟶ 598行目:
JREの他、オラクル / JCPなどの団体・企業は、Java開発キット (JDK) と呼ばれるJREのスーパーセットの実装を開発・提供している。JDKは、Javaプログラムの開発を支援する基本的なソフトウェアであり、多くの開発ツールが含まれている。
 
==== 実行環境JREの構成 ====
Java実行環境は、[[Javaクラスライブラリ|標準クラスライブラリ]]と[[Java仮想マシン]]、およびいくつかのファイルとソフトウェアから構成される。
*Java[[クラス (コンピュータ)|クラス]][[ライブラリ]]群(標準クラスライブラリ)
679 ⟶ 633行目:
*ライセンス文書および各種の文書
 
==== プログラムの実行形態 ====
=== Java開発キット ===
Java の[[バイトコード]]には複数の実行形態があると考えることができる。ただしいずれのバイトコードも、[[Java Runtime Environment|Java実行環境]] (JRE) の下で実行されるという点では、同じと考えることもできる。
{{main|Java Development Kit}}
;[[Javaアプリケーション]]
Java開発キット (JDK; Java Development Kit) は、[[オラクル (企業)|オラクル]] / [[Java Community Process|JCP]] をはじめ複数の団体や企業により開発・提供されている、Javaプログラムの開発を支援する基本的なソフトウェアである。Javaが世に出て以来、広く使われてきたJavaの開発ツールである。[[javac]]、[[javadoc]]、[[デバッガ]]などを含む多くの開発ツールが含まれている。また、完全な[[Java Runtime Environment|Java実行環境]] (JRE) を同梱している。
:ローカルのコンピュータで実行されるJavaプログラム。
;[[Javaアプレット]]
:[[コンピュータネットワーク|ネットワーク]]上に置かれ[[ウェブブラウザ]]上で実行できるJavaプログラム。ワンクリックで実行できるため、その動作には[[サンドボックス (セキュリティ)|サンドボックス]]機構の下で厳しい制限が加えられている。
;[[Java Servlet|Javaサーブレット]]
:[[ウェブページ]]を動的に作るJavaプログラム。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
;[[JavaServer Pages]] (JSP)
:[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラム。サーバ側で解釈して動的にウェブページを作り出す。コードの見た目は似ているが、[[ECMAScript]] ([[JavaScript]]) のようにブラウザ側で実行するスクリプトではない。サーブレットの機能を補完するもの。類似の技術に [[Active Server Pages]] (ASP)、[[ASP.NET]]、[[PHP (プログラミング言語)|PHP]] などがある。
;[[Java Web Start]]
:[[Javaアプリケーション]]を簡単に配備し実行する仕組み。[[拡張子]]がjnlpとなっているファイルをウェブブラウザなどでワンクリックしただけで自動ダウンロード、自動インストールを行い、また最新バージョンがあるかをネット上で自動チェックしあれば自動アップデートしてから実行する。[[Javaアプレット]]のように実行時にウェブブラウザを必要とすることはない。類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnce がある。
 
=== Java開発キット(JDK) ===
Javaプログラムを実行するだけであれば、Java実行環境が導入されていれば充分で、Java開発キットを導入する必要は無い。
{{main|Java Development Kit}}
Java開発キット (JDK; Java Development Kit) は、[[オラクル (企業)|オラクル]] / [[Java Community Process|JCP]] をはじめ複数の団体や企業により開発・提供されている、Javaプログラムの開発を支援する基本的なソフトウェアである。Javaが世に出て以来、広く使われてきたJavaの開発ツールである。[[javac]]、[[javadoc]]、[[デバッガ]]などを含む多くの開発ツールが含まれている。また、完全な[[Java Runtime Environment|Java実行環境]] (JRE) を同梱している。なお、Javaプログラムを実行するだけであれば、Java実行環境が導入されていれば充分で、Java開発キットを導入する必要は無い。ちなみにJava開発キット (JDK) の呼称は、これまでに何度か変更されている。
 
Java開発キット (JDK) の呼称は、これまでに何度か変更されている。
*J2SE 1.2.2_004 までは JDK と呼んでいた。
*J2SE 1.4 までは Java 2 SDK と呼んでいた。
*J2SE 5.0 では 再び JDK と呼んでいる。
 
==== JREとJDKの複数の実装統合開発環境(IDE) ====
 
*[[NetBeans]] - [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])を中心に開発されている[[オープンソース]]のIDE。Windows版、Linux版。Solaris版、Mac OS版。
**[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]
*WebSphere Studio - [[IBM]]。Eclipse SDK の上位版ともいえるもの。[[WebSphere]] [[WebSphere Application Server|Application Server]] と統合されている。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]
*[[Eclipse (統合開発環境)|Eclipse SDK]] - [[Eclipse財団]]。以前はIBMが管理していた。Web Sphere Studioのオープンソース版ともいえる。Windows版、Linux版、Solaris版、Mac OS版。
**[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]
*[[JBuilder]] - [[エンバカデロ・テクノロジーズ]]。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.embarcadero.com/jp/products/jbuilder JBuilder]
*[[JDeveloper|Oracle JDeveloper]] - [[オラクル (企業)|オラクル]]。Oracle Application Serverと統合されている。Windows版、Linux版。Solaris版。2005年6月28日に無料化した。
**[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]
*Oracle Workshop for WebLogic - [[オラクル (企業)|オラクル]]([[BEAシステムズ]])。{{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。
**[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]
*[[BlueJ]] - Deakin University([[オーストラリア]])とUniversity of Kent([[イングランド]])、[[サン・マイクロシステムズ]]が共同で開発した[[フリーソフトウェア]]、Javaの学習に適したインタラクティブな統合開発環境。
**[http://www.bluej.org/ BlueJ]
*[[IntelliJ IDEA]] - JetBrainsが開発販売している商用の統合開発環境。
**[http://www.jetbrains.com/idea/ IntelliJ IDEA]
*JCreator - Xinox Softwareが開発販売している商用の統合開発環境。
**[http://www.jcreator.com/ JCreator]
*[[Xcode]] - [[アップル (企業)|アップル]]。[[macOS]]に付属する統合開発環境。
 
==== 開発サポートツール ====
 
*[[Apache Ant]] - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。[[コンパイル]]、[[バージョン管理システム]]との連携、[[jar]]、[[javadoc]]生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*[[Apache Maven]] - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
*[[JUnit]] - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。
 
=== サードパーティ版 ===
広く使われている[[プラットフォーム (コンピューティング)|プラットフォーム]]などに対しては、複数の団体や企業が独自にJREやJDKの[[実装]]を開発・提供している。独自の[[最適化 (情報工学)|最適化]]技術を適用したり、特定の用途に特化した最適化、あるいは異なるライセンスを採用するなど、それぞれ特徴がある。
*[[Linux]] / [[IA-32]]プラットフォーム : [[オラクル (企業)|オラクル]]、Blackdown、[[IBM]]、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
*[[Microsoft Windows|Windows]]/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。
 
==== '''オープンソース/フリーソフトウェアの実装 ===='''
 
[[オラクル (企業)|オラクル]]およびいくつかの団体が、[[オープンソース]]もしくは[[フリーソフトウェア]]の[[ライセンス]]で利用できる、[[Java仮想マシン]]およびJRE 、JDKの[[実装]]を開発している。
 
711 ⟶ 704行目:
また[[OpenJDK]]には[[IBM]]が協力している。
 
===== '''GNUプロジェクトによる実装 ====='''
 
[[GNUプロジェクト]]が[[GNU Interpreter for Java]]および[[GNUコンパイラコレクション]] (GCC) のJava版である[[GNU Compiler for Java]]を出している。GNU Compiler for Javaはahead-of-timeコンパイラを搭載しており、Javaのソースコードやバイトコードをネイティブマシンコード([[Microsoft Windows|Windows]]の場合はexeファイル)に変換できる。クラスライブラリは[[GNU Classpath]]を使っており、1.4のほとんどの部分が対応しており、5.0の部分も実装が進んでいる。
 
Windows環境では、GCJは[[MinGW]] (Minimalist GNU for Windows) もしくは[[Cygwin]]を使って実行できる。Cygwinの場合は、対象がライセンスが[[GNU General Public License|GPL]]のソフトウェアに限られるが、MinGWの場合は商用含め、すべてのソフトウェアで利用できる。
 
==== '''Excelsior JET ===='''
 
米Excelsior社がExcelsior JETというahead-of-timeコンパイラを販売している[http://www.excelsior-usa.com/jet.html]。Java SE 用に書かれたプログラムを [[Microsoft Windows|Windows]]のネイティブマシンコードであるexeファイル(実行ファイル)に変換できる。起動の高速化やアプリケーションの[[難読化コード|難読化]]を実現する。
 
==== '''Windows exeパッケージ化 ===='''
 
[[Microsoft Windows|Windows]]にて、配布、実行しやすくするために、Javaの[[jar]]ファイルをexeファイル(実行ファイル)でラッピングするツールがある。以下が、その一例である。
*[http://exewrap.osdn.jp/ exewrap]
733 ⟶ 729行目:
サンが特定のOSに特化した機能を提供することを嫌がっていたため、これらの機能が不足しており、それを補うために、exeパッケージ化が存在する。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
 
=== Javaのエディション(SE / EE / ME) ===
[[オラクル (企業)|オラクル]]と[[Java Community Process|JCP]]は、さまざまな環境に対応するため、3つの[[Javaプラットフォーム]]のエディションを規定している。Javaの[[アプリケーションプログラミングインタフェース|API]]の多くは分類され各エディションに割り当てられている。
 
786 ⟶ 782行目:
=================================================================================-->
 
== Java技術テクノロジーの標準化 ==
:''詳細は [[Java Community Process]] (JCP) を参照''
現在、[[Javaプラットフォーム]]の将来のバージョンや機能は、[[Java Community Process|JCP]] (Java Community Process) の標準化プロセスのもとで開発されている。JCPのメンバになることで、Java技術の将来のバージョンや機能の定義に関与することができる。JCPには、[[IBM]]、[[ボーランド]]、[[富士通]]、[[Apacheソフトウェア財団]]、[[ヒューレット・パッカード]] など、さまざまな個人、団体、企業がメンバとして参加している。
811 ⟶ 807行目:
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0)
 
== 開発ツールJavaへの批判 ==
Javaアプリケーションを開発するための開発ツール(開発用[[ソフトウェア]])をいくつか示す。次に示すツール以外にも、数多くのツールが開発・提供されている。
*[[Java Development Kit|Java開発キット]] (Java Development Kit, JDK) - Javaアプリケーションの基本的な開発環境。
*[[統合開発環境]] (IDE) - アプリケーションを開発できる多機能な開発環境。後述する。
*[[Apache Ant]] - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。[[コンパイル]]、[[バージョン管理システム]]との連携、[[jar]]、[[javadoc]]生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*[[Apache Maven]] - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
*[[JUnit]] - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。
 
=== 統合開発環境 ===
Javaプログラムを開発できるいくつかの[[統合開発環境]] (IDE) を示す。
*[[NetBeans]] - [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])を中心に開発されている[[オープンソース]]のIDE。Windows版、Linux版。Solaris版、Mac OS版。
**[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]
*WebSphere Studio - [[IBM]]。Eclipse SDK の上位版ともいえるもの。[[WebSphere]] [[WebSphere Application Server|Application Server]] と統合されている。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]
*[[Eclipse (統合開発環境)|Eclipse SDK]] - [[Eclipse財団]]。以前はIBMが管理していた。Web Sphere Studioのオープンソース版ともいえる。Windows版、Linux版、Solaris版、Mac OS版。
**[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]
*[[JBuilder]] - [[エンバカデロ・テクノロジーズ]]。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.embarcadero.com/jp/products/jbuilder JBuilder]
*[[JDeveloper|Oracle JDeveloper]] - [[オラクル (企業)|オラクル]]。Oracle Application Serverと統合されている。Windows版、Linux版。Solaris版。2005年6月28日に無料化した。
**[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]
*Oracle Workshop for WebLogic - [[オラクル (企業)|オラクル]]([[BEAシステムズ]])。{{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。
**[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]
*[[BlueJ]] - Deakin University([[オーストラリア]])とUniversity of Kent([[イングランド]])、[[サン・マイクロシステムズ]]が共同で開発した[[フリーソフトウェア]]、Javaの学習に適したインタラクティブな統合開発環境。
**[http://www.bluej.org/ BlueJ]
*[[IntelliJ IDEA]] - JetBrainsが開発販売している商用の統合開発環境。
**[http://www.jetbrains.com/idea/ IntelliJ IDEA]
*JCreator - Xinox Softwareが開発販売している商用の統合開発環境。
**[http://www.jcreator.com/ JCreator]
*[[Xcode]] - [[アップル (企業)|アップル]]。[[macOS]]に付属する統合開発環境。
 
== 批判 ==
{{main|Javaに対する批判}}
 
978 ⟶ 944行目:
*[http://www.computer-books.us/java.php Computer-Books.us] {{Ref-en}} - Java の複数の書籍(無償でダウンロード可能)
 
=== JRE(Java実行環境)JRE JDK(Java開発キット)JDKの実装 ===
 
'''プロプライエタリ'''
 
==== プロプライエタリ ====
*[http://www.oracle.com/jp/technologies/java/standard-edition/overview/ Java SE] - オラクル(旧サン)によるJREとJDKの実装
*[http://www.oracle.com/technetwork/jp/middleware/jrockit/overview/ Oracle JRockit] - オラクル(旧BEAシステムズ)によるJava仮想マシンとJDKの実装
 
==== '''オープンソース/フリーソフトウェア ===='''
 
*[http://openjdk.java.net/ OpenJDK] {{Ref-en}}
*[http://gcc.gnu.org/java/ GNU Compiler for Java (GCJ)] {{Ref-en}}