削除された内容 追加された内容
(6人の利用者による、間の44版が非表示)
17行目:
|designer = [[Java Community Process]]
|developer = [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])
|latest release version = Java Standard Edition 1112.0.21
|latest release date = {{release date|2019|0104|1516}}
|型付け = 強い[[静的型付け]]
|プラットフォーム = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>各種の[[組み込みシステム]]ほか多数
29行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、狭義では[[プログラミング言語]]のJavaを指し、広義ではJava言語を中心にした[[プラットフォーム (コンピューティング)|コンピューティング・プラットフォーム]]を意味する<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml |title=What is Java and why do I need it? |language=en |accessdate=2019-02-04}}</ref>。後者はJavaプラットフォームと呼ばれる。Javaの関連技術はJavaテクノロジー」と総称されている<ref>{{Cite web|url=https://docs.oracle.com/cd/E26537_01/tutorial/getStarted/intro/definition.html |title=About the Java Technology (The Java? Tutorials > Getting Started > The Java Technology Phenomenon) |language=ja-jp |accessdate=2019-02-24}}</ref>。Java言語の構文は[[C++]]<!-- C言語ではない。 -->に類似しておたものであり、[[オブジェクト指向]]と[[並行計算|並行コンピューティング]]が主[[プログラミングパラダイム|パラダイム]]として導入されている。Javaテクノロジーの主な目標は、従来のソフトウェアが抱えていた[[移植性]]問題の解決であった。''"[[Write once, run anywhere]]"''(一度書けばどこでも動く)をキャッチコピーにし、特定の環境に依存しない理想的な[[クロスプラットフォーム]]・プログラムの開発・実行環境の実現を目指して設計された
 
Javaプログラム[[Javaバイトコード]]と呼ばれる中間言語([[中間表現]])に[[コンパイラ|コンパイル]]されて[[Java仮想マシン]]と呼ばれる従来のソフトウェア上で実行される。各コンピュータ環境に対応しが抱えていJava仮想マシンがハードウェア間[[移植性]]問題差異解決吸収し図り、特定の環境に依存しない理想的な[[クロスプラットフォーム]]・プログラム動作を実現する仕組みとなっを目指しいる開発された。Java登場初期の対象であったソフトウェアは、家電機器や乗用車の[[組み込みシステム]]を始めから、[[マイクロコントローラ|マイクロ制御装置]]、[[携帯機器]]、[[パーソナルコンピュータ]]、[[サーバー (コンピューター)|サーバーマシン]]、[[スマートカード]]といった様々な環境にJavaソフトウェアは普及している。
 
Javaは、1995年に[[サン・マイクロシステムズ]]によって公開された。2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの各種権利もオラクルに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年34月現在の最新メジャーバージョンは、20182019932519日に公開された第1112版となっている。
 
== 特徴Javaの方針 ==
=== Javaの理念 ===
{{独自研究|section=1|date=2019年3月}}
{{正確性|section=1|date=2019年3月}}
{{出典の明記|section=1|date=2019年3月}}<!-- URLが記載されていないので検証不可能。[[Wikipedia:検証可能性]] -->
Javaは5つの方針に基づいて開発された<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html |title=The Java Language Environment |accessdate=2019-04-24}}</ref>。これらは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>{{出典無効|date=2019-02-26|title=Webリソースかのような記述の仕方だがURLが示されていない。}}。
 
# シンプルで、[[オブジェクト指向プログラミング|オブジェクト指向]]で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢で安全にする(''robust and secure'')
#[[プラットフォーム非依存]]で、[[移植 (ソフトウェア)|移植]]を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''to execute with high performance'')
#[[インタプリタ|インタプリタ式]]で、[[スレッド (コンピュータ)|スレッド式]]で、動的([[最適化 (情報工学)|最適化]])にする(''interpreted, threaded, and dynamic'')
 
Javaの言語仕様は、[[C++]]のそれから堅牢性を損ねる部分を取り除いたものと考える事が出来る。[[ポインタ (プログラミング)|ポインタ]]、直アドレスの[[インスタンス]]と[[配列]]、[[テンプレート (プログラミング)|テンプレート]]、[[演算子オーバーロード]]、[[goto文]]などが破棄された。[[例外処理]]構文は保持され使用が推奨された。プログラム構文の基本となる演算式と[[制御構文]]もC++と類似のものである。
 
'''変数の在り方'''
 
: Javaの全[[インスタンス]]は実体データを指す参照値(アドレス)に統一されている。[[配列]]は特殊なインスタンスとなっており、[[文字列]]も自動的にインスタンスとなった。これによって特に[[引数]]と返値の受け渡しに混乱が無くなり堅牢性も増した。非参照インスタンスを自動解放する[[ガベージコレクタ]]が導入されたので、メモリ管理の不要に伴うプログラムの簡素化と堅牢さも促進された。なお、8bitから64bitまでの数値を収納するデータは[[変数 (プログラミング)|直アドレス変数]]となっているが、そのアドレスを扱う事は出来ない。
 
'''型定義と関数の在り方'''
 
:[[テンプレート (プログラミング)|テンプレート]]([[ジェネリックプログラミング|ジェネリクス]])と[[演算子オーバーロード]](+[[関数オブジェクト]])を除外した事は同時に、データ型とメソッド呼出の認識を厳格化し、利便性よりも堅牢性を重視するという方針を示す事になったが、後年にはパラダイムシフトが発生している。比較的早期にコレクションクラスを対象にした[[ジェネリックプログラミング|ジェネリクス]]類似の構文が導入されている。後年のJava 8では[[無名関数|ラムダ式]]、[[型推論]]、メソッド参照、ストリームといった[[関数型プログラミング]]由来の構文が導入され、特に細部の実装に適用された事によりJavaの方向性は大きく変化したと言える。
 
'''オブジェクト指向の在り方'''
 
