「Java」の版間の差分
Goldensundown2 (会話 | 投稿記録) |
|||
(同じ利用者による、間の1版が非表示) | |||
425行目: | 425行目: | ||
*mainメソッドにはString配列の引数が渡される。Stringは文字列オブジェクトである。OS側はプログラム実行時のパラメーターのそれぞれをStringオブジェクトにして配列に格納しmainメソッドの引数とする。引数名はargsとするのが標準である。プログラマは引数として渡されたString配列から実行時パラメーターを読み出す。 |
*mainメソッドにはString配列の引数が渡される。Stringは文字列オブジェクトである。OS側はプログラム実行時のパラメーターのそれぞれをStringオブジェクトにして配列に格納しmainメソッドの引数とする。引数名はargsとするのが標準である。プログラマは引数として渡されたString配列から実行時パラメーターを読み出す。 |
||
*mainメソッドはリターン値を返さないので、voidとする。 |
*mainメソッドはリターン値を返さないので、voidとする。 |
||
*mainメソッドはクラスメソッドなので、staticとする。 |
*mainメソッドはクラスメソッドなので、staticとする。クラスメソッドはインスタンスを必要としない。 |
||
*mainメソッドはクラス内外の全領域から呼び出し可能な、publicとする。 |
*mainメソッドはクラス内外の全領域から呼び出し可能な、publicとする。 |
||
*'''{{Javadoc:SE|java/lang|System}}'''クラスは使用OS環境のAPIを直接扱うクラスである。そのクラスフィールドである'''{{Javadoc:SE|name=out|java/lang|System|out}}'''はコンソール出力系APIを扱うPrintStreamクラスのインスタンスである。このoutからPrintStreamクラスのprintlnメソッドをコールして、パラメータとして渡す文字列をコンソール画面に表示させる。 |
*'''{{Javadoc:SE|java/lang|System}}'''クラスは使用OS環境のAPIを直接扱うクラスである。そのクラスフィールドである'''{{Javadoc:SE|name=out|java/lang|System|out}}'''はコンソール出力系APIを扱うPrintStreamクラスのインスタンスである。このoutからPrintStreamクラスのprintlnメソッドをコールして、パラメータとして渡す文字列をコンソール画面に表示させる。 |
||
562行目: | 562行目: | ||
== Javaプラットフォーム == |
== Javaプラットフォーム == |
||
Javaプラットフォーム(''Java Platform'')は、'''Java実行環境'''(JRE)と'''Java開発キット'''(JDK)と'''拡張テクノロジ'''の総合である。拡張テクノロジとは様々なIT分野にJavaを |
Javaプラットフォーム(''Java Platform'')は、'''Java実行環境'''(JRE)と'''Java開発キット'''(JDK)と'''拡張テクノロジ'''の総合である。拡張テクノロジとは様々なIT分野においてJavaを基盤に開発された技術群である。Javaプラットフォームは対象環境に従い、JREおよびJDKの構成内容と、追加される拡張テクノロジの組み合わせを変えたエディションに編集されて提供される。これらの各技術要素またはその総称をJavaテクノロジと呼ぶ。Javaテクノロジは公式ベンダーだけでなくサードパーティ側からも提供されており、スマホ、パソコン、サーバーマシン、エンベデッドシステム、マイクロコントローラ、スマートカードなどのあらゆる環境に対応したJavaプラットフォームが存在している。各技術の品質を評価して認証するJavaテクノロジの標準化は、公式ベンダーである[[オラクル (企業)|オラクル社]]([[サン・マイクロシステムズ|サン社]])を始めとする各企業各団体が参画する[[Java Community Process|Javaコミュニティプロセス]](JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されている為、各企業及び各任意団体が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。 |
||
=== エディション(版) === |
=== エディション(版) === |
||
現在、Javaプラットフォームには |
現在、Javaプラットフォームには対象環境に合わせた4つのエディションが存在する。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。なお、JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。 |
||
;スタンダード版(''Java Platform Standard Edition'') |
;スタンダード版(''Java Platform Standard Edition'') |
||
587行目: | 587行目: | ||
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。 |
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。 |
||
# 基礎ライブラリ - Java言語仕様の基礎を扱う。 |
|||
# 入出力ライブラリ - ファイル入出力など。 |
|||
# データコレクションライブラリ - 配列の操作と順序収納、索引収納、連想収納などのデータ集合。 |
|||
# 数学ライブラリ - 各種計算。 |
|||
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどを扱う。 |
|||
# ネットワークライブラリ - ソケットを置いてリモートポートを開きストリーム入出力を扱う。 |
|||
# GUIライブラリ - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。 |
|||
* グラフィックユーザーインターフェースライブラリ |
|||
# Javaアプレットライブラリ - アプレット生成用。 |
|||
# Javaビーンズライブラリ - Java版ソフトウェアコンポーネント作成用。 |
|||
# リモートメソッドライブラリ - 外部マシン上にあるプロセス・メソッドを呼び出す。 |
|||
# セキュリティライブラリ - 様々な通信セキュリティプロトコルを扱う。 |
|||
# バッファストリームライブラリ - 連続バイトデータを扱う。 |
|||
#データベース接続ライブラリ - SQLを扱う。 |
|||
# リフレクションライブラリ - クラス定義を動的に操作する。 |
|||
;Javaアプリケーションの形態 |
;Javaアプリケーションの形態 |
||
608行目: | 608行目: | ||
:スマホ、モバイルPC、パソコンのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。 |
:スマホ、モバイルPC、パソコンのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。 |
||
;[[Javaアプレット]](applet) |
;[[Javaアプレット]](applet) |
||
:サーバーからダウンロードされてウェブブラウザ上で実行されるJavaプログラム。 |
:サーバーからダウンロードされてウェブブラウザ上で実行されるJavaプログラム。[[サンドボックス (セキュリティ)|サンドボックス]]機能下で厳しい動作制約が加えられている。Javaの汎用仕様上の制限から起動や動作の軽快さに難があり、その改善機会も某社との企業戦略上の確執から失われ、WEBブラウザ向けに特化していた他メディアに押されてさほど普及しなかった。 |
||
;[[Java Servlet|Javaサーブレット]](servlet) |
;[[Java Servlet|Javaサーブレット]](servlet) |
||
:サーバーマシンで実行されるJavaプログラム。クライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。 |
:サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。 |
||
;[[JavaServer Pages|Javaサーバーページ]] (java server page) |
;[[JavaServer Pages|Javaサーバーページ]] (java server page) |
||
:サーブレットをWEBサーバー用に特化したものであり、[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、[[JavaScript]]の様にブラウザ側で実行するスクリプトではない。類似の技術に[[Active Server Pages]]、[[PHP (プログラミング言語)|PHP]]がある。 |
:サーブレットをWEBサーバー用に特化したものであり、[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、[[JavaScript]]の様にブラウザ側で実行するスクリプトではない。類似の技術に[[Active Server Pages]]、[[PHP (プログラミング言語)|PHP]]がある。 |
||
627行目: | 627行目: | ||
APIは、アプリケーション・プログラミング・インターフェスの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インターフェース、メソッド、フィールド、コンスタントバリューの総合である。またそのプロトコル(定義情報と使用方法)を指す。プログラマはこれを用いて開発を行う。 |
APIは、アプリケーション・プログラミング・インターフェスの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インターフェース、メソッド、フィールド、コンスタントバリューの総合である。またそのプロトコル(定義情報と使用方法)を指す。プログラマはこれを用いて開発を行う。 |
||
# java.lang - Java言語仕様の基礎を扱う。 |
|||
* java.lang |
|||
# java.io - ファイル入出力など。 |
|||
* java.io |
|||
# java.util - 配列の操作と順序収納、索引収納、連想収納などのデータ集合。 |
|||
* java.util |
|||
# java.math - 各種計算。 |
|||
#java.text - 暦、日付、時間、通貨、文字コードなどを扱う。 |
|||
*java.text |
|||
# java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。 |
|||
* java.net |
|||
# java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。 |
|||
* java.awt |
|||
# java.applet - アプレット生成用。 |
|||
# java.beans - Java版ソフトウェアコンポーネント作成用。 |
|||
* java.beans |
|||
# java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。 |
|||
* java.rmi |
|||
# java.security - 様々な通信セキュリティプロトコルを扱う。 |
|||
* java.security |
|||
# java.nio - 連続バイトデータを扱う。 |
|||
* java.nio |
|||
#java.sql - SQLを扱う。 |
|||
#java.lang.reflect - クラス定義を動的に操作する。 |
|||
;統合開発環境と開発支援ツール |
;統合開発環境と開発支援ツール |
2019年3月5日 (火) 02:14時点における版
パラダイム | オブジェクト指向・構造化・手続き型 |
---|---|
登場時期 | 1995年 |
設計者 | Java Community Process |
開発者 | オラクル(サン・マイクロシステムズ) |
最新リリース | Java Standard Edition 11.0.2/ 2019年1月15日 |
型付け | 強い静的型付け |
主な処理系 | コンパイラ(JDK、OpenJDKなどのjavac、gcjなど)、バイトコードインタプリタ(JDK、JRE、MSJVM、OpenJDKなど多数) |
影響を受けた言語 | Objective-C, Smalltalk, C++, Eiffel, C# |
影響を与えた言語 | C#, D, Dart, Groovy, Scala, Kotlin, Ceylon |
プラットフォーム |
Solaris, Linux, Windows, macOS, AIX, System i, 各種の組み込みシステムほか多数 |
ウェブサイト | java.com |
拡張子 | java, class, jar |
Java(ジャバ)は、狭義ではプログラミング言語のJavaを指し、広義ではJava言語を中心にしたコンピューティング・プラットフォームを意味する[1]。後者はJavaプラットフォームと呼ばれ、その関連技術はJavaテクノロジと総称されている[2]。Javaの構文はC言語に類似しており、オブジェクト指向と並行コンピューティングが主なパラダイムとして導入されている。Javaテクノロジの主な目標は、従来のソフトウェアが抱えていた移植性問題の解決であった。"Write once, run anywhere"(一度書けばどこでも動く)をキャッチコピーにし、特定の環境に依存しない理想的なクロスプラットフォーム・プログラムの実現を目指して公開された。
Javaプログラムは特殊なバイトコードにコンパイルされて、Java仮想マシンと呼ばれるソフトウェア上で実行される。各コンピュータ環境に対応したJava仮想マシンがハードウェア間の差異を吸収し、特定の環境に依存しないプログラム動作を実現する仕組みとなっている。Java登場初期の対象であった家電機器の組み込みシステムを始め、マイクロ制御装置、携帯機器、パーソナルコンピュータ、サーバーマシン、スマートカードといった様々な環境にJavaソフトウェアは普及している。
Javaは、1995年にサン・マイクロシステムズ社によって公開された。2010年にサン社はオラクル社に吸収合併され、Javaの各種権利もそちらに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年3月現在の最新メジャーバージョンは、2018年9月25日に公開された第11版となっている。
特徴
Javaの理念
Javaは以下の5つの理念に基づいて開発された[3][出典無効]。
- 言語仕様はシンプルで、オブジェクト指向で、見慣れたものにする(simple, object-oriented, and familiar)
- 堅牢(エラー動作の抑止)で安全(不正アクセスの防止)にする(robust and secure)
- プラットフォーム非依存で、移植を容易にする(architecture-neutral and portable)
- 高いパフォーマンスで動作する(executing with high performance)
- インタプリタ(仮想マシン)式で、マルチスレッドで、コードを動的に再解釈できる(interpreted, threaded, and dynamic)
(1)に関しては、C言語をモデルにした構文が採用され、予約語を少なくしている。オブジェクト指向はクラスベースとしたが、メッセージベースを実装できるAPIも追加された。(2)に関しては、ポインタ、アドレス直指定変数、多重継承、ジェネリクス、演算子オーバーロードなどを破棄し、強い型定義、例外処理、ガーベジコレクタなどを採用した。動作上の堅牢性は仮想マシンと不正コードチェックを兼ねたクラスローダを根幹とし、これは同時にプログラムをサンドボックス化して基礎レベルからのセキュリティを確立した。(3)と(4)はJava仮想マシンの技術に依存した。(5)に関しては、マルチスレッドの取り扱いはsynchronized
ブロックと3つの予約語というシンプルな設計でまとめられた。ダイナミック性は様々に解釈できるが、多重ディスパッチはinstanceof
演算子とダウンキャストと例外処理の活用で実装でき、動的ディスパッチはserializable
インターフェースとリフレクションAPIの活用で表現できた。
オブジェクト指向
Javaはクラスベースのオブジェクト指向プログラミング言語である。オブジェクト指向とは、現実世界をモデル化する手法のひとつであり、データ(状態)とそれに関連する振る舞い(処理)をまとめてオブジェクト(物体)として扱う。
Javaのプログラムは複数のクラスから構成される。オブジェクト指向におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化したオブジェクトはインスタンスと呼ばれる。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスはカプセル化・継承・ポリモーフィズムをサポートする。
Javaでは、クラスに定義する状態を「フィールド」(インスタンス変数)と呼び、振る舞いを「メソッド」と呼ぶ。それぞれ、C++で「メンバー変数」「メンバー関数」と呼ばれているものに相当する。なおJavaのオブジェクト指向は、Smalltalkに代表されるようなメッセージパッシングによるオブジェクト指向ではなく、C++に代表されるようなクラス機構を中心としたオブジェクト指向である。後者は、限られた計算機資源でもオブジェクト指向を実現できるというメリットがある。
継承とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。継承は拡張とも呼ばれ、Javaのクラス構文では継承の際にextends
キーワードが使われる。Javaのクラスはすべて、暗黙的に基底クラスjava.lang.Object
から派生する。また、C++のような実装の多重継承はサポートせず、単一継承のみをサポートする。ただし、クラスは複数のインタフェースを実装 (implements
) することができる。Javaのインタフェースは、C++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である。ただし、Java 8以降はインタフェースのデフォルト実装により、実装の多重継承も限定的にサポートするようになった。実装の多重継承をサポートしないという設計思想は、C#などでも採用されている。
Javaで扱うデータ / オブジェクトの型(データ型)は、強い静的型付けを採用している。静的型付けにより、Javaのコンパイラおよび実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。
Javaのデータ型には、大別して参照型 (reference type) とプリミティブ型(原始型、primitive type)の2種類がある。Javaのオブジェクトはすべて参照型である。一方、Javaのプリミティブ型はオブジェクトではなく、単純な構造のデータ(数値、論理値、文字など)を扱うための型である。Javaの標準ライブラリは、ボックス化によりプリミティブ型の値をオブジェクトとして扱えるようにするためのプリミティブラッパークラスを提供している。
- Java 1.5 (J2SE 5.0) 以降は、コンパイラが自動的にプリミティブ型のデータとそれに対応する参照型(プリミティブラッパークラス)のオブジェクトとの間の変換を行う。これを自動ボックス化/自動ボックス化解除(オートボクシング/オートアンボクシング)と呼ぶ。これにより、プリミティブ型と対応する参照型の2種類のデータ型が存在することによる複雑さや煩雑さは軽減されているが、性能面での変化はない。
- Java 1.5以降は、総称型によるジェネリックプログラミングをサポートするようになった。これにより、プログラマによる明示的な型変換を減らすことができ、安全性が向上した。
なお、Javaは純粋なオブジェクト指向言語ではなく、オブジェクト指向を強制しない[4]。すべてのデータおよび処理は何らかのクラスに属していなければならないという制約はあるが、静的フィールド、静的メソッド、静的インポートなどを使うことで、必要に応じて手続き型プログラミングのスタイルをとることも可能であり、オブジェクト指向プログラミングのスタイルを採用するかどうかはプログラマの裁量にゆだねられている。
プラットフォーム非依存
![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/GC_SwingDemo.jpg/250px-GC_SwingDemo.jpg)
Javaのもう一つの特徴はプラットフォームに依存していないことであり、これは、Javaのプログラムがさまざまなハードウェアやオペレーティングシステム上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。近年[いつ?]では、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、などのプログラミング言語でプログラムを書く方法もある。
サン・マイクロシステムズのJavaのライセンスは、すべてのJava実行環境の実装は「互換性」を備えるべきであることを要求していた。このことに関連して、サン・マイクロシステムズとマイクロソフトとの間で法的な争いが起こったことがあった。この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。
サンは訴訟を起こして勝訴し、約2000万ドルの違約金の支払いを受けた。また裁判所は、マイクロソフトに対してサンのライセンス条件に従うことを命じた。この決定を受けて、マイクロソフトは自社のOSであるWindowsにJava実行環境を同梱しない方針を採った。また近年[いつ?]のバージョンのWindowsでは自社のウェブブラウザであるInternet ExplorerでJavaをサポートしないようにした。その結果、Internet ExplorerでJavaアプレットを動かすためには、別途にプラグインが必要となった。しかし、サンなどの企業は、近年[いつ?]のバージョンのWindowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどのWindows PCのユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。
最初期のJava実行環境の実装では、Javaプログラムの実行速度が遅かったが、近年[いつ?]では大きく改善されて、高速に実行できるようになった。最初期のJava実行環境のJava仮想マシンの実装は、移植性を実現するためにインタプリタとして動作する仮想マシンを採用した。こうした初期のJava実行環境の実装では、Javaプログラムの実行速度がCやC++のプログラムと比べて遅かった。そのため、Javaプログラムの実行速度は遅いという評判が広まった。近年[いつ?]のJava実行環境の実装では、いくつかの技術を導入することにより、以前[いつ?]と比べて、Javaプログラムをかなり高速に実行できるようになった。
Javaプログラムを高速に実行するために使われる技術を説明する。
- Java仮想マシンに高速化の技術を導入する。
- Java仮想マシンにジャストインタイムコンパイル方式(JITコンパイル方式)を導入する。ジャストインタイムコンパイラは、Javaプログラム(バイトコード)の実行時に、バイトコードをネイティブコードに変換する。
- さらに洗練されたJava仮想マシンでは「動的再コンパイル」(dynamic recompilation) を行う。こうしたJava仮想マシンでは、実行中のプログラムを分析して、プログラムの重要な部分を特定して再コンパイルを行い最適化する。動的再コンパイルは、静的コンパイルよりも優れた最適化を行うことができる。その理由は、動的再コンパイルは、実行環境と実行中にロードされているクラスに関する情報に基づいて最適化しているからである。
- Java仮想マシンに世代別ガベージコレクションの技術を導入してガベージコレクションを効率化する。
- あるいは、先に述べたように、Javaのソースコードを、従来の言語のコンパイラと同様に、単純にネイティブな機械語コードにコンパイルする。この場合、バイトコードを生成する過程は全く省かれる。この技術を使うと、良好な実行速度を得ることができる。ただし移植性(プラットフォーム非依存)は損なわれる。Java仮想マシンにジャストインタイムコンパイルと動的再コンパイル、世代別ガベージコレクションの技術を導入することにより、Javaプログラムは、移植性を保ちつつ、ネイティブコードと同水準で高速に実行することができるようになった。
Java の移植性(プラットフォーム非依存性)がどの程度実現できているかについては、議論の対象となっている。技術的には、移植性とは実現が難しい目標である。多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは、可能である。しかし実際には、Javaを利用できるプラットフォームによってはちょっとしたエラーが発生したり、微妙に異なる動作をしたりする事例が多い。こうしたことから一部の人々は、サン・マイクロシステムズのJavaの売り文句であった "Write once, run anywhere"(一度コードを書けば、どの環境でも動く)をもじって "Write once, debug everywhere"(一度コードを書けば、どの環境でもデバッグが必要)と皮肉をいわれることがある。[要出典]
しかし、Javaのプラットフォーム非依存性は、サーバ側や組み込みシステムのアプリケーションに関しては成功を収めている。サーバ側 (Java EE) では、Java のサーブレット、Webサービス、EJB (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 (Java ME) を使ったOSGiを基にした開発が広く行われている。
マルチスレッド
Javaではスレッドを言語仕様で規定しており、マルチスレッドによる並行計算やマルチコアCPUを活かした並列計算を、従来の言語と比べて簡単に実装できる。
ガベージコレクション
Javaはガベージコレクション機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、プログラマの負担が完全に解消されるわけではないものの、大きく軽減される。近年[いつ?]のJavaでは世代別ガベージコレクションというより効率的な技術を導入している。
ガベージコレクションを備えていないC++やその他の言語の場合、プログラマが適切にメモリの管理をしなければならない。オブジェクト指向プログラミングをするプログラマは一般に、Javaと同様メモリ内のヒープにオブジェクトを格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合に、必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不十分なプログラムでは、メモリリークが発生する可能性がある。メモリリークとは、不適切な指示などで、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことで、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。プログラマは任意の時点でオブジェクトを生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任を持つ。
プログラム(オブジェクト)は、他のオブジェクトへの参照を持ち、そのオブジェクトのメソッドを呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内のヒープという領域上に確保されたそのオブジェクトを指すアドレスのことである。
オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリ量が減っていくメモリリークを防ぐ。
ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。プログラマが、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装されたJava仮想マシンを使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。
C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
ネットワーク機能
Javaでは充実したライブラリにより、コンピュータネットワークを使うソフトウェアを、効率良く開発できる。Javaの初期のバージョンから、TCP/IP (IPv4) のライブラリを備えており、ネットワークでソケット通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになった。Java RMIもしくはCORBAの分散オブジェクト技術を標準で使うことができる。近年[いつ?]では、標準、拡張その他のライブラリにより、さまざまなネットワークプロトコルを高水準で扱えるようになっている。
- FTP(ファイル送受信)
- HTTP(ウェブによるデータ送受信)
- SMTP/POP/IMAP、NNTP(電子メール送受信、ネットニュース)
- SSH、TLS/SSL(セキュアな通信により盗聴やなりすましを防ぐ)
- SMB(ファイルサーバへのアクセス)
- ほか
XML文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。
セキュリティ
Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード(Javaアプレット)を安全に実行できるよう設計されていた。
- Java仮想マシンのバイトコード検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
- Java実行環境のクラスローダ機能により、クラス(バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
- Java実行環境のセキュリティマネージャ機能(サンドボックス)により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
- Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。
その他
Javaは「例外処理」の言語仕様を備えており、プログラム実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述できる。
Javaでは、C/C++のような、整数とポインタの相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
Javaは「パッケージ」という名前空間を持つ。これはクラスとインターフェースを文字列レベルで分類し、またクラス名定義の衝突を回避する為の機能である。パッケージ名は任意の数だけピリオドで繋ぐ事が出来る。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定出来るので短いコード記述が可能となる。
歴史
![]() |
この節では次の構成でJavaの歴史と近況を説明する。
- #草創と#インターネットの世界へで、Javaの最初の正式なバージョンが公開されるまでの歴史を述べる。
- #2000年代の動向で、その後から2000年代までの動向をいくつかの側面から述べる。
- #バージョン履歴で、最初のバージョン以降のJava (JDK, Java SE) のバージョンの履歴を述べる。
草創
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Duke3D.png/220px-Duke3D.png)
Duke は2006年のJavaのオープンソース化発表と同時にBSDライセンス付与のオープンソース化が行われており、ウィキペディアに掲載することが可能である
Javaプラットフォームおよびプログラミング言語Javaは、1990年12月にサン・マイクロシステムズが1つの内部プロジェクトを立ち上げたことから始まった。この内部プロジェクトでは、C/C++の代替となるプログラミング言語を開発した。この言語は、プロジェクトで Greenオペレーティングシステム (Green OS) と共に、同OSの標準言語として開発された。この言語は、1992年頃プロジェクト内ではOakと呼ばれていたが、後にJavaの呼称に変更されることになる。呼称変更の理由は、Oakはすでに別の会社が商標として使っていたからである。
1990年頃、サンのエンジニア、パトリック・ノートンは、自社のプログラミング言語C++とCのアプリケーションプログラミングインタフェース(API)と開発ツールに不満を募らせていた。その頃、NeXTが注目を浴びていたことがきっかけとなって、ノートンはサンでプログラミング環境の開発の仕事をすることになった。NeXTワークステーションと、その環境であるNEXTSTEPでは、主力の言語としてObjective-Cが開発されていた(余談になるが、その「直系の子孫」に当たるのは、macOSおよびiOSと、Swiftである)。こうした経緯のなかで「ステルスプロジェクト」が始まった。
ステルスプロジェクトには、始まってすぐにジェームズ・ゴスリンとマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。プロジェクトには他のエンジニアたちも参加し、彼らはアメリカ合衆国カリフォルニア州メンローパーク市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。プロジェクトの目的は、次世代の家電製品のための新しいプログラミング言語を設計し、その処理系を開発することだった。サンはこの分野が重要な市場になると予測していた。
プロジェクトチームでは当初はC++を検討していたが、いくつかの理由から却下された。理由は、当時の彼らの目的が、家電製品すなわち組み込みシステムだったからである。組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。彼らはC++ではコンピュータ資源を食いすぎると判断した。またC++は複雑なプログラミング言語であり、C++を使うプログラマは注意していても間違いを犯しがちである。
C++にはガベージコレクションの機能が無い。ガベージコレクションが無いということは、プログラマが自分でオブジェクトの寿命(生存期間)を管理しなければならないことを意味する。プログラマが自分でオブジェクトの寿命を管理することは、冒険的で間違いやすい作業である。
プロジェクトチームは、いくつかの重要な機能についてC++の移植性が乏しいことも問題であると考えた。 このプロジェクトでの重要な機能とは、セキュリティおよび分散コンピューティング、マルチスレッドであり、これらの機能が、プラットフォームに依存せずに使える必要があった。このような事情で、彼らはあらゆる機器に容易に移植できるプラットフォームが必要であると認識するようになった。
一方で、サンの別のエンジニア、ビル・ジョイは、ゼロックスのパロアルト研究所でAltoというワークステーション試作機のために開発されたプログラミング言語・MesaとCの良いとこどりをした新しいプログラミング言語を構想していた。ジョイは Further という名前で呼ばれる論文を書き、自社でC++に基づいたオブジェクト指向環境を開発するべきであることを進言した。まずジェームズ・ゴスリンがC++を改変し拡張することを試みた。ゴスリンはこの拡張版C++を、"C++ ++ --"と名付けた。しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。ゴスリンはこの新しい言語にOakという名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばにオークの木が立っていたことによる。
プロジェクトチームは残業までして作業を続け、1992年の夏までに新しいプラットフォームを、Green OS、Oak言語、ライブラリ、ハードウェアによって部分的なデモンストレーションができるようになった。1992年9月3日の最初のデモンストレーションでは、チームは Star7という携帯情報端末機器を開発することに力点をおいていた。この機器の名称の由来は、電話機能が *7 とボタンを押すことで有効になることによる。
この機器は、グラフィカルなインタフェースを備え、"Duke" という名前の知的な仮想代理人が利用者を支援した。同年11月、サンはグリーンプロジェクトを分離して完全子会社のFirstPerson, Incを設立した。それにともないチームはパロアルトに引っ越した。FirstPersonチームは、高度にインタラクティブな機器に関心を持っていた。そのおりタイム・ワーナーがケーブルテレビのセットトップボックスのRFP (Request For Proposal) を公表していた。そこでFirstPersonチームは自分たちの目標を変更し、タイム・ワーナーの RFP に応じてセットトップボックスの提案を提出した。しかし、FirstPersonは入札でシリコングラフィックス(SGI)に負けた。その後に3DO社のセットトップボックスの案件もあったが、契約には至らなかった。FirstPersonはテレビ業界では利益を出すことができず、サンはFirstPersonを解散してチームを自社に戻した。
インターネットの世界へ
1994年の6月から7月にかけて、ジョン・ゲージと、ジェームズ・ゴスリン、ビル・ジョイ、パトリック・ノートン、ウェイン・ロジン、エリック・シュミットの間で、3日間かけてブレインストーミングを行い、プロジェクトチームはウェブの世界に主眼を置くという方針変更を行う。彼らは、革新的なウェブブラウザであるNCSA Mosaicの出現を目の当たりにし、ウェブを含むインターネットの世界は、ケーブルテレビの世界に劣らず、高度にインタラクティブな媒体に発展しつつあると認識するようになった。Oakを使ったプロトタイプとして、ノートンはWebRunnerという小さなウェブブラウザを開発。このウェブブラウザの名称は後に HotJava と変更される。ウェブページにJavaアプレットという小さなJavaプログラムを埋め込んでおいて、ウェブブラウザHotJavaでそのページにアクセスすると、HotJava上でアニメーションの表示やマウスによるインタラクティブな操作ができた。
同年、チームはOakの名称をJavaに変更する。変更の理由は、商標を調べて、"Oak" という名前がすでにビデオカードアダプタの製造会社 (Oak Technology) によって使われていたことが判明したからである。Javaという名称は、一部のチームメンバーがよく出入りしていた近くのコーヒーショップで命名されたという。 この名称が、何かの頭字語であるかどうかについては、よく分かっていない。
- 頭字語ではないとの説が一般的に受け入れられている。
- 近くのコーヒーショップで供されていたコーヒーのブランドに由来すると考える人が多い。その根拠は、Javaクラスファイル(バイトコード)の最初の4バイトが十六進記数法で必ず0xCAFEBABEとなっていることである。
- また、アメリカ英語においてはcoffeeを意味する一般名詞である。
- ただし一部では、James Gosling, Arthur Van Hoff, and Andy Bechtolsheimの頭字語との説がある。
- また、Just Another Vague Acronymの頭字語との説もある。
1994年10月に、HotJavaとJavaプラットフォームが、サン・マイクロシステムズの幹部社員の前でデモンストレーションされた。そして1994年内に Java 1.0a(アルファ版)がダウンロードできるようになる。
JavaとHotJavaが最初に公的な場で公表されたのは、1995年5月23日のSunWorldカンファレンスだった。サンは、ウェブブラウザHotJava中で、Javaアプレットにより、ウェブページ内でアニメーションの表示やマウスによるインタラクティブな操作が可能であることをアピールした。カンファレンスでアナウンスを行ったのは、サンの技術部長ジョン・ゲージである。このカンファレンスではまた、ゲージのアナウンスに関連する、当時のネットスケープコミュニケーションズの上級副社長マーク・アンドリーセンによるアナウンスが人々を驚かせた。それは、ネットスケープが自社のウェブブラウザであるNetscape NavigatorにJavaの実行機能を追加する予定だというものだった。このアナウンスにより業界の耳目を集める話題となった。
1995年秋にはJava 1.0のベータ版が公開された。1996年1月9日にサンは、JavaSoft部門を立ち上げた[5]。その2週間後に、最初の正式バージョンであるJava 1.0がリリースされた。
2000年代の動向
Javaの最初のバージョンが公開されてから2000年代までの動向を、いくつかの側面から述べる。なお、Javaの開発元であるサン・マイクロシステムズはこの後の2010年1月にオラクルにより買収されており、Javaに関する権利も同社に移転している。
Webクライアント上
Javaアプレットは、WWWブラウザで動作するJavaプログラムであり、クライアントサイドのウェブアプリケーションの実装方法のひとつとして広く使われている。いくつかの有力な競合が存在する。競合技術の代表としてMicrosoft ActiveXおよびAdobe Flashが挙げられるが、これらはいずれも衰退している。
なお、Javaの最初の普及期であった20世紀末の頃には圧倒的なシェアを持っていた、Microsoft Windows 95上でのInternet Explorerが、Javaアプレットを使用したページを表示しようとする際に、VMの起動のために、数十秒〜数分間操作を受け付けなくなったことが(なお、起動してしまえば実際には高性能だったのだが)、「Javaは重い」という風評の根源である。その後は、携帯端末等を含めれば、Windowsのシェアが圧倒的という状況が順調に消滅したため、IEのシェアが圧倒的ということも無くなり、一方でそのような風評のせいで、Javaの利用先としてサーバサイドが注力されたこともあり、遅いなどと言われることもほとんどなくなった。
簡単でインタラクティブなアニメーション用には、JavaアプレットよりもGIF89aやAdobe Flashを採用する事例が多い。この分野においては、最近[いつ?]ではAjaxも普及しつつある。Ajaxアプリケーションの作成に欠かせないJavaScriptの開発では、Java開発で一般的に用いられているほどドキュメントや技術が成熟した標準ライブラリ、サードパーティーライブラリ、IDE、単体テストツールなどの開発環境がないが、Java開発環境を利用してJavaScriptによるAjaxウェブアプリケーションを開発するツールとしてGoogle Web Toolkitを用いることができる。GWTコンパイラはJavaソースコードをバイトコードの代わりにJavaScriptにコンパイルし、ブラウザのJavaScript解釈エンジンをあたかもJVMのように活用することを可能にする。これによりJavaを用いてブラウザ上で動作するデスクトップアプリケーションと遜色ないウェブアプリケーションを作成することが可能となっている。HTML5によって導入されるデータベースのWeb Storage、ファイルAPI、クライアントハードウェアの位置情報を得るジオロケーション、JavaScriptをマルチスレッドで起動するWeb workerなどのクライアント側技術はJavaScriptによる呼び出しを前提としている。GWTやサードパーティのGWTライブラリはHTML5APIのJavaラッパーを提供しており、開発者は複雑なクライアント側プログラムをJavaのIDEでデバッグ、テストしながら開発し、最適化されたJavaScriptにコンパイルして実行させることができる。2011年Adobe社は携帯向けのFlash開発を断念し、HTML5にクライアント側技術の焦点を変更した。携帯機器を含めると2012年現在ではFlashよりもJavaScriptが普及してはいるが、Flashほど充実した開発環境やライブラリはない。アプレットはFlashよりも普及していない。GWTはJavaScriptの普及度とJavaの充実した開発環境の両方を用いることができるため、Java経験者のリッチクライアント作成ツールとしてアプレットに取って代わる存在となりうる。
以上のように、ネットワーク越しにダウンロードしたアプリケーションをその場で実行する、というような場合に不可欠なのは、サンドボックスと呼ばれる一種の仮想化環境である、という事実はJavaが設計された当初から(あるいは、それ以前の先駆的な事例から)基本的に何ら変わるものではない。そのためのJava以外のものとしては、インタプリタベースのJavaScriptの他、バイトコード(あるいはネイティブコードの安全な実行[注釈 1])を指向したものとしてはNaCl (PNaCl) や、WebAssemblyがある。
Webサーバ上
現在、ウェブのサーバ側において、Java技術 (Java EE) は広く使われている。多くのウェブサイトが、Javaサーブレット (Java Servlet) やJavaServer Pages (JSP) などのJava EE技術を使って動的にページを生成するウェブを構築している。Javaサーブレットは2000年前後から急速に広く使われるようになり、現在では多くのウェブアプリケーション(動的なウェブページ)がサーブレットとして稼動するようになっている。
サン・マイクロシステムズが開発したJavaサーブレット技術を簡単に説明する。必ずしも厳密な説明ではない。
- Javaの実行環境のプロセス(サーブレットコンテナ)を起動してウェブサーバのマシンに常駐させる。
- ウェブサーバが、ウェブブラウザからアクセスされる(リクエストを受ける)。
- ウェブサーバは、そのリクエストをサーブレットコンテナに渡す。
- サーブレットコンテナで動くJavaプログラム(Javaサーブレット)は、受け取ったリクエストに基づき、ウェブページを動的に生成する。
- サーブレットコンテナは、サーブレットが生成したウェブページをウェブサーバに渡す。
- ウェブサーバは、サーブレットコンテナから受け取ったウェブページを、ウェブブラウザに返す。
サンがJavaサーブレット技術を開発した1990年代末当時、ウェブアプリケーションの開発には、次に述べるようないくつかの問題があった。
- ウェブアプリケーション(動的なウェブページ)を記述するにはCGIを用いるか、マイクロソフトのIISによるActive Server Pages (ASP) を用いるのが大半だった。
- CGIはその特性から実行時のオーバーヘッドが高く、性能を向上することが難しかった。
- ASPはサーバが高価な Microsoft Windows NT Server である必要があった。
Javaサーブレットはこれらの問題をある程度解決することができる技術だった。
PCデスクトップ上
デスクトップ環境においては、スタンドアロンのJava (Java SE) のアプリケーションソフトウェア(Javaアプリケーション)は、これまではあまり多く使われていなかったが、近年[いつ?]はいくつかのソフトウェアが広く使われるようになっている。近年[いつ?]になって使われるようになってきた理由としては、次のことが挙げられる。
- コンピュータの処理性能が急速に向上してきた。
- Javaの仮想マシン(Java仮想マシン、Java VM)とJavaコンパイラが大きく改良されてきた。
- 使い勝手の良いJavaのデスクトップアプリケーションを簡単に開発できる強力な開発環境が、オープンソース界と商用開発企業の双方からさまざまに提供されるようになってきた。
広く使われているJavaのソフトウェアとしては、NetBeansおよびEclipse SDKの統合開発環境や、LimeWireやAzureusのようなファイル共有クライアントのソフトウェアなどがある。また数学ソフトウェアMATLABにおいても、ユーザインタフェースのレンダリングと計算機能の一部を実現するために使われている。多くの Java のSwingやSWTのウィジェット・ツールキットを使ったアプリケーションが、現在[いつ?]も開発されている。
このように、近年[いつ?]はデスクトップ上でJavaアプリケーションを使う事例が増えつつあるものの、従来は次に述べるいくつかの理由のためにあまり使われてこなかった[6]。
- Javaアプリケーションは、Java実行環境のオーバーヘッドのため、ネイティブアプリケーションと比べて、大量のメモリを使うことが多い。
- グラフィカルユーザインタフェース (GUI) は実行対象となるプラットフォーム特有のヒューマンインタフェースガイドライン (HIG) を考慮しない傾向があった。HIG を考慮したアプリケーションを開発することによって、ユーザはアプリケーションをすぐに使い慣れることができる。また、デフォルトではフォントスムーシングが使えない。そのためユーザインタフェースの文字列(テキスト)の表示の品質が低くなってしまう。
- Java開発キット (JDK) として無償で提供される基本的な開発環境は、使い勝手の良いデスクトップアプリケーションを簡単に開発するには、力不足だった。
- Java実行環境 (JRE) はこれまで数度のメジャーバージョンアップを経ており、複数のバージョンが存在する。ユーザはJavaアプリケーションを使い始める際には、必要に応じて、そのアプリケーションが動くバージョン、もしくはそのバージョンより新しいバージョンのJava実行環境をインストールする必要があった。Java実行環境は、7MB 以上のサイズであり、そのダウンロードとインストールもやや不便な手順をふむ必要があった。
- 近年[いつ?]では Java Web Startの登場によりダウンロードとインストールも自動化され、ブラウザでJavaアプリケーションを見つけるとクリック一回でJREのダウンロード、インストール、アップデートなどをその場で済ませてJava Web Start対応Swingアプリケーション実行が可能になっている。
一部のソフトウェア開発者は、情報技術はウェブを基盤としたモデルが主流となっており、スタンドアロンアプリケーションは流行遅れであり、新しいプログラミング技術は優れたウェブアプリケーションを開発することに充てられている、と思っていた。この見解については、ソフトウェア技術者の間で賛否が分かれている。
現在[いつ?]では、リッチクライアントやWeb 2.0の登場により新たなパラダイムが生まれようとしている。すなわちウェブを基盤としたウェブアプリケーションとスタンドアロンアプリケーションの融合である。ウェブアプリケーションをAjaxや Java Web Start、Adobe Flash などと組み合わせることにより、Web2.0時代に見合ったより洗練されたアプリケーションを開発することができる。
Windows上
一昔前[いつ?]、ほとんどの パーソナルコンピュータ (PC) のユーザは、何ら問題なくウェブおよびデスクトップ環境上でJavaアプリケーションを実行できていた。かつて多くのPCメーカーは、自分たちが製造・販売するWindows PCにJava実行環境 (JRE) を同梱していた。アップルのmacOSや、多くのLinuxディストリビューションでも、Java実行環境を同梱していた。今[いつ?]では追加インストールが必要である。しかしながらパーソナルコンピュータにおいてJavaアプリケーションは殆ど使われなくなってしまっているので、マイクロソフトが2001年頃以降にJava実行環境をWindowsに同梱していないことの影響は小さい。
2001年頃にマイクロソフトによるJava実行環境をWindowsに同梱することを止めたという行動は、サン・マイクロシステムズが同社を「品質の低い」Java実行環境を同梱してきたとして告訴したことが契機となった。マイクロソフトがそれまでWindowsに同梱してきたJava実行環境向けに開発されたJavaプログラムは、他のプラットフォームのJava実行環境で動かない可能性があった。
しかし近年[いつ?]では、Javaアプリケーションパッケージ自体にJava実行環境を同梱する事例が少なくない。その背景にはJavaアプリケーション開発者の判断がある。Javaアプリケーションが想定どおりに機能するよう、Java実行環境のバージョンの違いによる非互換性に基づく不具合を避けるために、PCに同梱されているJava実行環境を使わないという判断である。
現在[いつ?]では、Javaアプレットは動作対象のJava実行環境のバージョンを認識することができる。また、バージョン間の互換性も プログラミング言語の中では高い水準にあり、上位互換性についてはJava SE 1.3以降は大きな問題はほぼおきにくくなっている。さらにJava Web StartではデスクトップにインストールされているJavaのバージョンを確認してアップデートできるならアップデートし、それだけでなくJava Web Start対応アプリケーションをもアップデートしようとする。そのため古いバージョンのJava実行環境を使っているマシンがあったとしても、自動アップデートされるためにそう難しい問題は起きない。
組み込みシステム上
組み込みシステム向けのJava(Java ME)も広く使われている。
携帯機器(携帯電話・PHSやPDA・スマートフォン等)にJavaの実行環境が実装されるケースが多い。Java環境はこれら携帯機器全般に広く普及している。一方、SymbianおよびBREWは携帯電話や(日本的定義での)スマートフォンを主なターゲットとし、Javaと競合している。
Java MEでは、BREWとは異なり、開発者がライセンス料を支払わずに、プログラムを開発することができる。Java MEはSymbianより広く普及している。その理由は、Java MEがSymbianより広範な携帯機器、特に廉価なモデルで動作するからである。こうした事情からサードパーティによりOpera miniのようなフリーのJavaソフトウェアを開発することができるようになった。
携帯機器のJava MEプログラムは、サンドボックスのもとで動くため、多くの開発者が特別な配慮をせずにプログラムを開発しても、安全に実行できる。携帯機器のJava技術が多様化するに伴い、異なるメーカーの携帯機器でもJavaプログラムが動くよう、携帯機器のためのJava技術の標準が必要となった。携帯機器のためのJava MEの標準がMobile Information Device Profile (MIDP) である。最初の標準はMIDP 1で、小さい画面を想定したものであり、音声機能は無く、プログラムサイズは32kBまでという制限があった。後のMIDP 2の標準では、音声機能を備え、プログラムサイズの制限は64kBまでと緩和された。携帯機器の設計の進歩は標準化よりも急速であるため、一部のメーカーは、MIDP 2標準の最大プログラムサイズなどいくつかの制限を、意図的に緩和して携帯機器を開発している。
携帯機器におけるJava MEの競合技術について簡単に述べる。
- Symbianの技術は、シンビアンが開発した携帯電話向けのユーザインタフェースフレームワークを備えたプラットフォームであり、マルチスレッド機能やメモリ保護機能をもつ。開発用言語はC++やJava MEなどである。Java と同様に、開発者がライセンス料を支払わずに、プログラムを開発することができる。
- BREWの技術は、クアルコムが開発し推進している、携帯電話向けのプラットフォームである。開発用言語は C/C++ である。Javaと異なり、プログラムを開発するために、開発者がライセンス料を支払う必要がある。BREWプログラムは、携帯電話利用者に課金する機能にアクセスすることができる。この課金機能は、クアルコムが管理する厳重な承認機能を、必要とする。この承認機能により、ライセンス料を徴収することができ、また携帯電話ごとにどの BREW プログラムが使えるかを制御することができる。BREWを採用する携帯電話事業社は、排他的なコンテンツ配布の技術を使うことができる。一部の携帯電話事業社はこのコンテンツ配布技術から利益を得ることができると考えている。
世界的な動向としては、
- GSMの方式を採用するほとんどの携帯電話事業社は、Javaを採用する傾向がある。
- CDMAの方式を採用する携帯電話事業社の多くは、BREWを採用する傾向がある。ただし例外的に、CDMA式を採用するアメリカ合衆国の携帯電話事業者 Sprint Nextel Corporation は、Javaを採用している。
- Symbian のスマートフォンは、スマートフォン市場で85%を占有している。
- Javaの実装は携帯機器(携帯電話・PHSやPDA・スマートフォン等)に広く普及している。
- なお、AndroidのJavaライク仮想マシンの実装 (Dalvik、Android Runtime) はJava ME互換ではなく、様々な点で差異がある。
また、2001年にはソニーのコンシューマゲーム機 PlayStation 2 にJava仮想マシンが搭載される予定と発表され話題になった[7]。
バージョン履歴
Java は、JDK(Java Development Kit; Java開発キット)1.0 以来、数度のメジャーバージョンアップを経ている。バージョンアップに伴い、多くのクラスとパッケージが標準ライブラリに追加されてきた。プログラミング言語JavaおよびJavaプラットフォームは、高い水準でバージョン間の互換性を保ちつつ発展してきている。
J2SE 1.4から、Javaの開発はJCP (Java Community Process) という標準化プロセスで行うようになっている。JCPでは、JSRs (Java Specification Requests) という文書群により、Javaに対する追加機能やJavaプラットフォームに対する変更の提案と規定を行う。
また、J2SE 1.3以降では開発コードネームとして、メジャーバージョンには動物の名前が、マイナーバージョンには昆虫の名前が付けられる傾向がある。
言語仕様は JLS(Java Language Specification; Java言語仕様)により規定する。JLSはJSR 901の管理下にある。
バージョンアップの過程で、言語仕様の変更だけでなく、標準クラスライブラリにおいても大きな変更が加えられている。JDK 1.0では標準ライブラリは約200クラス / インタフェースだったが、Java SE 6では4000以上のクラス / インタフェースとなっている。SwingやJava 2Dのような全く新しいAPIが追加された。その一方で、もともとJDK 1.0から存在していたクラスのメソッドの多くが、J2SE 5.0での使用は推奨されないようになっている。
JDK 1.0 (1996年1月23日)
最初のバージョン[8]。
- このバージョンでは日本語などの国際化対応はなされていなかった。
JDK 1.1 (1997年2月19日)
いくつかの重要な機能が追加された[9]。
- 国際化対応(日本語も含む)
- AWT イベントモデルにおける大規模な再構成
- 言語仕様に「内部クラス」が追加された
- JavaBeans ソフトウェアコンポーネント技術
- JDBC データベース接続API
- Java RMI 分散オブジェクト技術
- リフレクション : クラス名や、クラスに定義されている操作であるメソッド名を動的に指定して呼び出す。[10]
J2SE 1.2 (1998年12月8日)
コードネームPlayground。このバージョンから呼称がJava 2に変更され、J2SE 5.0までこの呼称が使われる。またエディション名がJDKから "J2SE" (Java 2 Platform, Standard Edition) に変更された。この J2SE の名称により、J2EE (Java 2 Platform, Enterprise Edition) および J2ME (Java 2 Platform, Micro Edition) の基となるエディションであることが明確化された[11]。
strictfp
キーワード : IEEE 754に基づいた厳密な浮動小数点数の演算を行う- Swing グラフィカルユーザインタフェースツールキットが標準ライブラリに統合された。
- サンのJava仮想マシンにジャストインタイムコンパイラが備わる。
- Java Plug-in : さまざまなウェブブラウザにJava実行環境を組み込むことができるようになり、Javaアプレットを実行できるようになった。
- Java IDLという IDL(インタフェース記述言語)の実装が導入され、CORBA分散オブジェクト環境との相互運用ができるようになった
- コレクションフレームワークの導入
J2SE 1.3 (2000年5月8日)
- HotSpot Java仮想マシンが導入され、ジャストインタイムコンパイラに加えて動的再コンパイル技術、世代別ガベージコレクションを備えた高速なJava仮想マシンを使えるようになった。実際には1999年4月から J2SE 1.2 向けの HotSpot Java仮想マシンがリリースされていた。
- Java RMI が CORBA ベースに変更される
- JavaSound : 音声データを扱うAPI
- Java Naming and Directory Interface (JNDI) が標準ライブラリに統合される。ネーミングサービスとディレクトリサービスへのアクセス。従来は拡張機能として提供されていた。
- Javaプログラムのデバッグを支援する機能群、Java Platform Debugger Architecture (JPDA) の導入。
J2SE 1.4 (2002年2月6日)
コードネームMerlin。このバージョンは、JCP (Java Community Process) の下で開発された最初のJavaプラットフォームである[14][15][16]。
assert
キーワード : ある程度、「契約による設計」に基づいたプログラミングが可能となる。JSR 41 で規定された。- Perlのような正規表現のライブラリの導入により、文字列データ(テキスト)の高度な処理機能が提供される。
- 連鎖例外機能により、ある例外の原因となった例外を連鎖的に記録できるようになる。
- NIO (New I/O) : 新しい入出力機能。JSR 51で規定。
- ロギング APIが標準ライブラリに追加される。JSR 47で規定。
- イメージ I/O API : JPEGやPNGのようなフォーマットの画像イメージを読み書きするAPI
- JAXP (Java API for XML Processing) による統合されたXMLプロセサとXSLTプロセサによるXML文書処理機能のライブラリが、標準で提供されるようになった。JSR 5およびJSR 63で規定。
- セキュリティと暗号化の拡張機能を標準ライブラリに統合
- JCE (Java Cryptography Extension) : Java暗号化拡張機能
- JSSE (Java Secure Socket Extension) : Javaでセキュアなインターネット通信 (TLS/SSL) を実現する機能
- JAAS (Java Authentication and Authorization Service) : Javaの認証と権限のサービス
- Java Web Startの導入 : Javaアプリケーションの配備と実行を簡素化する技術。JSR 56で規定。Java Web Start自体は2001年3月に J2SE 1.3 向けのバージョンがリリースされていた。
J2SE 5.0 (2004年9月30日)
コードネームTiger。JSR 176 のもとで開発された。J2SE 5.0 では、言語仕様に大きく拡張が加えられ、多くの新しい言語機能が追加された[17][18]。もともとは J2SE 1.5 という名称だったが、この名称はすでに内部的なバージョン番号として使われていた[19]。またマーケティング上の理由もあった。
- 総称型 (ジェネリックス): コンパイル時に静的にコレクションオブジェクトでその要素となるオブジェクトの型を安全に取り扱うことができるようになった。ほとんどの場合において型変換(キャスト)を行う必要は無くなった。JSR 14で規定された。
- オートボクシング/オートアンボクシング :
int
型のようなプリミティブ型(primitive type)とInteger
クラスのようなプリミティブラッパークラスの間の変換が自動的に行われるようになった。JSR 201で規定。 - 列挙型 :
enum
キーワードにより、Javaで安全な列挙型を実現するデザインパターンであるタイプセーフenumパターンが言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる[注釈 2]。以前のバージョンまではこのような場合、タイプセーフではない整数の定数値で定義するか、プログラマが自分でタイプセーフenumパターンで実装するかの、どちらかの方法しか無かった。JSR 201で規定。 - 可変引数 : メソッドの最後の引数を、型名に続けて3個のドットを記述することで可変個数の引数渡しの記述ができるようになった(例 :
void drawText(String... lines)
)。メソッド呼び出しにおいて、最後の引数に関してはその型の任意の個数のパラメタを渡すことができる。その際、実際には内部的に最後の引数は配列としてメソッドに渡される。 - メタデータ : 注釈(アノテーション)とも言い、クラスやメソッドに、"@" でタグ付けされた付加的な情報を記述することができるようになる。メタデータを扱うツールで処理することにより、決まった型のコードを生成することができるようになり、Javaによる開発で機械的な作業を減らして開発効率を上げることができる。JSR 175で規定。
- 拡張
for
ループ(for-each文): for文によるループの構文が拡張された。配列やコレクションオブジェクト(List
やSet
など)の各要素オブジェクトに対して、反復(繰り返し)処理をする専用の構文を使うことで、コーディングを簡略化しミスを減らすことができるようになった。この構文を使う場合コレクションは、配列か、Iterable
インタフェースを実装したコレクションオブジェクトである必要がある。この構文を使ったコーディング例を示す。
void displayWidgets (Iterable<Widget> widgets) {
for (Widget w : widgets) {
w.display();
}
}
この例では、widgets
という変数名のコレクションオブジェクト内の、各Widget
オブジェクトを反復して繰り返し処理する。各Widget
オブジェクトにはループサイクルごとにw
という変数名をつける。各ループサイクルで、w
に対してWidget
型で定義されているdisplay()
メソッドを呼び出す。拡張forループはJSR 201で規定された。
Java SE 6 (2006年12月11日)
コードネームMustang。JSR 270のもとで開発された。Java SE 6においては、サンは命名方針を変更して、"J2SE" からJava SEに変更し、バージョン番号から ".0" の部分を廃止している[20]。
- Scripting for the Java Platform
- AWT、Swingの高速化。
- Windowsシステムトレイのサポート
- Windows Aero (Windows Vista) のルック・アンド・フィール
- テキストのUnicode正規化 (java.text.Normalizer)
- JDBC 4.0
- JAXP (Java API for XML Processing) 1.4
- 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が搭載された[21]。JavaアプレットやJava Web Startの起動を容易にするための、配備ツールキットが公開された[22]。
Java SE 7 (2011年7月28日)
コードネームはDolphinである[23]。2006年に開発が始まった。元々は2008年春にリリースされる見通しであったが[24]、何度かリリース予定が変更された。2007年8月の時点では2009年1月をリリース目標としていたが[25]、2008年12月、ジェームズ・ゴスリンは、「私の勝手な憶測だが」という注意書き付きで、2010年6月以降のリリースを予測し[26]、2009年11月には2010年9月以降のリリース予定に変更された[27]。2010年9月に、これ以上の延期を避けるため、大きな言語仕様の改訂などの部分は Java SE 8 に先送りし、Java SE 7 を2011年中頃に、Java SE 8を2012年終わり頃に提供するという目標を立て[28]、結局2011年7月28日にリリースした。Java SE 7は、オラクルによるサン買収後、初のメジャーリリースである。
Java SE 7に追加された項目は以下のとおりである。
- 主として動的言語を想定した、invokedynamic の追加 (JSR 292)
- NIO.2 (JSR 203), Stream Control Transmission Protocol, Sockets Direct Protocol
- JDBC 4.1
- コレクションや並列性のライブラリの機能追加 (JSR 166y)
- JAXP, JAXB, JAX-WSの更新
- ClassLoaderの改善
- Project Coinの一部
- JavaFX 2.0(Update 2より)
Java SE 8 (2014年3月18日)
2014年3月4日に JSR 337[29] にて仕様が規定された。JDK 8 は2013年9月9日にリリース予定[30][31]だったが、2013年4月18日にリリースの延期が発表になり2014年3月18日にリリースされた[32][33][34]。CLDC, CDC を統合した Java ME 8 は2014年4月30日にリリースされた[35]。主な新機能は以下。
- ラムダ式の導入 (Project Lambda, JSR 335)
- 型アノテーション (JSR 308)
- Date and Time API (JSR 310)
- 高速JavaScriptエンジン Nashorn
- JavaFX 8
- マルチタッチデバイス対応
- HotspotとJRockitの統合
当初搭載予定だった、以下の機能はJava SE 9に延期となった[36]。
- 言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294)
また、搭載予定だった以下の機能は廃止 (withdrawn) になった。
- Swing アプリケーションフレームワーク (JSR 296)
Java SE 9 (2017年9月21日)
Java SE 9 は Java SE 8 リリースの3年後の2017年9月21日にリリースされた。[37]。言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294) などを追加した。
オラクルはJavaの開発速度向上のため、これまでの新機能の完成を待ってメジャーバージョンアップを行うリリースモデルから、毎年3月と9月の年2回メジャーバージョンアップを行うタイムベースのリリースモデルへと移行することを発表した。またサポートサイクルも見直され、Java SE 9は次のメジャーバージョンまでの6ヵ月間のみ公式アップデートが提供されるnon-LTSリリースとなり、2018年3月に公式アップデートが終了した。なお、LTSリリースとなるJava SE 11以降は配布形態が変更されるため、LTSリリースの公式アップデートは提供されなかった[38]。
Java SE 10 (2018年3月20日)
JSR 383[39] にて仕様が規定されたJava SE 10は新リリースモデルによる初リリースで、予定通りJava SE 9から半年後の2018年3月20日にリリースされた[40]。ローカル変数型推論などの機能が追加されている。
Java SE 11 (2018年9月25日)
JSR 384[41] にて仕様が規定され、2018年9月25日にリリースされた。オラクルによるビルドはOracle JDKとOpenJDKの二種類が提供され、Oracle JDKの商用利用は有償サポート契約を結んだ顧客のみとなっている。なおリリースモデル変更後の初LTSリリースとなるが、オラクルによる長期サポートはOracle JDKを対象にしたものであり、オラクルによるOpenJDKの提供がJava SE 12リリース以降も行われるかは、2018年10月時点で未定である。
Java言語の構文
Javaの構文は、C言語またはC++と類似している。Javaプログラムは目的環境に従い、コマンドライン、GUI、アプレット、サーブレットといったアプリケーション形態に派生する。初心者向けの代表的なサンプルコードである「Hello world表示プログラム」によって各形態のコーディング実例を以下に示す。
スタンドアロン(コマンドライン)
// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
- 全てのコードはclass内またはinterface内に記述される。
- ソースコードのファイル拡張子はjavaとなる。ここではクラス名がHelloなのでソースファイル名はHello.javaとする。
- コンパイルされたソースファイルは、バイトコードファイルに変換される。その拡張子はclassとなる。ここでのバイトコードファイル名はHello.classとなる。
- プログラムはmainメソッドから実行される。mainメソッドは任意のクラス内に一つだけ定義する。他のクラスにも定義されているとコンパイルエラーとなる。
- mainメソッドにはString配列の引数が渡される。Stringは文字列オブジェクトである。OS側はプログラム実行時のパラメーターのそれぞれをStringオブジェクトにして配列に格納しmainメソッドの引数とする。引数名はargsとするのが標準である。プログラマは引数として渡されたString配列から実行時パラメーターを読み出す。
- mainメソッドはリターン値を返さないので、voidとする。
- mainメソッドはクラスメソッドなので、staticとする。クラスメソッドはインスタンスを必要としない。
- mainメソッドはクラス内外の全領域から呼び出し可能な、publicとする。
System
クラスは使用OS環境のAPIを直接扱うクラスである。そのクラスフィールドであるout
はコンソール出力系APIを扱うPrintStreamクラスのインスタンスである。このoutからPrintStreamクラスのprintlnメソッドをコールして、パラメータとして渡す文字列をコンソール画面に表示させる。
スタンドアロン(GUIアプリ)
グラフィカルユーザインタフェース (GUI) 環境で動く Swingを使ったスタンドアロンのJavaアプリケーションの例を示す。Swingは、Java SEの高度なGUIのウィジェット・ツールキットのライブラリである。
// Hello.java
import javax.swing.*;
public class Hello extends JFrame {
Hello() {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
add(new JLabel("Hello, world!"));
pack();
}
public static void main(String[] args) {
new Hello().setVisible(true);
}
}
import
文は、コンパイル時にJavaコンパイラに対し、このソースコード内ではjavax.swing
パッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを、伝える。import
文を記述しなくても、javax.swing.JFrame
のようにパッケージ名をつけて完全修飾クラス名 (FQCN; Fully Qualified Class Name) で使うこともできるが、この例のようにimport
文を使うことで、単にJFrame
のようにクラス名だけで使うことができるようになる。
Hello
class
extends
JFrame
の部分では、JFrame
クラスを継承してHello
クラスを定義すること(JFrame
のサブクラスとすること)を記述している。JFrame
クラスは、ウィンドウ終了ボタンをもつタイトルバーの付いたウィンドウ(フレーム)を実装している。Hello()
コンストラクタでは、フレームを初期化している。- コンストラクタとは、特殊なメソッドであり、オブジェクトの状態を初期化する処理を記述する。オブジェクトが生成される際に自動的に呼び出される。この例では、mainメソッドで
Hello
オブジェクト(フレーム)を生成する時に呼び出され、Hello
オブジェクト(フレーム)の状態を初期化する役割を担っている。なおJavaのコンストラクタには、クラス名と同じ名称を付ける。- オブジェクトの初期化処理が必要無い場合などには、コンストラクタの明示的な定義を省略して良い。
- このコンストラクタではまず、
JFrame
から継承されたsetDefaultCloseOperation(int)
メソッドを呼び出し、タイトルバーのウィンドウ終了ボタンが押された際の既定の挙動をWindowConstants.DISPOSE_ON_CLOSE
に設定する。これにより、ウィンドウ終了ボタンが押された際に、フレームが単に不可視になるだけでなく破棄されることになり、Java仮想マシンが終了しプログラムが終了するようになる。 - 次に、
new
JLabel
で"Hello, world!"の文字列表示のためにラベルオブジェクトを生成して、フレーム(JFrame
)の継承元クラスContainer
から継承されたadd(Component)
メソッドを、このラベルを引数として呼び出して、ラベルをフレーム上に追加配置する。 - 継承元クラス
Window
から継承されたpack()
メソッドを呼び出して、フレームの大きさを調整し、フレーム内のコンポーネント(ラベル)の配置を調整する。
- コンストラクタとは、特殊なメソッドであり、オブジェクトの状態を初期化する処理を記述する。オブジェクトが生成される際に自動的に呼び出される。この例では、mainメソッドで
- このプログラムが起動される時に、Java仮想マシンは
main()
メソッドを呼び出す。- mainメソッドは
new Hello()
の部分でフレームのオブジェクトを生成する。このオブジェクト生成の際に、先に述べたHello()
コンストラクタの一連の処理が実行される。 - 次に生成したオブジェクトに対して、その継承元クラス
Component
から継承されたsetVisible(boolean)
メソッドを、boolean型のパラメタtrue
を引数として呼び出して、フレームを可視化する。
- mainメソッドは
- 注意: フレームが一度表示されたら、
main
メソッドが終了してもプログラムは終了しない。その理由は、AWTのイベントディスパッチングスレッドが終了するのは、すべてのトップレベルのSwingウィンドウが破棄された後であるためである。
アプレット
Javaアプレットは、他のアプリケーションに埋め込まれるプログラムである。多くの場合は、ウェブブラウザに表示されるウェブページに埋め込まれる。
// Hello.java
import java.applet.Applet;
import java.awt.Graphics;
public class Hello extends Applet {
public void paint(Graphics gc) {
gc.drawString("Hello, world!", 65, 95);
}
}
<!-- Hello.html -->
<html>
<head>
<title>Hello World Applet</title>
</head>
<body>
<div>
<applet code="Hello" width="200" height="200">
</applet>
</div>
</body>
</html>
import
文は、コンパイル時にJavaコンパイラに対し、このソースコード内ではjava.applet.Applet
クラスとjava.awt.Graphics
クラスを、パッケージ名を付けないでクラス名だけで使うことを、伝える。Hello
class
extends
Applet
の部分は、Hello
クラスがApplet
クラスを継承すること(Hello
クラスがApplet
クラスのサブクラスであること)を記述している。Applet
クラスは、ホストアプリケーション(アプレットを実行するアプリケーション)上で、アプレットによるグラフィクスの表示やアプレットのライフサイクル制御を支援するフレームワークを提供する。Applet
は抽象ウィンドウツールキット (AWT; Abstract Window Toolkit) のComponent
である。Component
を継承したクラスであるため、Applet
は、グラフィカルユーザインタフェース (GUI) を備えており、開発者はイベント駆動プログラミングの作法でアプレットを開発することができる。
Hello
クラスはContainer
スーパークラスから継承されたpaint(Graphics)
メソッドをオーバーライドしている。- オーバーライドとは、スーパークラスで定義された、既定の振る舞いを実装したメソッドや抽象メソッドを、サブクラス側で実装し直すことをいう。
- この
paint(Graphics)
メソッドのオーバーライドにより、Hello
アプレットを表示する処理を実装することができる。paint(Graphics)
メソッドは、アプレットにGraphics
オブジェクトを渡す。アプレットはGraphics
オブジェクトを受け取る。Graphics
オブジェクトは、アプレットを表示するために使われるグラフィクスコンテクストを表している。 - この例では、
Graphics
オブジェクト(グラフィクスコンテクスト)のdrawString(String, int, int)
メソッドを呼び出して、アプレット表示域の (65, 95
) ピクセル座標(オフセット)で "Hello, world!" 文字列を表示する。 - この例では、アプレットは XHTML (HTML) 文書内の、
applet
要素(<applet>
タグ)が使われている位置に表示される。applet
要素は、3つの属性をもつ。code="Hello"
は、Applet
クラスの名前を示す。width="200" height="200"
は、アプレット領域の幅と高さを設定する。
- アプレットは、
applet
要素の代わりに、object
要素あるいはembed
要素を使っても XHTML 文書に埋め込むことができる。ただし現時点では、ウェブブラウザによるこの2つの要素の扱いは、ブラウザごとに異なることがある[42][43]。 XHTML 1.1 仕様においてはapplet
要素は廃止され、アプレットを使う場合はobject
要素を使うことになる。
サーブレット
Javaサーブレットは、サーバ側のJava EEの構成要素であり、クライアントから受けた要求 (request) に対する応答 (response) を生成する。現在、多くの場合はウェブブラウザから要求を受け、応答としてXHTML / HTMLのウェブページを動的に生成する。
// Hello.java
import java.io.*;
import javax.servlet.*;
public class Hello extends GenericServlet {
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("Hello, world!");
}
}
import
文は、コンパイル時にJavaコンパイラに対し、このソースコード内ではjava.io
パッケージおよびjavax.servlet
パッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを、伝える。Hello
class
extends
GenericServlet
の部分は、Hello
クラスがGenericServlet
クラスを継承すること(GenericServlet
のサブクラスであること)を記述している。GenericServlet
クラスは、サーブレットの一般的なフレームワークを提供する。サーバ上で、クライアントから送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。Hello
クラスはServlet
で宣言されたservice(ServletRequest, ServletResponse)
メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。service(ServletRequest, ServletResponse)
メソッドは、ServletRequest
オブジェクトとServletResponse
オブジェクトをHello
に渡す。Hello
はServletRequest
とServletResponse
を受け取る。ServletRequest
オブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。ServletResponse
オブジェクトは、クライアントに送り返す応答を表すオブジェクトである。
service(ServletRequest, ServletResponse)
メソッドのthrows ServletException, IOException
の部分では、このメソッドがServletException
もしくはIOException
の例外を投げる可能性があることを宣言している。これらの例外は、Hello
サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。setContentType(String)
メソッドを呼び出して、クライアントに返すデータのMIME Content-Typeを "text/html" に設定する。getWriter()
メソッドを呼び出してPrintWriter
オブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。println(String)
メソッドを呼び出して、"Hello, world!" 文字列を応答データとして書き出す。- そして応答データはソケットストリームに書き出され、クライアントに返される。
Javaプラットフォーム
Javaプラットフォーム(Java Platform)は、Java実行環境(JRE)とJava開発キット(JDK)と拡張テクノロジの総合である。拡張テクノロジとは様々なIT分野においてJavaを基盤に開発された技術群である。Javaプラットフォームは対象環境に従い、JREおよびJDKの構成内容と、追加される拡張テクノロジの組み合わせを変えたエディションに編集されて提供される。これらの各技術要素またはその総称をJavaテクノロジと呼ぶ。Javaテクノロジは公式ベンダーだけでなくサードパーティ側からも提供されており、スマホ、パソコン、サーバーマシン、エンベデッドシステム、マイクロコントローラ、スマートカードなどのあらゆる環境に対応したJavaプラットフォームが存在している。各技術の品質を評価して認証するJavaテクノロジの標準化は、公式ベンダーであるオラクル社(サン社)を始めとする各企業各団体が参画するJavaコミュニティプロセス(JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されている為、各企業及び各任意団体が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。
エディション(版)
現在、Javaプラットフォームには対象環境に合わせた4つのエディションが存在する。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。なお、JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。
- スタンダード版(Java Platform Standard Edition)
- スマホ、パソコン向けである。主にアプリケーションとWEBアプリを開発または実行する。一般ユーザー向けである。
- エンタープライズ版(Java Platform Enterprise Edition)
- サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
- マイクロ版(Java Platform Micro Edition)
- エンベデッドシステム、マイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめらている。
- カード版(Java Card)
- スマードカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発する為のエディションである。現在ではSIMカードやATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ変数も省略されている。故に特殊なプログラミングスタイルが求められる。
Java実行環境(JRE)
Java実行環境 (Java Runtime Environment) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン(Java Virtual Machine)と、''Java.exe''を始めとする様々なスターター(Web用プラグインを含む)と、Javaクラスライブラリ(Java Class Library)で構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。
エンドユーザはソフトウェアパッケージか、企業/団体サイトからのダウンロード、又はWEBブラウザプラグインを通してJava実行環境をインストールする。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
- Javaクラスライブラリ
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
- 基礎ライブラリ - Java言語仕様の基礎を扱う。
- 入出力ライブラリ - ファイル入出力など。
- データコレクションライブラリ - 配列の操作と順序収納、索引収納、連想収納などのデータ集合。
- 数学ライブラリ - 各種計算。
- 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどを扱う。
- ネットワークライブラリ - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
- GUIライブラリ - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
- Javaアプレットライブラリ - アプレット生成用。
- Javaビーンズライブラリ - Java版ソフトウェアコンポーネント作成用。
- リモートメソッドライブラリ - 外部マシン上にあるプロセス・メソッドを呼び出す。
- セキュリティライブラリ - 様々な通信セキュリティプロトコルを扱う。
- バッファストリームライブラリ - 連続バイトデータを扱う。
- データベース接続ライブラリ - SQLを扱う。
- リフレクションライブラリ - クラス定義を動的に操作する。
- Javaアプリケーションの形態
Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。
- Javaアプリケーション(application)
- スマホ、モバイルPC、パソコンのローカル環境で実行されるJavaプログラム。「Java Web Start」は任意のjnlpファイル(java network launching protocol)をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
- Javaアプレット(applet)
- サーバーからダウンロードされてウェブブラウザ上で実行されるJavaプログラム。サンドボックス機能下で厳しい動作制約が加えられている。Javaの汎用仕様上の制限から起動や動作の軽快さに難があり、その改善機会も某社との企業戦略上の確執から失われ、WEBブラウザ向けに特化していた他メディアに押されてさほど普及しなかった。
- Javaサーブレット(servlet)
- サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。
- Javaサーバーページ (java server page)
- サーブレットをWEBサーバー用に特化したものであり、XHTML (HTML) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、JavaScriptの様にブラウザ側で実行するスクリプトではない。類似の技術にActive Server Pages、PHPがある。
Java開発キット(JDK)
Java開発キット (Java Development Kit) は、Javaプログラムを開発するための基本的なソフトウェアである。コンパイラ、デバッガ、アーカイバ、ソフトウェアモニター、ドキュメントジェネレーターなどの基本開発ツールと、様々な開発支援ツールと、Java API(Java Application Programming Interface)で構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。
- J2SE 1.2.2_004 までは、JDK(Java Development Kit)と呼んでいた。
- J2SE 1.4 までは、Java2 SDK(Java2 Software Development Kit)と呼んでいた。
- J2SE 5.0 からは再び、JDK(Java Development Kit)と呼んだ。
- JavaSE 7 からは、エンタープライズ版(EE)では Java SDK(Java Software Development Kit)と呼び、スタンダード版(SE)とマイクロ版(ME)では JDK(Java Development Kit)と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。
- Java API
APIは、アプリケーション・プログラミング・インターフェスの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インターフェース、メソッド、フィールド、コンスタントバリューの総合である。またそのプロトコル(定義情報と使用方法)を指す。プログラマはこれを用いて開発を行う。
- java.lang - Java言語仕様の基礎を扱う。
- java.io - ファイル入出力など。
- java.util - 配列の操作と順序収納、索引収納、連想収納などのデータ集合。
- java.math - 各種計算。
- java.text - 暦、日付、時間、通貨、文字コードなどを扱う。
- java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
- java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
- java.applet - アプレット生成用。
- java.beans - Java版ソフトウェアコンポーネント作成用。
- java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
- java.security - 様々な通信セキュリティプロトコルを扱う。
- java.nio - 連続バイトデータを扱う。
- java.sql - SQLを扱う。
- java.lang.reflect - クラス定義を動的に操作する。
- 統合開発環境と開発支援ツール
統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業および団体から公開されている。
- NetBeans - オラクル社(サン社)を中心に開発されているオープンソースのIDE。Win版、Linux版。Solaris版、MacOS版。NetBeans.org NetBeans.jp。
- WebSphere Studio - IBM社。Eclipse SDK の上位版ともいえるもの。WebSphere Application Server と統合されている。Win版、Linux版。Solaris版、MacOS版。WebSphere開発ツール。
- Eclipse SDK - Eclipse財団。以前はIBMが管理していた。Web Sphere Studioのオープンソース版ともいえる。Win版、Linux版、Solaris版、MacOS版。eclipse.org(英語) EclipseWiki(日本語)。
- JBuilder - エンバカデロ社。Win版、Linux版。Solaris版、MacOS版。JBuilder。
- Oracle JDeveloper - オラクル。Oracle Application Serverと統合されている。Win版、Linux版。Solaris版。2005年6月28日に無料化した。JDeveloper。
- Oracle Workshop for WebLogic - オラクル社(BEAシステムズ社)。WebLogicと統合されている。Oracle Workshop for WebLogic。
- BlueJ - Deakin University(豪)とUniversity of Kent(英)とサン社が共同で開発したフリーソフトウェア、Javaの学習に適したインタラクティブな統合開発環境。BlueJ。
- IntelliJ IDEA - JetBrains社が開発販売している商用の統合開発環境。IntelliJ IDEA。
- JCreator - Xinox Software社が開発販売している商用の統合開発環境。JCreator。
- Xcode - アップル社。macOSに付属する統合開発環境。
開発サポートツールは、プロジェクト管理、自動ビルド、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
- Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
- Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
- JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。
Javaの拡張テクノロジ
拡張テクノロジは様々な営利企業および任意団体から、javaxパッケージまたはorgパッケージのJava API、JREとJDKを中核にした拡張仕様コンテナの形態で提供されている。また、様々なアプリケーション、ソフトウェアコンポーネント、データベースシステム、ネットワークプロトコル等を組み合わせたソフトウェア・システムとして公開されている。以下はその代表例であり、いずれもJavaコミュニティプロセスによって標準化されている。
- JNDI (Java Naming and Directory Interface) - ネーミングサービス・ディレクトリサービスへのアクセス
- JSML (Java Speech Markup Language) - 音声合成システムにテキストの注釈を追加する
- JDBC - データベース接続の API
- JDO (Java Data Objects) - Javaオブジェクトの永続化のインタフェース
- 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) - 契約による設計 (Design by contract) に基づいた開発を支援する技術
- JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
- JMX (Java Management Extensions) - 分散環境における機器・アプリケーション・ネットワークサービスの管理 / 監視を行う技術
- JSF (JavaServer Faces) - Java EE によるウェブアプリケーションでユーザインタフェースの簡易な開発を支援する技術
- JNI (Java Native Interface) - Java から他の言語で実装されたネイティブなプログラムやライブラリを呼び出すための仕様
- JXTA - Peer to Peer (P2P) の仮想ネットワークのためのオープンプロトコル
- Java 3D - 3次元グラフィクスプログラミングのための高水準な API Java 3D
- JOGL (Java OpenGL) - OpenGL を使う3Dグラフィクスプログラミングのための低水準な API
- LWJGL (Light Weight Java Game Library) - ゲームを開発するための低水準な API で、OpenGL、OpenAL、OpenCL および多様な入力機器の制御機能も提供する
- OSGi - サービスの動的な管理と遠隔保守
- JavaDesktop
Javaテクノロジの標準化
Javaプラットフォームを形成するJavaテクノロジの標準化は、Javaコミュニティプロセス (Java Community Process, JCP) に管理されていた。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPに参画する事でJavaテクノロジの標準化カンファレンスに関与できた。ボーランド社、富士通、Apacheソフトウェア財団、ヒューレット・パッカード社なども参加していた。JCPはJavaプラットフォームに追加される仕様や技術を、JSRs (Java Specification Requests) と呼ばれる文書で公開していた。Java言語仕様と標準APIに関連したJSRsを以下に列挙する。
- JSR 14 Add Generic Types To The Java Programming Language (J2SE 5.0)
- JSR 41 A Simple Assertion Facility (J2SE 1.4)
- JSR 47 Logging API Specification(J2SE 1.4)
- JSR 51 New I/O APIs for the Java Platform (J2SE 1.4)
- JSR 59 J2SE Merlin Release Contents (J2SE 1.4)
- JSR 121 Application Isolation API
- JSR 133 Java Memory Model and Thread Specification Revision (J2SE 5.0)
- JSR 166 Concurrency Utilities (J2SE 5.0)
- JSR 175 A Metadata Facility for the Java Programming Language (J2SE 5.0)
- JSR 176 J2SE 5.0 (Tiger) Release Contents (J2SE 5.0)
- JSR 201 Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import (J2SE 5.0)
- JSR 203 More New I/O APIs for the Java Platform ("NIO.2") (Java SE 7)
- JSR 204 Unicode Supplementary Character Support (J2SE 5.0) - Unicode 3.1 のサポート
- JSR 244 Java EE 5 Specification (Java EE 5)
- JSR 270 Java SE 6 ("Mustang") Release Contents (Java SE 6)
- JSR 275 Physical Units/Quantities Support (Java SE) - JScienceをもとにしたリファレンス実装
- JSR 901 Java Language Specification (J2SE 5.0)
Javaオープンソースモデル
- Javaテクノロジのオープンソース化
1996年のJava登場初期から、ベンダー元のサン社(後にオラクル社が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。この部分的オープンソース制度に便乗する形で2004年から、IBM社とBEAシステムズ社(後にオラクル社が買収)が、独自のオープンソース化を目的にしたJava関連ソフトウェア&拡張テクノロジの開発を支援するプロジェクトを立ち上げていた。その中でJava仮想マシンと標準クラスライブラリの互換製品も登場していた。
それらの標準化が進むにつれて、Javaコミュニティプロセスへの影響力低下を懸念したサン社は、IBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取っていたが、2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[44]。OpenJDKではソースコードの改変も認められた。「GNU Classpath」は、J2SE 1.4のクラスライブラリの99%以上を実装し[1]、J2SE 5.0では95%以上を実装している[2]。またOpenJDKの開発にはIBM社も協力している。
- GNUプロジェクト
GNUプロジェクトは「GNU Interpreter for Java」とGNUコンパイラコレクションのJava版である「GNU Compiler for Java」を公開している。「GNU Compiler for Java」は、ahead-of-timeコンパイル機能を備えており、Javaのソースコードとバイトコードを、ネイティブマシンコード(Windowsではexeファイル)に変換できる。また、Java標準クラスライブラリの互換版である「GNU Classpath」も公開している。Windows環境下の「GNU Compiler for Java」は、MinGW (WindowsAPIを使う為のライブラリ) と併せて、Cygwin(Unix環境を再現するソフトウェア)の環境上で実行できる。なお、Cygwinの使用はGNU一般公開ライセンスに従う必要があるが、MinGWの方はライセンスフリーである。
- Windows / Linux用プラットフォーム
メジャーなオペレーティングシステム(OS)では、営利企業および任意団体による独自開発のJREとJDKが公開されている事が多い。
- Linux / IA-32プラットフォーム : オラクル、Blackdown、IBM、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
- Windows/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。
- Excelsior JET
米Excelsior社がExcelsior JETというahead-of-timeコンパイラを販売している[45]。Java SE 用に書かれたプログラムをWindowsのネイティブマシンコードであるexeファイル(実行ファイル)に変換して、起動の高速化やアプリケーションの難読化を実現できる。
- Windows用実行ファイル化ツール
JarファイルをWindous用実行ファイル(.exe)にラッピングする以下のツールが存在する。
JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。
Javaへの批判
Javaに対しては、優れた技術だと評価する人々がいる一方で、批判も少なくない。Javaは、ソフトウェアに関する複雑さを管理する問題に対して、革新的な方法を提供するという目標の下で、開発された。多くの人々は、Java技術は、この期待に対して満足できる答えを提供したと評価している。しかしJavaにも欠点が無いわけではない。Javaは、どのようなプログラミング作法にも適応しているわけではない。また、どのような環境や要件にも普遍的に適応しているわけではない。
Javaに対する批判を大まかに記述する。
- 実行性能
Javaの初期のバージョンでは、CやC++などのネイティブにコンパイルする言語と比べて、とても実行が遅くメモリの消費が激しいとして、批判されることが多かったが、近年[いつ?]のバージョンでは改善されてきている。近年[いつ?]のJava仮想マシンで採用しているジャストインタイムコンパイラや動的再コンパイルの実行性能は、従来の言語のネイティブコンパイラとほぼ同じ水準の実行性能かそれ以上を達成することがある。これは頻繁にメモリアクセスを行うプログラムにおいてJavaのガベージコレクションの技術が、Cのmallocやfreeよりも高い性能を発揮できることによる。こうした事情から、Javaの実行性能については、議論の対象となっている。
- ルックアンドフィール
ルックアンドフィールに関して、JavaのSwingのツールキットを使ったグラフィカルユーザインタフェース (GUI) を備えたアプリケーションの既定のルックアンドフィールが、従来のネイティブなアプリケーションとは大きく異なるため、エンドユーザの人々にとってJavaのGUIアプリケーションはなじみにくいと批判されることがある。Javaではプラグイン可能なルックアンドフィールの機構を備えており、サンは Windows、macOSおよびMotifの各ルックアンドフィールのクローンを提供した。そのため、Swingの既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールでJavaのアプリケーションを動かすよう指定することができる。しかしエンドユーザにとってこの指定方法は簡単ではないと指摘されることがある。
- 言語設計
言語の設計(デザイン)に対する批判をいくつかの側面から述べる。
Javaの設計者は、他のプログラミング言語では備えているいくつかの機能をJavaから排除した。利便性より言語設計の簡潔さを優先した結果だが、こうした設計上の判断については賛否が分かれている。
また、Javaは、Smalltalkのように「純粋な」オブジェクト指向プログラミング言語ではないとして、設計の一貫性のなさを批判されることがある。たとえばJavaには、プリミティブ型という、クラス型(参照型)ではないものがある。Javaの設計者は、実行性能上の理由から、意図的にプリミティブ型をJavaに導入した。例えば、int
型などの組み込み型がプリミティブ型に相当する。int
型の値はオブジェクトではなく、これをクラス型のオブジェクトとして扱うには、ラッパーであるInteger
クラス型への変換(ボクシング)が必要になる。J2SE 5.0以降ではオートボクシングにより、プリミティブ型と、それに対応するボックスクラス型の間のやりとり(変数への代入や値の参照など)は、コンパイラによって自動的に行われるようになり、ソースコード上の煩雑さは軽減されたが、本質的に同じものを指すはずのデータ型が複数存在するという矛盾や、組み込み配列型以外のコレクションにプリミティブ型を格納する際の空間的オーバーヘッドの問題を依然として抱えたままである。
一方で、C++のように名前空間レベルのメソッドやフィールド(クラスに属さないフリー関数やグローバル変数)を定義できず、必ずクラス定義が必要であることから、クラスを定義する側も利用する側も記述量が肥大化しがちである。J2SE 5.0 では、メソッドとフィールドのstaticインポートを行えるようになり、クラス修飾なしでstaticメンバーを利用できるようになった。しかしstaticインポートを不用意に使うとソースコードを判読困難にする可能性がある。サン / JCPはstaticインポートを適切に使用するガイドラインを合わせて公開した[46]。
なお、C#はDelphiの設計思想を取り入れた言語であり、登場当初からプロパティをサポートしている。演算子オーバーロードについても、C++より限定的ではあるがサポートされる。そのほか、Javaで問題視されていたプリミティブ型の扱いやジェネリクスなどに対して、C#は独自の解決策を提示している。
- クラスパス
一般に、Javaプログラムを実行する際、-classpathオプションを使用するか、環境変数のクラスパス (CLASSPATH) を必要に応じて適切に設定する必要がある。クラスパスを指定すると、既定のカレントディレクトリという設定が上書きされる。したがって、クラスパスを変更するソフトをインストールするなど設定を変えられた場合は、Java実行環境は正しくJavaプログラムを実行することができなくなることがある。このため Javaを使い始めた人々は、クラスパスについて戸惑うことがある。サンは-classpathオプションを指定する方法を推奨していた。[要出典]
- 移植性・互換性
Javaは高い移植性と互換性を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の下位互換性・上位互換性が完全ではないことが問題として議論の対象になっている。Javaは高い移植性を保つため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。Java Native Interface (JNI) を経由することで、C/C++言語などを利用して特定のプラットフォーム固有あるいはプロセッサ独自の機能にアクセスすることはできるが、その場合はJavaによる移植性や互換性の恩恵は得られなくなる。
Java認定資格
![](http://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Java_Certification_Path.gif/220px-Java_Certification_Path.gif)
サン・マイクロシステムズは複数のJava認定資格を主催していた。オラクルによる買収後、一部資格は変更されている。ただし、買収前に以下の資格を取得した者は買収後も有効資格である。
- Sun認定 Java アソシエイツ (SJC-A)
- Sun認定 Java プログラマ (SJC-P)
- Sun認定 Java ディベロッパ (SJC-D)
- Sun認定 Web コンポーネントディベロッパ (SJC-WC)
- Sun認定ビジネスコンポーネントディベロッパ (SJC-BC)
- Sun認定 Java Web サービスディベロッパ (SJC-WS)
- Sun認定モバイルアプリケーションディベロッパ (SJC-MA)
- Sun認定エンタープライズアーキテクト (SJC-EA)
現行はオラクルが以下のJava認定資格を主催している[47]。これらのうちOracle認定Java EE 6 Enterprise JavaBeansディベロッパ以外の試験はサン・マイクロシステムズが主催していた試験の、それぞれ略号の "OCJ" を "SJC" に変更したものに対応する位置付けにある[48]。
- Oracle認定Javaアソシエイツ (OCJ-A)
- Oracle認定Javaプログラマ (OCJ-P)
- Oracle認定Javaディベロッパ (OCJ-D)
- Oracle認定Webコンポーネントディベロッパ (OCJ-WC)
- Oracle認定ビジネスコンポーネントディベロッパEE 5 (OCJ-BC)
- Oracle認定Java WebサービスディベロッパEE 5 (OCJ-WS)
- Oracle認定モバイルアプリケーションディベロッパ (OCJ-MA)
- Oracle認定エンタープライズアーキテクト (OCJ-EA)
- Oracle認定Java EE 6 Enterprise JavaBeansディベロッパ
認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。
脚注
注釈
- ^ アプリへの署名による安全性を強調する企業もあるが。
- ^ このタイプセーフenumパターンの詳細は、Joshua Bloch (2001). “第5章 項目21 enum構文をクラスで置き換える”. Effective Java Programming Language Guide. pp. 97-106を参照。
出典
- ^ “What is Java and why do I need it?” (英語). 2019年2月4日閲覧。
- ^ “About the Java Technology (The Java? Tutorials > Getting Started > The Java Technology Phenomenon)” (英語). 2019年2月24日閲覧。
- ^ "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.
- ^ “Javaプログラミング入門, 第 1 回: Java 言語の基本”. 2019年2月5日閲覧。
- ^ “SUN MICROSYSTEMS ANNOUNCES FORMATION OF JAVASOFT” (英語). 2006年12月31日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ “Why don't you ship Swing apps?” (英語). 2012年10月30日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ “プレステ2でJavaが動く!――SCEIがPS2へのJava搭載を発表”. 2019年2月23日閲覧。
- ^ "JAVASOFT SHIPS JAVA 1.0" (Press release) (英語). Sun Microsystems. 2008年6月25日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ "SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED" (Press release) (英語). Sun Microsystems. 2008年5月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ “java.lang.reflect (Java Platform SE 8)”. 2017年4月1日閲覧。
- ^ "SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM" (Press release) (英語). Sun Microsystems. 2008年5月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ "SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE" (Press release) (英語). Sun Microsystems. 2008年5月16日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ “JavaTM 2 SDK, Standard Edition, version 1.3 の新機能および機能拡張の概要”. 2019年3月4日閲覧。
- ^ JSR 59
- ^ "SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION" (Press release) (英語). Sun Microsystems. 2008年9月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ “JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要”. 2019年3月4日閲覧。
- ^ "Sun Ships New Version of Java Platform" (Press release) (英語). Sun Microsystems. 2005年2月15日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
{{cite press release2}}
: 不明な引数|deadlinkdate=
は無視されます。 (説明) - ^ “J2SE(TM) 5.0 の新機能”. 2006年7月8日閲覧。
- ^ “Version 1.5.0 or 5.0?” (英語). 2006年7月8日閲覧。
- ^ “Java Naming” (英語). 2019年3月4日閲覧。
- ^ 「Java SE 6 Update 10」公開、動作速度を高速化
- ^ “JavaTM Web アプリケーション 配備アドバイス”. 2019年3月4日閲覧。
- ^ Dolphin
- ^ “Evolving a Language” (英語). 2006年4月5日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ “The Open Road: Looking Ahead to Java 7” (英語). 2008年12月22日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ “Javaがレガシーだって? 冗談じゃないよ - James Goslingが語るJavaの現在”. 2018年4月7日閲覧。
- ^ “JDK 7が、突然"単純な"クロージャをサポート、しかしリリースは、2010年の終わりに。”. 2009年12月3日閲覧。
- ^ “It's time for … Plan B”. 2010年9月23日閲覧。
- ^ JSR 337: Java SE 8 Release Contents
- ^ “Java SE 8リリース予定を延期 - 2013年夏へ - エンタープライズ - マイナビニュース”. 2012年2月22日閲覧。
- ^ Java SE 8 Platform Umbrella JSR (337)
- ^ “Java 8: Secure the train” (英語). 2013年4月23日閲覧。
- ^ “Java 8リリースに遅れ、2014年3月へ - マイナビニュース”. 2013年4月23日閲覧。
- ^ “Java 8 officially arrives at last” (英語). 2014年3月19日閲覧。
- ^ “7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch”. 2012年2月22日閲覧。
- ^ “Project Jigsaw: On the next train” (英語). 2013年1月13日閲覧。
- ^ “JDK 9”. 2015年6月29日閲覧。
- ^ “Oracle Java SE サポート・ロードマップ”. 2018年10月19日閲覧。
- ^ JSR 383: Java™ SE 10 (18.3)
- ^ “JDK 10”. 2018年6月17日閲覧。
- ^ JSR 384: JavaTM SE 11 (18.9)
- ^ “Using the applet Tag” (英語). 2008年12月18日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ “Deploying Applets in a Mixed-Browser Environment” (英語). 2008年12月18日時点のオリジナルよりアーカイブ。2006年7月8日閲覧。
- ^ Sun Microsystems, Inc (2007年5月8日). “Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community”. 2009年9月16日閲覧。
- ^ http://www.excelsior-usa.com/jet.html
- ^ static のインポート
- ^ “ミドルウェア/Java 認定資格”. 日本オラクル. 2011年9月19日閲覧。
- ^ “Sun認定資格に関する重要なお知らせ”. 日本オラクル. 2011年9月19日閲覧。
参考文献
- Jon Byous, Java technology: The early years. Sun Developer Network, 日付不明(1998年頃).(2005年4月22日に参照)
- James Gosling, A brief history of the Green project. Java.net, 日付不明(1998年第1四半期頃).(2005年4月22日に参照)
- James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, third edition. Addison-Wesley, 2005. ISBN 0-321-24678-0.
- 村上雅章(訳) 『Java言語仕様 第3版』 ピアソン・エデュケーション、2006年、ISBN 4-89471-715-8
- Tim Lindholm and Frank Yellin. The Java Virtual Machine specification, second edition. Addison-Wesley, 1999. ISBN 0-201-43294-3.
- 村上雅章(訳) 『Java 仮想マシン仕様 第2版』 ピアソン・エデュケーション、2001年、ISBN 4-89471-356-X
- ジョシュア・ブロック(著)、柴田芳樹(訳) 『Effective Java プログラミング言語ガイド』 ピアソン・エデュケーション、2001年、ISBN 4-89471-436-1
関連項目
- Javaの文法
- Javaの性能
- キーワード (Java)
- Java Platform, Standard Edition (Java SE) - Java の汎用的なエディション
- Java Platform, Enterprise Edition (Java EE) - Java の大規模システム向けエディション
- Java Platform, Micro Edition (Java ME) - Java の組み込みシステム向けエディション
- Javaプラットフォーム
- Java仮想マシン - Javaプログラムを実行する仮想マシン
- Javaコンパイラ - JavaプログラムをJavaバイトコードに変換するコンパイラ
- Java Development Kit - Javaアプリケーションを開発するために必要な開発キット。
- Java Runtime Environment - Javaアプリケーションを実行するために必要な環境。
- Java Servlet - サーバ側で動的にウェブページなどを生成するJava技術
- Javaアプレット - ウェブブラウザなどで実行できるグラフィカルなJavaプログラム
- Java Web Start - Javaアプリケーションの配備と実行を簡素化する技術。Javaアプレットの代替にもなりうる。
- BD-J
- Java Community Process - Java技術の標準化プロセス
- JavaOne
外部リンク
オラクル・JCP関連
- Java.com - Javaのユーザー向け公式サイト
- Java.net - Javaの技術者向け公式サイト
- Java Community Process - JCPのサイト。JSRなどを閲覧できる
- Oracle Technology Network - Java - オラクルの技術者向けサイト
技術情報
- @IT: Java Agile - Java技術者のための情報提供/情報交換フォーラム
- IBM developerWorks Java technology - IBM developerWorks の開発者向けの記事
- Computer-Books.us - Java の複数の書籍(無償でダウンロード可能)
- Java SE - オラクル(旧サン)によるJREとJDKの実装
- Oracle JRockit - オラクル(旧BEAシステムズ)によるJava仮想マシンとJDKの実装
- OpenJDK
- GNU Compiler for Java (GCJ)