「Java」の版間の差分
削除された内容 追加された内容
出典のない記述をリバート。 |
Goldensundown2 (会話 | 投稿記録) 編集の要約なし |
||
27行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、
Javaプログラムは特別な[[Javaバイトコード|バイトコード]]
Javaは、1995年に[[サン・マイクロシステムズ]]社のソフトウェア技術者[[ジェームズ・ゴスリン]]によって開発された。2010年にサン社は[[オラクル (企業)|オラクル]]社に吸収合併され、Javaの著作権もそちらに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年1月現在の最新メジャーバージョンは、2018年9月25日に公開された第11版となっている。
== 特徴 ==
=== 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'')
# 特定のプラットフォームに依存せず、また移植を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''executing with high performance'')
# インタプリタ(仮想マシン)式で、マルチスレッドで、コードを動的に再解釈できる(''interpreted, threaded, and dynamic'')
=== オブジェクト指向プログラミング ===
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では[[スレッド (コンピュータ)|スレッド]]を言語仕様で規定しており、[[マルチスレッド]]による[[並行計算]]や[[マルチコア]]CPUを活かした[[並列計算]]を、従来の言語と比べて簡単に実装できる。
=== ガベージコレクション ===
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では、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
Javaは「[[パッケージ (Java)|パッケージ(''package'')]]」という[[名前空間]]を持つ。これはクラスとインターフェースを文字列レベルで分類し、またクラス名定義の衝突を回避する為の機能である。パッケージ名は任意の数だけカンマで繋ぐ事が出来る。実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際は、先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、パッケージ内のクラスをデフォルト指定出来るので短いコード記述が可能となる。
== 歴史 ==
289 ⟶ 364行目:
* [[Webサービス]]
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月時点で未定である。
==
{{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プログラムの開発を支援する基本的なソフトウェアであり、多くの開発ツールが含まれている。
====
Java実行環境は、[[Javaクラスライブラリ|標準クラスライブラリ]]と[[Java仮想マシン]]、およびいくつかのファイルとソフトウェアから構成される。
*Java[[クラス (コンピュータ)|クラス]][[ライブラリ]]群(標準クラスライブラリ)
679 ⟶ 633行目:
*ライセンス文書および各種の文書
==== プログラムの実行形態 ====
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 がある。
=== Java開発キット(JDK) ===
{{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) の呼称は、これまでに何度か変更されている。
*J2SE 1.2.2_004 までは JDK と呼んでいた。
*J2SE 1.4 までは Java 2 SDK と呼んでいた。
*J2SE 5.0 では 再び JDK と呼んでいる。
====
*[[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 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社がExcelsior JETというahead-of-timeコンパイラを販売している[http://www.excelsior-usa.com/jet.html]。Java SE 用に書かれたプログラムを [[Microsoft Windows|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 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)
==
{{main|Javaに対する批判}}
978 ⟶ 944行目:
*[http://www.computer-books.us/java.php Computer-Books.us] {{Ref-en}} - Java の複数の書籍(無償でダウンロード可能)
===
'''プロプライエタリ'''
*[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}}
|