: オブジェクト指向は[[C++]]と同様の[[クラス (コンピュータ)|クラス]]のメカニズムに基づく仕様から[[多重継承]]が取り除かれ、無名クラスの構文が追加されている。後者は[[プロトタイプベース]]オブジェクトの取り扱いに近い利便性を実現した。[[カプセル化]]はソースコード単位がデフォルトの緩やかなもので利便性が優先されている。Javaの[[多態性]]の中心は[[仮想関数]]であり、その集合体である''interface''構文が専門に用意されている。''interfaceは[[継承]]と区別されて多重に[[派生型|実装]]できる。''また堅牢性を重視しながらも動的な[[型システム|型比較]]と[[型変換|型キャスト]]と[[リフレクション (情報工学)|リフレクション]]が備えられており、動的な多態性の実現が優先されている。上述二点の多態性の背景には[[分散コンピューティング]]の重視があり、その実現をサポートする[[ネットワーク・コンピューティング|ネットワーク]]機能と[[Java Remote Method Invocation|リモートメソッド]]および[[Common Object Request Broker Architecture|CORBA]]のAPIも充実している。
 
'''スレッドの在り方'''
 
: Javaでは[[スレッド (コンピュータ)|スレッド]]ベースの[[並行コンピューティング]]が重視されている。全てのインスタンスに[[同期 (計算機科学)|同期用]]の[[ロック (情報工学)|ロック機能]]が備えられているのでイメージ的にオブジェクト単位の[[排他制御]]の実装が容易となっており、オブジェクト指向との協調が図られている。これは仮想マシン組み込みの''synchronized''構文で用いられるが、その他にも様々な[[同期 (計算機科学)|同期用]]APIが揃えられている。スレッド資源の制約を解決する為にタスクの仕組みを併せた[[モニタ (同期)|モニタ]](''Executor)の技法''が導入されている。[[ロック (情報工学)|ロック手法]]には[[ミューテックス]]、[[セマフォ]]、バリア、読み書きロック、イベント(''CountDownLatch'')が揃えられており[[排他制御|排他制御手法]]の選択肢も広い。また[[アトミック操作]]をサポートするAPIも揃えられている。
 
'''堅牢性から利便性へ'''
 
: Javaの予約語は少なくAPIは膨大であり、シンプルで応用性に富んだ言語仕様と見る事が出来る。基礎部分を簡素化して残りをアドオン的にする設計は、Javaの主眼である[[マルチプラットフォーム|マルチプラットフォーム性]]を実現する為でもあった。加えてJava仮想マシン上でのプログラム実行は基礎レベルからの堅牢性とセキュリティを実現した。公開初期と比べたJavaの方向性は大きく変化している。[[ポリモーフィズム|動的多態性]]、[[分散コンピューティング|分散処理]]、[[並行処理]]、[[ジェネリックプログラミング|総称型構文]]、[[関数型プログラミング|関数型構文]]の拡張ないし追加が示すものは柔軟性(''flexible'')と利便性(''utility'')の追求であり、結果的に堅牢性(''robust'')を旨としたJavaの哲学に優越した。
# 言語仕様はシンプルで、オブジェクト指向で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢(エラー動作の抑止)で安全(不正アクセスの防止)にする(''robust and secure'')
# プラットフォーム非依存で、移植を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''executing with high performance'')
# インタプリタ(仮想マシン)式で、マルチスレッドで、コードを動的に再解釈できる(''interpreted, threaded, and dynamic'')
 
== Javaの特徴 ==
(1)に関しては、C++をベースにした構文が採用されたが、実装の多重継承や演算子オーバーロードなど、言語仕様および処理系の実装を複雑にする機能は採用されなかった<ref group="注釈">ジェネリクスおよび列挙型は当初採用されていなかったが、のちにJava 1.5で追加された。</ref><!-- 言及すべきは予約語の数ではない。予約語の多寡だけで複雑度が決まるわけではない。ベースとなったC++と比較して、削除されたキーワードもあれば、追加されたキーワードもある。予約はされているが使われていないものもある。 -->。オブジェクト指向はクラスベースとしたが、{{独自研究範囲|date=2019年3月|メッセージベースを実装できるAPI}}{{要説明|date=2019年3月}}<!-- こじつけ? -->も追加された。(2)に関しては、ポインタやgoto文などの柔軟だが危険な機能は採用せず、強い静的型付け、例外処理、ガベージコレクタなどを採用した。動作上の堅牢性は仮想マシンと不正コードチェックを兼ねたクラスローダを根幹とし、これは同時にプログラムをサンドボックス化して基礎レベルからのセキュリティを確立した。(3)と(4)はJava仮想マシンの技術に依存した。(5)に関しては、マルチスレッドの取り扱いは<code>synchronized</code>ブロックと{{疑問点範囲|date=2019年3月|3つの予約語}}{{要説明|date=2019年3月}}というシンプルな設計でまとめられた。{{独自研究範囲|date=2019年3月|ダイナミック性は様々に解釈できるが、多重ディスパッチは<code>instanceof</code>演算子とダウンキャストと例外処理の活用で実装でき、動的ディスパッチは<code>Serializable</code>インタフェースとリフレクションAPIの活用で表現できた}}。
 
=== オブジェクト指向 ===
77 ⟶ 98行目:
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし、またバージョン間の[[互換性]]に注意して開発が進められている。プラットフォームに依存しない(Javaプラットフォーム自体を除く)[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはプラットフォーム([[CPU]])に依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、[[中間言語]]([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された([[pコードマシン]]など、過去にもあったものだが、なぜか新しいものであるかのように宣伝される<sup class="noprint Template-Fact">[''[[Wikipedia:「要出典」をクリックされた方へ|要出典]]'']</sup>)。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存していないことであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
Javaのプラットフォーム非依存性は、次のようにして実現されている。
108 ⟶ 131行目:
しかし、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ではその前身であるGreenOS用言語およびOakと呼ばれていた頃にあたる、主に家電機器向け組込システムへの普及を目指していた初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシンソフトウェア上のユーザー空間で走行される純粋なユーザースレッドとして実装された。一台のJava仮想マシンの実行は一つのプロセスとなり、Javaのプロセスは始めから複数スレッド(糸)の寄り合わせとして設計されていた。この高度なネイティブスレッド・エミュレート技術は注目を集め、その開発チームの名に因んだグリーンスレッドという名称を確立し、ランタイムライブラリ及び仮想マシン上で走行されるマルチスレッドの代名詞となった。グリーンスレッドは公開初期においては、例えばLinuxのネイティブスレッドよりもやや軽量なパフォーマンスを発揮した。組み込みシステム向けのJava仮想マシンでは基本的にこのグリーンスレッドが標準仕様となり続けている。しかし、パソコンやサーバーマシン用の各OSの間で、マルチコアCPUの特性を活かして設計された更に軽量なネイティブスレッドが一般的になると、グリーンスレッドのパフォーマンスは明確に見劣りするようになった。やむなく開発チームはグリーンスレッドを順次廃止し、JavaのスレッドをOSが提供するネイティブスレッド上で走行させるように設計変更した。これはやや苦汁の決断だったようで、特に並行処理同期=排他制御を多用するJavaプログラムにおいては、この時点からプラットフォーム非依存性に対する問題が生じるようになったと言われる。
Javaでは[[スレッド (コンピュータ)|スレッド]]を言語仕様で規定しており、[[マルチスレッド]]による[[並行計算]]や[[マルチコア]]CPUを活かした[[並列計算]]を、従来の言語と比べて簡単に実装できる。
 
Javaの同期(''synchronization'')設計の特徴としては、全てのインスタンスにロックオブジェクト機能を持たせてる事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子を付加された各メソッドはその全体が排他制御エリアとなり、呼び出し時はデフォルト的にthisインスタンスからロックを取得するので、イメージ的にオブジェクト(=インスタンス)単位となる排他制御が容易に実装できた。このロック普遍化はオブジェクト指向との協調を明確に表現した設計と言える。''synchronized''クラスメソッドの方は、システム内に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同種オブジェクト(同属性インスタンス)共通の同期と排他制御を表現できた。また、''synchronized()''定義子の波括弧で任意のコード部分を括る事により、メソッド内に部分的な排他制御エリアを設ける事が出来る。ここではthis以外のインスタンスもロックオブジェクトに指定出来るので多様な同期が可能となった。上述の排他制御エリアの仕組みは基本的に入口でロックを取得し、出口でロックを解放するものである。ロックが取得出来なかったら待機キューに入れられる。再入可能(リエントランス)に設計されているので再帰アルゴリズムなどで一度ロックを取得したスレッドが再び入口を通る時はそのまま素通りする。エリア内からのメソッドリターンは同時に出口通過と見なされてロックを解放する。ただしエリア内ですでにロック解放(''notify'')を行っている場合はそのまま脱出する。エリア内では任意位置での待機キュー入り(''wait'')も可能で同時にそこでロックも解放される。状態異常発生時は各スレッドに例外を投げて待機キューから強制脱出させる事も出来る。この標準同期は、組み込みシステムやさほど複雑でないアプリケーションの実装をほとんどカバー出来るものと言える。またこのミューテックス相当の機能は様々に応用可能でもある。しかし、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
 
スレッドはその性質ごとにスレッドグループにまとめる事が出来て同時に様々な一括操作も可能となっている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
 
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ([[主記憶装置]])を管理する負担を軽減する。あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。従来のオブジェクト指向プログラミング言語である[[C++]]では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
Javaは[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
[[ガベージコレクション]]機能を備えた事により、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
ガベージコレクションを備えていない[[C++]]などの言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]において、[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域をメモリ内の[[ヒープ領域]]に動的に割り当てた場合([[動的メモリ確保]])、そのオブジェクトがもはや必要なくなった場合に、プログラマは必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不適切なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、プログラミングミスなどにより、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことであり、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
131 ⟶ 160行目:
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
 
=== ネットワーク機能 ===
Javaでは充実した[[Javaクラスライブラリ|標準ライブラリ]]により、[[コンピュータネットワーク]]を使う活用するソフトウェアを、効率良く開発できる。Javaはその初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] ([[IPv4]]) のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境 ([[Java Remote Method Invocation|Java RMI]], [[Common Object Request Broker Architecture|CORBA]]) のソフトウェアの開発も早い時期からできるようになっていた。[[Java近年<sup Remoteclass="noprint MethodInline-Template Invocationnowrap">[''[[Wikipedia:言葉を濁さない|Java RMIいつ?]]もしく'']</sup>で、さまざまな[[Common Object Request Broker Architecture|CORBAネットワークプロトコル]]の分散オブジェクト技術を標高水なライブラリが使えるよことができになっている。{{いつ範囲|date=2019年2月|近年}}では、[[W3C]]により標準化された拡張その他汎用[[マークアップ言語]]ひとつである[[Extensible Markup Language|XML]]で記述された文書を扱うライブラリも早期より、実装・標準サポートまざまなれた。近年<sup class="noprint Inline-Template nowrap">[''[通信[Wikipedia:言葉を濁さない|いつ?]]'']</sup>では、XMLプロトコルセサと[[XSL Transformations|XSLT]]プロセサがJava標準ライブラリに統合され提供されている。充実したネットワークプロトコル]]機能とXML文書高水準でえるよ機能を有効組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。
 
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
144 ⟶ 174行目:
 
=== セキュリティ ===
Java初期のバ[[コンピュジョタセキュリティ|セキュリティ]]を考慮して設計されており、[[サからドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる([[Javaアプレット]])を安全に。初期のバージョンからコードの実行でき前に様々なセキュリティチェックを行えよう設計メカニズムが実装されていた。
 
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
150 ⟶ 181行目:
*Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。
 
=== その他例外処理 ===
Javaは[[例外処理]]の構文を備えている。これは制御フローの一種であり、例外想定ブロック内の実行中に状態異常が発生すると例外オブジェクトが生成されて、その宛先となる例外捕捉ブロックに強制ジャンプするという仕組みを指す。これは「例外を投げる」と形容されている。例外捕捉ブロックでは、渡された例外オブジェクトの情報に基づいた任意の処理を行った後に例外ブロックを抜ける事になった。
Javaは「[[例外処理]]」の言語仕様を備えており、プログラム実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述できる。
 
例外処理は様々なコード局面での使用が推奨されたが、例外発生後のコードが全スキップされるというフロー上の性質から例外想定ブロック内のコード行数は比較的少ないものとなり、それら例外ブロックの断続的な羅列は却ってソースコードの可読性低下にも繋がった。例外処理による堅牢性と、コーディングレベルでの利便性および実用性は様々な部分でマッチしなかったとも言える。また、実行中の多方面に影響が及ぶような致命的な例外ほど、単純な例外ブロックの記述では対応しきれず、細部の例外ブロックから更に大枠の例外ブロックへ飛ぶというような大胆なジャンプを頻発させてプログラムの把握が難しくなるという欠点もあった。結果的に例外処理は、入出力機能の呼び出しなど決まりきった状態異常の発生部分では積極的に用いられるが、それ以外ではコーディングの頻雑さに勝るだけの有用性がそれほど認められていないのが実情となっている。
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
 
=== その他 ===
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけ[[ピリオド]]で繋ぐことができる。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定できるので短いコード記述が可能となる。
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけピリオドで繋ぐことができる。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定できるので短いコード記述が可能となる。
 
== Javaの歴史 ==
{{更新|date=2018年9月|section=1}}
 
348 ⟶ 380行目:
==== J2SE 5.0 (2004年9月30日) ====
コードネームTiger。[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] のもとで開発された。J2SE 5.0 では、言語仕様に大きく拡張が加えられ、多くの新しい言語機能が追加された<ref>{{cite press|url=http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |title=Sun Ships New Version of Java Platform |publisher=Sun Microsystems |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |archivedate=2005-02-15}} </ref><ref>{{cite web|url=https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html |title=J2SE(TM) 5.0 の新機能 |language=ja-jp |accessdate=2006-07-08}}</ref>。もともとは J2SE 1.5 という名称だったが、この名称はすでに内部的なバージョン番号として使われていた<ref>{{Cite web|url=https://docs.oracle.com/javase/1.5.0/docs/relnotes/version-5.0.html |title=Version 1.5.0 or 5.0? |language=en |accessdate=2006-07-08}}</ref>。またマーケティング上の理由もあった。
* [[総称型]] ([[ジェネリクス]]): [[コンパイラ|コンパイル]]時に静的に[[コンテナ (データ型)|コレクション]]オブジェクトでその要素となるオブジェクトの型を安全に取り扱うことができるようになった。ほとんどの場合において[[型変換]](キャスト)を行う必要は無くなった。[http://www.jcp.org/en/jsr/detail?id=14 JSR 14]で規定された。
* [[オートボクシング]]/オートアンボクシング : <code>int</code>型のような[[プリミティブ型]](primitive type)と{{Javadoc:SE|java/lang|Integer}}クラスのような[[プリミティブラッパークラス]]の間の変換が自動的に行われるようになった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
* [[列挙型]] : <code>enum</code>キーワードにより、Javaで安全な[[列挙型]]を実現する[[デザインパターン (ソフトウェア)|デザインパターン]]であるタイプセーフenum[[デザインパターン (ソフトウェア)|パターン]]が言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる{{efn|このタイプセーフenumパターンの詳細は、{{Cite book|title=Effective Java Programming Language Guide |author=Joshua Bloch |authorlink=ジョシュア・ブロック |year=2001 |pages=97-106 |chapter=第5章 項目21 enum構文をクラスで置き換える}}を参照。}}。以前のバージョンまではこのような場合、タイプセーフではない整数の定数値で定義するか、[[プログラマ]]が自分でタイプセーフenumパターンで実装するかの、どちらかの方法しか無かった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
418 ⟶ 450行目:
 
==== Java SE 11 (2018年9月25日) ====
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 (2019103時点で未定である。19日) ====
JSR 386にて仕様が規定され、[[2019年]]3月19日にリリースされた。Unicode 11がサポートされている。
 
== Java言語の構文 ==
{{main|Javaの文法}}
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも習得しやすいと、{{要出典範囲|date=2017年10月|メーカーや信者は宣伝した}}。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。なお、JavaではC++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発の[[C Sharp|C#]]も踏襲している。
Javaの構文は、[[C言語]]または[[C++]]と類似している。Javaプログラムは目的環境に従い、コマンドライン、GUI、アプレット、サーブレットといったアプリケーション形態に派生する。初心者向けの代表的なサンプルコードである「[[Hello world]][[プログラム (コンピュータ)|表示プログラム]]」によって各形態のコーディング実例を以下に示す。
 
次の節以降では、[[Hello world]][[プログラム (コンピュータ)|プログラム]]で、Javaプログラムの例を示して説明する。Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。
 
=== スタンドアロン(コマンドライン) ===
[[キャラクターユーザインタフェース|コマンドライン]]環境で動く[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動く[[プログラム (コンピュータ)|プログラム]]を簡単に開発できる。
 
<source lang="java">
// Hello.java
434 ⟶ 473行目:
</source>
 
このプログラムについて説明する。
*全てのコードはclass内またはinterface内に記述される。
*Javaのプログラムではすべてを<code>'''class'''</code>内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
*ソースコードのファイル拡張子はjavaとなる。ここではクラス名がHelloなのでソースファイル名はHello.javaとする。
*[[ソースコード]]の[[ファイル (コンピュータ)|ファイル]]名は、そのファイルで記述している[[クラス (コンピュータ)|クラス]]の名前に ".java" というサフィクス(接尾辞、[[拡張子]])を付けるという規則で命名する。
*コンパイルされたソースファイルは、バイトコードファイルに変換される。その拡張子はclassとなる。ここでのバイトコードファイル名はHello.classとなる。
*:このプログラム例では、クラス名は<code>'''Hello'''</code>であるため、"Hello.java" というソースファイル名にする必要がある。
*プログラムはmainメソッドから実行される。mainメソッドは任意のクラス内に一つだけ定義する。他のクラスにも定義されているとコンパイルエラーとなる。
*[[コンパイラ]]は、ソースファイルで定義されている各クラスの[[Javaクラスファイル|クラスファイル]]([[バイトコード]])を生成する。クラスファイルの名称は、そのクラスの名前に ".class" のサフィクスをつけた名前になる。
*mainメソッドにはString配列の引数が渡される。Stringは文字列オブジェクトである。OS側はプログラム実行時のパラメーターのそれぞれをStringオブジェクトにして配列に格納しmainメソッドの引数とする。引数名はargsとするのが標準である。プログラマは引数として渡されたString配列から実行時パラメーターを読み出す。
**クラスファイルの生成において、内部クラスの一種である無名クラス (anonymous class) の場合は、クラスファイルの名称は、その無名クラスを含むクラスの名称と整数(0から始まり、無名クラスが複数ある場合は、さらに1、2...と順に付番される)を "$" で連結した文字列に、通常のクラスと同じく ".class" のサフィクスを付けた名前になる。
*mainメソッドはリターン値を返さないので、voidとする。
*この例のように、スタンドアロンで実行するプログラム(クラス)では<code>'''main()'''</code>[[メソッド (計算機科学)|メソッド]]を定義する必要がある。メソッド定義には振る舞いを記述する。このmainメソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。
*mainメソッドはクラスメソッドなので、staticとする。クラスメソッドはインスタンスを必要としない。
**戻り値の指定には<code>'''void'''</code>キーワードを使う。<code>void</code>は、そのメソッドが何も戻り値を返さないことを示す。
*mainメソッドはクラス内外の全領域から呼び出し可能な、publicとする。
**mainメソッドは、パラメタ([[引数]])として1つの{{Javadoc:SE|java/lang|String}}の配列を受け取らなくてはならない。この<code>String</code>配列の引数の名称は<code>'''args'''</code>とすることが慣習となっている。ただし引数として可能な名称であれば他の名称でも構わない。
*'''{{Javadoc:SE|java/lang|System}}'''クラスは使用OS環境のAPIを直接扱うクラスである。そのクラスフィールドである'''{{Javadoc:SE|name=out|java/lang|System|out}}'''はコンソール出力系APIを扱うPrintStreamクラスのインスタンスである。このoutからPrintStreamクラスのprintlnメソッドをコールして、パラメータとして渡す文字列をコンソール画面に表示させる。
**mainメソッドには<code>'''static'''</code>キーワードをつけなければならない。<code>static</code>は、そのメソッドがクラスメソッドであることを示す。クラスメソッドは、[[クラス (コンピュータ)|クラス]]と関連するメソッドであり、[[オブジェクト (プログラミング)|オブジェクト]][[インスタンス]]に関連するメソッド([[インスタンスメソッド]])ではない。
**mainメソッドは<code>'''public'''</code>キーワードをつけて宣言する。publicは、そのメソッドが他のクラスのコードから呼び出せること、およびそのクラスが他のクラスから呼び出される可能性があることを、示す。ここでの「他のクラス」とは、そのクラスの継承階層に関係なく、他のすべてのクラスを意味する。
*印字出力機能は、Javaの標準[[ライブラリ]]に含まれている。'''{{Javadoc:SE|java/lang|System}}''' クラスは public static のフィールド '''{{Javadoc:SE|name=out|java/lang|System|out}}''' をもつ。<code>out</code> オブジェクトは、{{Javadoc:SE|java/io|PrintStream}} クラスのインスタンスであり、[[標準出力]]ストリームを表す。<code>PrintStream</code>クラスのインスタンスである <code>out</code> オブジェクトは、'''{{Javadoc:SE|name=println(String)|java/io|PrintStream|println(java.lang.String)}}''' メソッドを持つ。このメソッドはデータをストリームに出力する。[[ストリーム (プログラミング)|ストリーム]]とは入出力を[[抽象化 (計算機科学)|抽象化]]した概念である。この場合は、データを画面(<code>out</code> 、標準出力)に出力する。
*スタンドアロンプログラムを実行するには、Java実行環境に呼び出す対象となる main メソッドを持つクラスの名前を渡すことによって、Java実行環境に実行を指示する。 [[UNIX]]や[[Microsoft Windows|Windows]]の環境の場合は、カレント[[ディレクトリ]]から<code>java -cp . Hello</code>をコマンドラインで入力することで、この例のプログラム(Hello.classに[[コンパイル]]されたクラス)を実行することができる。
**実行するmainメソッドをもつクラス名の指定については、[[Jar|Javaアーカイブ]] (Jar) ファイルのMANIFESTに記述する方法もある。
 
=== スタンドアロン(GUIアプリ) ===
579 ⟶ 623行目:
{{独自研究|section=1|date=2019年3月}}
{{Main|Javaプラットフォーム}}
Javaプラットフォーム(''Java Platform'')は、Javaプログラムを開発または実行する為のソフトウェア群の総称であり、より具体的に言うと{{独自研究範囲|'''Java実行環境'''(JRE)と'''Java開発キット'''(JDK)と'''拡張それ以外のJavaテクノロジ'''のである|date=2019-03-07}}。{{独自研究範囲|拡張Javaテクノロジとは様々なIT分野においてJavaを基盤開発された関連するIT技術の総称である|date=2019-0304-0724}}。Javaプラットフォームは対象環境に合わせて、JREおよびJDKの構成内容と、追加される拡張Javaテクノロジの組み合わせを変えたエディションに編集されて公開されている。これらの各技術要素またはその総称をJavaテクノロジと呼ぶ。Javaテクノロジは公式権利元ベンダーだけでなくサードパーティ側からも提供されており、パーソナルコンピュータ、サーバーマシン、[[フィーチャーフォン]]、[[スマートフォン]]、[[タブレット (コンピュータ)|タブレット]]、組み込みシステム、マイクロコントローラ、スマートカードなどのあらゆる環境に対応したJavaプラットフォームが存在している。各技術の品質を評価して認証するJavaテクノロジの標準化は、公式ベンダーである[[オラクル (企業)|オラクル社]]([[サン・マイクロシステムズ|サン社]])を始めとする各企業各団体が参画する[[Java Community Process|Javaコミュニティプロセス]](JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されているので、各企業及び任意団体及び開発者各自が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。
 
=== エディション ===
{{いつ範囲|date=2019年3月|現在}}、Java権利元のオットフォームにクル社対象環境に合わせたJavaプラットフォームの4つの仕様セエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異存在する。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。
 
Javaプラットフォームの[[実装]]はいずれかの仕様に準拠し、互換性テスト({{仮リンク|Technology Compatibility Kit|en|Technology Compatibility Kit}})に合格する必要がある{{efn|受けない、合格しない場合は ''Java'' などの商標をはじめとする知的財産権の利用を認められない。}}。
 
; [[Java Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータなどのデスクトップクライアント環境向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。プロファイルとして組込システム開発者向けであの「Java SE Embedded」が存在する。
: 組み込みシステム向けのプロファイルとしてJava SE Embeddedが存在する。
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。プロファイルとしてWeb開発者向けの「Web Profile」が存在する。
: 2017年9月OracleJava EEの策定を今後のバージョンアップが[[Eclipse Foundation|エクリプス財団]]に移管すよって行われことを発表した<ref>{{Cite web|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update |title=Opening Up Java EE - An Update |date=2017-09-12 |publisher=Oracle |language=en |accessdate=2019-03-10}}</ref><ref>{{Cite web|url=https://www.infoq.com/jp/news/2017/11/towards-java-EE-at-eclipse |title=EE4J、EclipseファウンデーションがオープンソースJava EEを準備 |date=2017-11-16 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。Oracle[[クラウドコンピューティング]]技術への対応の急務その背景にあった。Java EEの商標は現行版のサポート手放さなかった続けるOracle社が保持しので新しい名称が投票エクリプス財団によって決められ、る今後のバージョンは'''Jakarta EE'''の名称で公開される事決定しなった<ref>{{Cite web|url=https://www.infoq.com/jp/news/2018/03/java-ee-becomes-jakarta-ee |title=Java EE は Jakarta EE となる |date=2018-03-05 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。
:; Web Profile
:: Webアプリケーション開発に焦点を当てた[[サブセット]]。Java EE 6から追加された。
:; Eclipse MicroProfile
:: [[マイクロサービス]]開発に焦点を当てた、Java EEのサブセットと追加仕様からなるプロファイル。Eclipse Foundationが主導するコミュニティベースの仕様だが、Java EEのEclipse Foundationへの移管に伴い、将来正式なプロファイルとなる可能性がある<ref>{{Cite web|url=https://www.eclipse.org/ee4j/faq.php#microprofile |title=EE4J FAQ | publisher=Eclipse Foundation |language=en |accessdate=2019-03-10 }}</ref>。
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
605 ⟶ 642行目:
{{Main|Java Runtime Environment}}
 
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。'''[[Java仮想マシン]]'''(''Java Virtual Machine'')と、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>を始めとする様々な'''スターター'''(Web用プラグインを含む)と、'''Javaクラスライブラリ'''(''Java Class Library'')で構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
 
エンドユーザはソフトウェアパッケージか、企業/団体サイトからのダウンロード、又はWEBブラウザ[[プラグイン]]を通してJava実行環境をインストールする。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
 
;Javaクラスライブラリ
615 ⟶ 650行目:
# 基礎ライブラリ - Java言語仕様の基礎を扱う。
# 入出力ライブラリ - ファイル入出力など。
# データコレクションライブラリ - 配列の操作と{{要検証範囲|date=2019年3月|順序収納List索引収納Set連想収納}}Mapなどのデータ集合。
# 数学ライブラリ - 各種計算。
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの[[国際化と地域化]]を扱う。
644 ⟶ 679行目:
{{main|Java Development Kit}}
 
Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するための基本的なソフトウェアである。[[Javaコンパイラ|コンパイラ]]、デバッガ、アーカイバ、ソフトウェアモニター、ドキュメントジェネレーターなどの'''基本開発ツール'''と、様々な'''開発支援ツール'''と、'''Java API'''(''Java Application Programming Interface'')で構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。
 
*J2SE 1.2.2_004 までは、JDK(''Java Development Kit'')と呼んでいた。
653 ⟶ 688行目:
;Java API
 
APIは、Application Programming Interface(アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、およびそれらに属するメソッド、フィールド、定数の集合である。またそのプロトコル(定義情報と使用方法)を指す。プログラマはこれを用いてアプリケーションソフトウェアの開発を行う。
 
# java.lang - Java言語仕様の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 配列の操作と{{要検証範囲|date=2019年3月|順序収納List索引収納Set連想収納}}Mapなどのデータ集合。
# java.math - 各種計算。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
688 ⟶ 723行目:
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*'''[[Apache Maven]]''' - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
*'''[[Gradle]]''' - [[Apache Ant]]や[[Apache Maven]]のコンセプトに基づくオープンソースビルド自動化システム。
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。
 
=== 様々なJavaの拡張テクノロジ ===
<!--================================================================================
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
拡張Javaプラットフォームの構成要素であるJavaテクノロジは様々な営利企業および任意、各団体、各開発者から、javaxパッケージまた様々な形で公開されている。具体的な実装形態として、主にorgパッケージなどのJava API、JREとJDKを中核にした拡張独自仕様コンテナの形態で提供されている。また様々なアリケーション、ログラム&ソフトウェアコンポーネントデータベースシステム、ネットワーク&通信プロトコル等を組み合わせたソフトウェア・統合システムとして公などがある。各発元から提示されている。以下た技術その代表例でありいずれも[[Java Community Process|Javaコミュニティプロセス(JCP)]]による審査を合格した後にJavaテクノロジの一つとし認証される。これを標準化され(''standardization'')と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。
 
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービス[[ディレクトリ・サービス|ディレクトリサービス]]へのアクセスを扱う
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキストの注釈を追加する
*[[JDBC]]<!--(Java Database Connectivity)--> - [[データベース]]接続の API
702 ⟶ 738行目:
*JAI (Java Advanced Imaging) - 画像を扱うための高水準なオブジェクト指向 API
*JAIN (Java API for Integrated Networks) - 統合された通信ネットワークの API
*JDMK (Java Dynamic Management Kit) - JMX仕様に基づいたアプリケーション開発支援するソフトウェア
*Jini - 分散システムを構築するネットワークアーキテクチャ
*Jiro - 分散した記憶装置を管理する技術
*JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術
*JML (Java Modeling Language) - [[契約による設計|契約による設計(DbC)]] (Design by contract) に基づいを指向し開発形式言語支援ソースコードに導入する技術
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 分散オブジェクト環境における機器・アプリケーション・ネットワークサービスの管理 / 監視を行う技術
*[[JavaServer Faces|JSF]] (JavaServer Faces) - Java EE によるウェブWEBクライプリケーショでユートに一定のデザインタフェースの簡易な開発に基づいたUI支援提供するサーバー用技術
*[[Java Native Interface|JNI]] (Java Native Interface) - Java から他の言語で実装されたネイティブなプログラムやライブラリコードを呼び出すための仕様技術
*[[JXTA]] - [[Peer to Peer]] (P2P) の仮想ネットワークのためのオープンプロトコル
*[[Java3D|Java 3D]] - 3次元グラフィクスプログラミングのための高水準な API [https://java3d.dev.java.net/ Java 3D]<!--([http://java.sun.com/products/java-media/3D/ ホーム]、[http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/ API])-->
*JOGL (Java OpenGL) - [[OpenGL]] を使う3Dグラフィクスプログラミングのための低水準な API
*[[LWJGL]] (Light Weight Java Game Library) - ゲーム開発するため低水準な API で、[[OpenGL]]、[[OpenAL]]、[[OpenCL]] および多を扱える。[[入力機器]]の制御機能ゲーム用コントローラー提供す扱え
*[[OSGi]] - サービスの動的な管理と遠隔保守<!--
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Shared Data ToolkitSound-->
*[http://community.java.net/javadesktop/ JavaDesktop]
*[[JavaOne]]
*[[BD-J|Blu-ray Disc Java]]
*[[FindBugs]] - javaソースコードからコーディングレベルのバグを発見する開発支援ツール。
*[[CheckStyle]]
 
=== Javaテクノロジの標準化 ===
{{Main|Java Community Process}}
 
Javaプラットフォームを形の構要素であるJavaテクノロジの標準化(''standardization'')は、[[Java Community Process|Javaコミュニティプロセス(JCP)]] (Java Community Process, JCP) に管理されてい。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPに参画すが発行してい事で数々の[[:Category:Java specification requests|Java仕様要求書(JSRs)]]によって、Javaテクノロジの標化カンファレンスに関与で拠すべた。[[ボーランド|ボーランド社]]、[[富士通]]、[[Apacheソフトウェア財団]]、[[ヒューレット・パッカード|ヒューレット・パッカード社]]なども参加し仕様規定と技術基準は逐一定められていJCPその中にはJavaプラットフォーム言語に追加される新たな言語仕様や技術を、JSRs (''Java Specification Requests'') と呼ばなどのコアテクノロジも含まる文書で公開していJava言語仕様標準APIして主に5.0版に関連したJSRsを以下に列挙する。
 
*[http://www.jcp.org/en/jsr/detail?id=14 JSR 14] ''Add [[総称型|Generic Types]] To The Java Programming Language'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=41 JSR 41] ''A Simple [[表明|Assertion]] Facility'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=47 JSR 47] ''[[ロギング|Logging]] API Specification''(J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=51 JSR 51] ''New I/O APIs for the Java Platform'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=59 JSR 59] ''J2SE Merlin Release Contents'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=121 JSR 121] ''Application Isolation API''
*[http://www.jcp.org/en/jsr/detail?id=133 JSR 133] ''Java Memory Model and Thread Specification Revision'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=166 JSR 166] ''Concurrency Utilities'' (J2SE 5.0)
738 ⟶ 770行目:
*[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] ''J2SE 5.0 (Tiger) Release Contents'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=201 JSR 201] ''Extending the Java Programming Language with [[列挙型|Enumerations]], [[オートボクシング|Autoboxing]], [[foreach文|Enhanced for loops]] and Static Import'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=203 JSR 203] ''More New I/O APIs for the Java Platform ("NIO.2") '' (Java SE 7)
*[http://www.jcp.org/en/jsr/detail?id=204 JSR 204] ''Unicode Supplementary Character Support'' (J2SE 5.0) - [[Unicode]] 3.1 のサポート
*[http://www.jcp.org/en/jsr/detail?id=244 JSR 244] ''Java EE 5 Specification'' (Java EE 5)
*[http://www.jcp.org/en/jsr/detail?id=270 JSR 270] ''Java SE 6 ("Mustang") Release Contents'' (Java SE 6)
*[http://www.jcp.org/en/jsr/detail?id=275 JSR 275] ''Physical Units/Quantities Support (Java SE) - JScienceをもとにした[[リファレンス実装]]''
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0)
 
772 ⟶ 800行目:
JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。
<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
 
== Javaへの批判 ==
{{出典の明記|section=1|date=2019年3月}}
<!-- WARN: 特定執筆者の無思慮かつ勝手な独断で内容が削除・改竄されすぎていて、まともな項目の体をなしていない。出典もまったくない。加えて、内容がまったく検証されておらず、間違った記述もかなり多い。また、古い内容だからといって削除するのはおかしい。たとえ古い内容であっても、歴史を振り返るうえでは重要なものもある。根拠となる出典を示せる場合、「以前は……という批判があったが、その後……となった」などの形で残すべき。 -->
{{main|Javaに対する批判}}
 
=== 言語設計 ===
{{see|[[C SharpとJavaの比較|C#とJavaの比較]]}}
 
=== 動作性能 ===
{{main|Javaの性能}}
<!-- WARN: 「それなり」「概ね」「それほど」といったあいまいな修飾語は避けるべき。 -->
{{要出典範囲|date=2019年3月|公開初期のJava仮想マシンは動作速度の遅さと必要メモリリソースの大きさを指摘される機会が多かったが、開発元の技術研鑽による[[ジャストインタイムコンパイラ|JITコンパイル]]の導入とその改善の積み重ねによって、ネイティブコード実行とさほど遜色の無い動作速度が得られるようになった。メモリ消費量にもそれなりの抑制が見られたが、こちらは仮想マシン機能の巧みな取捨選択で実現されているケースが多く、またある程度はハードウェア環境の進化にも依存していた}}。{{いつ範囲|date=2019年3月|現在}}のJava仮想マシンは{{要出典範囲|date=2019年3月|動作速度面で概ね好評を得ており、またメモリリソース面でもそれほど問題は指摘されていない}}。
 
=== ルックアンドフィール ===
<!-- これはJavaというよりはSwingに対する批判。 -->
[[ルック・アンド・フィール|ルックアンドフィール]] (look and feel) とは、アプリケーションにおけるグラフィカルユーザインタフェース (GUI) 部分の外観と振る舞いである。クロスプラットフォーム指向で開発されたJavaは、同時に特定のデザインに依存しない方針を貫いていたため、[[ウィジェットツールキット]]である[[Swing]]には独自のルックアンドフィール「Metal」が採用されていた。しかしこのルックアンドフィールは、各プラットフォームにおけるネイティブGUIアプリケーションのルックアンドフィールと大きく異なるため、馴染みにくさを指摘されることが多かった。Swingは[[プラグイン]]可能なルックアンドフィールの機構を備えており、サンはSwingの表示処理に適用できる[[Microsoft Windows|Windows]]、[[Classic Mac OS|Mac OS]]、[[Motif (GUI)|Motif]]といった各OSのルックアンドフィールを模倣したテーマを提供するようになった。これにより、アプリケーションはSwing既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールを利用できるようになった<ref group="注釈"><code>UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())</code>を呼び出すことで、システムネイティブのルックアンドフィールを適用できる。</ref>。
 
=== 移植性と互換性 ===
Javaは高い[[移植性]]と[[互換性]]を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の[[下位互換]]性・[[上位互換]]性が完全ではないことが問題として議論の対象になっている。Javaは高い移植性を保つため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。[[Java Native Interface]] (JNI) を経由することで、C/C++言語などを利用して特定のプラットフォーム固有あるいはプロセッサ独自の機能にアクセスすることはできるが、その場合はJavaによる移植性や互換性の恩恵は得られなくなる。
 
== Java認定資格 ==
803 ⟶ 811行目:
! 資格名 !! レベル !! 対象バージョン
|-
| Java Foundations Certified Junior Associate || <span style="display:none">0</span>Junior Associate || {{Template:Unknown}}
|-
| Oracle Certified Java Programmer, Bronze SE 7/8{{efn|日本でのみ行われている<ref>{{Cite web|url=https://www.atmarkit.co.jp/ait/articles/1209/27/news141.html |title=Java資格が大幅リニューアル。Bronze/Silver/Goldが登場 |accessdate=2019-03-07}}</ref>。}} || <span style="display:none">0</span>Bronze || Java SE 7/8
830 ⟶ 838行目:
=== 注釈 ===
{{Reflist|group=注釈}}
=== 出典 ===
{{reflist|2}}
 
847 ⟶ 855行目:
{{Commonscat|Java (programming language)}}
*[[Javaの文法]]
*[[キーワード (Java)|Javaのキーワード (予約語)]]
*[[Javaの性能]]
*[[キーワード (Java)に対する批判]]
*[[C SharpとJavaの比較|C♯とJavaの比較]]
*[[Javaプラットフォーム]]
*[[Java仮想マシン]]
*[[Java Platform, Standard Edition]] (Java SE)
*[[Javaコンパイラ]]
*[[Java Platform, Enterprise Edition]] (Java EE)
*[[Java Platform, Micro Edition]] (Java ME)
*[[Java仮想マシン]] - Javaプログラムを実行する[[仮想機械|仮想マシン]]
*[[Javaコンパイラ]] - Javaプログラムを[[Javaバイトコード]]に変換する[[コンパイラ]]
*[[Java Development Kit]] - [[Javaアプリケーション]]を開発するために必要な開発キット。
*[[Java Runtime Environment]] - [[Javaアプリケーション]]を実行するために必要な環境。
*[[Java Servlet]] - [[サーバ]]側で動的に[[ウェブページ]]などを生成するJava技術
*[[Javaアプレット]] - [[ウェブブラウザ]]上で実行されるアプリケーション。
*[[Java Web Start]] - [[Javaアプリケーション]]配布の簡便化を目指した技術。
*[[BD-J]]
*[[Java Community Process]] - Java技術の標準化プロセス
*[[JavaOne]]
 
== 外部リンク ==