コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Java」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
タグ: モバイル編集 モバイルウェブ編集
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}{{未検証|section=1|date=2019年3月}}{{出典の明記| date = 2019年3月}}
{{混同|JavaScript}}{{出典の明記| date = 2019年3月}}
{{Infobox プログラミング言語
{{Infobox プログラミング言語
| fetchwikidata = ALL
| fetchwikidata = ALL
34行目: 34行目:


=== オブジェクト指向 ===
=== オブジェクト指向 ===
Javaの主要プログラミングパラダイムは[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通り[[クラス (コンピュータ)|クラス]]の仕組みを中心にする。クラスは任意のフィールド(=変数)と任意のメソッド(=関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これは[[プロトタイプベース]]・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaプログラムは、この1個以上のクラス定義文を組み合わせて形成される。Javaクラスベース・オブジェクト指向の三つの要点とされる[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。
Javaの主要パラダイムは[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。クラスはフィールド(メンバ変数)とメソッド(メンバ関数)をひとまとめにしたものである。クラスの構成要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスは入れ子のクラスである。Javaプログラムは1個以上のクラス定義文から形成される。Javaクラス機構は[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。


Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(''private''、''package''、''protected''、''public'')によってサポートされている。アクセス修飾子はフィールド定義メソッド定義のそれぞれ先頭に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位の''package''なので隠蔽性よりも利便性が重視されている。
Javaのカプセル化は、四つのアクセス修飾子(''private''、''package''、''protected''、''public'')サポートされている。アクセス修飾子はフィールド定義メソッド定義と共に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はファイル単位の''package''なので隠蔽性よりも利便性が重視されている。


Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無く''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルの全てのクラスは、基礎APIで用意されているObjectクラスを継承最上位の基底クラスにするが強制されている。Objectクラスにはロック機能が備えられているのでオブジェクト指向とマルチスレッド同期調和に一役買っている。
Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無く''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。全てのクラスはObjectクラスを基底継承するが強制されている。Objectクラスが持つロック機能オブジェクト指向とマルチスレッド同期調和させるものである。

Javaの多態性は、インターフェースと仮想関数とリフレクションと遅延バインディングでサポートされている。親クラスの''virtual''指定メソッドが仮想関数の抽象メソッドになり、子クラスの同名メソッドが仮想関数の実装メソッドになる。[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、''implements''構文によって任意の数だけクラスに実装指定できる。これはJavaの中でも比較的重視されておりクラスの動作局面を明確にする。リフレクションは動的ディスパッチ、メソッドミッシング、[[モンキーパッチ]]などの実装に活用できるが安易な使用は推奨されていない。遅延バインディングは''instanceof''演算子による実行時型チェックと、''(typename)''によるダウンキャストの二つである。ダウンキャスト失敗時は例外発生によってフォローされる。


Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文で''virtual''指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い[[静的型付け]]と共に安全な[[動的型付け]]も採用しており、''instanceof''演算子による型審査と、''(typename)''によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されている[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文の''implements''によって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaには[[リフレクション (情報工学)|リフレクション]]も導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、[[分散コンピューティング]]の発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。
=== プラットフォーム非依存 ===
=== プラットフォーム非依存 ===
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
84行目: 85行目:
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]]社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアである[[ジェームズ・ゴスリン]]とマイク・シェルダンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードにある小さなオフィスで開発を始めた。
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]]社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアである[[ジェームズ・ゴスリン]]の参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードにある小さなオフィスで開発を始めた。


'''Oak言語とGreen OSの誕生(1991年)'''
'''Oak言語とGreen OSの誕生(1991年)'''
96行目: 97行目:
'''ワールドワイドウェブ参入(1994年6月~1994年9月)'''
'''ワールドワイドウェブ参入(1994年6月~1994年9月)'''


1994年6月、サン社技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、[[パトリック・ノートン]]、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
1994年6月、サン社技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、パトリック・ノートン、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。


'''Javaの始動(1994年10月~1996年1月)'''
'''Javaの始動(1994年10月~1996年1月)'''
102行目: 103行目:
1994年秋までにグリーンチームは、Oakを'''Java'''に、WebRunnerを「[[HotJava]]」に改称した。その理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(''Bean'')はJavaテクノロジ内でコンポーネントを指す用語にされている。
1994年秋までにグリーンチームは、Oakを'''Java'''に、WebRunnerを「[[HotJava]]」に改称した。その理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(''Bean'')はJavaテクノロジ内でコンポーネントを指す用語にされている。


1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイント的にアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイント的にアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後の1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。


=== バージョン履歴 ===
=== バージョン履歴 ===
{{main|Javaバージョン履歴}}1996年1月の初リリースからバージョン更新はおおむね数年おきに行われていたが <ref>{{Cite web|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|title=JAVASOFT SHIPS JAVA 1.0|accessdate=2008-02-05|archiveurl=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=March 10, 2007}}</ref>、2017年9月の「Java SE 9」から一定の機能蓄積を待たずに半年単位で更新する定期リリースに変更された。従来の長期間サポート(LTS)も廃止され、原則的に次回バージョンまでの半年間サポートになった。なお2018年9月の「Java SE 11」はLTS宣言されている<ref>{{Cite web|url=https://blogs.oracle.com/java-platform-group/introducing-java-se-11|title=Introducing Java SE 11|first=Sharat|author=Chander|website=oracle.com|accessdate=September 26, 2018|archiveurl=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archivedate=September 26, 2018}}</ref>。LTS宣言されたものは安定版、されてないものは機能先取り版といった位置付けである。現行の推奨安定バージョンは「Java SE 11」と「Java SE 8」である。運用期間の長さと普及度から「Java SE 8」の方が代表的バージョンと見なされている。
{{main|Javaバージョン履歴}}2019年3月現在、Java 8がサポートされており、Java 8と11の両方が長期間サポート(LTS)バージョンとしてサポートされている。Javaの主なリリースバージョンとリリース日は以下である。

{| class="wikitable" style="margin-left:9px;"
|-
! バージョン
! リリース日
! 無料公開アップデート期限<ref name="auto9">{{Cite web|url=https://www.oracle.com/technetwork/java/java-se-support-roadmap.html|title=Oracle Java SE Support Roadmap|website=www.oracle.com}}</ref><ref>{{Cite web|url=https://adoptopenjdk.net/support.html#roadmap|title=Support &#124; AdoptOpenJDK|website=adoptopenjdk.net}}</ref>
! 延長サポート期限
|-
| {{Version|o|JDK Beta}} || 1995 || {{dunno}} || {{dunno}}
|-
| {{Version|o|JDK 1.0}} || 1996年1月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|JDK 1.1}} || 1997年2月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.2}} || 1998年12月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.3}} || 2000年5月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.4}} || 2002年2月 || 2008年10月 ||2013年2月
|-
| {{Version|o|J2SE 5.0}} || 2004年9月 || 2009年11月 ||2015年4月
|-
| {{Version|o|Java SE 6}} || {{date|2006年12月 }}|| 2013年4月 || 2018年12月
|-
| {{Version|o|Java SE 7}} || 2011年7月 ||{{date|2015年4月}}|| 2022年7月
|-
| {{Version|co|Java SE 8 (LTS)}} || 2014年3月 ||Oracle(商用)   2019年1月まで
Oracle(個人用)  2020年12月まで


AdoptOpenJDK  2026年5月以降も予定
* JDK 1.0(1996年1月23日) <ref>{{Cite web|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|title=JAVASOFT SHIPS JAVA 1.0|accessdate=2008-02-05|archiveurl=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=March 10, 2007}}</ref>
* JDK 1.1(1996年2月19日)
* J2SE 1.2(1998年12月8日)
* J2SE 1.3(2000年5月8日)
* J2SE 1.4(2002年2月6日)
* J2SE 5.0(2004年9月30日)
* Java SE 6(2006年12月11日)
* Java SE 7(2011年7月28日)
* Java SE 8(2014年3月18日)
* Java SE 9(2017年9月21日)
* Java SE 10(2018年3月20日)
* Java SE 11(2018年9月25日) <ref>{{Cite web|url=https://blogs.oracle.com/java-platform-group/introducing-java-se-11|title=Introducing Java SE 11|first=Sharat|author=Chander|website=oracle.com|accessdate=September 26, 2018|archiveurl=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archivedate=September 26, 2018}}</ref>
* Java SE 12(2019年3月19日)
* Java SE 13(2019年9月17日)
* Java SE 14(2020年3月17日)


Amazon Corretto 2023年6月までは保証<ref name="Corretto2018">{{cite web
| title = Introducing Amazon Corretto, a No-Cost Distribution of OpenJDK with Long-Term Support
| last = Gupta
| first = Arun
| url = https://aws.amazon.com/blogs/opensource/amazon-corretto-no-cost-distribution-openjdk-long-term-support/
| date = 2018-11-14
| accessdate = 2019-12-17}}</ref>
| 2030年12月
|-
| {{Version|o|Java SE 9}} || 2017年9月 || OpenJDK 2018年3月 || {{n/a}}
|-
| {{Version|o|Java SE 10}} || 2018年3月 || OpenJDK 2018年9月 || {{n/a}}
|-
| {{Version|co|Java SE 11 (LTS)}} || 2018年9月 || Amazon Corretto 2024年8月以降も予定<ref name="Corretto2018"></ref>
AdoptOpenJDK  2024年10月まで
| 2026年9月
|-
| {{Version|o|Java SE 12}} || 2019年3月 || OpenJDK 2019年9月 || {{n/a}}
|-
| {{Version|o|Java SE 13}} || 2019年9月 || OpenJDK 2020年3月 || {{n/a}}
|-
| {{Version|c|Java SE 14}} || 2020年3月 || OpenJDK 2020年9月 || {{n/a}}
|-
| {{Version|p|Java SE 15}} || 2020年9月 || OpenJDK 2021年3月 || {{n/a}}
|-
| {{Version|p|Java SE 16}} || 2021年3月 || OpenJDK 2021年9月 || {{n/a}}
|-
| {{Version|p|Java SE 17 (LTS)}} || 2021年9月 || {{TBA}} || {{TBA}}
|-
| colspan="4" | <small>{{Version|l|show=111101}}</small>
|}
== Javaプログラミング例 ==
== Javaプログラミング例 ==
{{main|Javaの文法}}
{{main|Javaの文法}}

2020年5月20日 (水) 14:52時点における版

Java
パラダイム オブジェクト指向プログラミング関数型プログラミング命令型プログラミングジェネリックプログラミング、コンポーネント指向 ウィキデータを編集
登場時期 1995年 (29年前) (1995)
設計者 Java Community Process
開発者 サン・マイクロシステムズオラクル ウィキデータを編集
最新リリース Java Standard Edition 14.0.1/ 2020年4月14日 (4年前) (2020-04-14)
型付け 強い静的型付け
主な処理系 Javaプラットフォーム
影響を受けた言語 Simula 67、SmalltalkObjective-CObject PascalOberon-2EiffelModula-3MesaC SharpUCSD Pascalボックス化可変長引数アノテーションニクラウス・ヴィルト、Patrick Naughton、Foreach文 ウィキデータを編集
影響を与えた言語 C#, D, Dart, Groovy, Scala, Kotlin, Ceylon
プラットフォーム Solaris, Linux, Windows,
macOS, AIX, System i,
Embedded Systems
ライセンス GNU General Public LicenseJava Community Process
ウェブサイト www.oracle.com/java/ ウィキデータを編集
拡張子 java、class、jar
テンプレートを表示

Java(ジャヴァ)は、クラスベースオブジェクト指向の、実装の依存関係をできるだけ少なくするように設計された汎用プログラミング言語である。これは、アプリケーション開発者が一度書いたらどこでも実行できるようにすること(WORA:write once, run anywhere)[1]を目的としている。つまり、コンパイルされたJavaコードは、再コンパイルを必要とせずにJavaをサポートするすべてのプラットフォーム上で実行できる[2]。Javaアプリケーションは、通常、基礎となるコンピュータアーキテクチャに関係なく、あらゆるJava仮想マシン(JVM)上で実行できるバイトコードにコンパイルされる。Javaの構文はCおよびC ++に似ているが、どちらよりも低レベルの機能が少ない。2019年の時点で、GitHub [3] [4]によると、Javaは、特にクライアント/サーバー型のWebアプリケーションで使用されている最も人気のあるプログラミング言語の1つであり[3] [5]、900万人の開発者がいると報告されている[6]

Javaは元々、サン・マイクロシステムズ(その後Oracleに買収された)のジェームズ・ゴスリンによって開発され、Sun MicrosystemsのJavaプラットフォームのコアコンポーネントとして1995年にリリースされた。オリジナルのJavaコンパイラやリファレンス実装のJavaコンパイラ、仮想マシン、クラスライブラリは、もともとSunが独占的なライセンスでリリースしていた。2007年5月の時点では、Java Community Processの仕様に準拠して、SunはそのJava技術のほとんどをGNU General Public Licenseの下で再ライセンスしていた。一方で、GNU Compiler for Java (バイトコードコンパイラ)、GNU Classpath (標準ライブラリ)、IcedTea-Web (アプレット用ブラウザプラグイン)など、Sunの技術の代替実装が開発されてる。

最新バージョンは、2020年3月にリリースされたJava 14と、2018年9月25日にリリースされ現在サポートされている長期サポート(LTS)版のJava 11である。オラクルは、レガシーであるJava 8 LTSについては商用利用向けに2019年1月に最後の無料公開アップデートをリリースしたが、一方で少なくとも2020年12月までは個人利用向けの公開アップデートでJava 8をサポートする予定である。オラクル(およびその他)は、未解決のセキュリティ問題による深刻なリスクがあるため、古いバージョンのJavaをアンインストールすることを強く推奨している[7]。Java 9、10、12、13はサポートされなくなったため、オラクルはユーザーに最新バージョン(現在はJava 14)またはLTSリリース版に直ちに移行するようアドバイスしている。

Javaの特徴

Java開発元のSun Microsystemsを買収し、Java開発を引き継いだOracleによる公式な主張は下記である[8]。企業内システムの開発に最適であるとしている。

Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector. Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。

また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億のJava Card(Javaアプリケーションが動作するスマートカード)が購入されていると発表している[8]

Javaの構文

Javaプログラムの構文は、C言語またはC++によく似たものである。オブジェクト指向言語としての一面が強調されがちだが、幾つかの構文ルールの違いを除いては、C言語とほぼ同様にシンプルな手続き型プログラミングのスタイルでもプログラミングできる。Javaはオブジェクト指向のプログラミングスタイルをそれほど強制しない。

オブジェクト指向

Javaの主要パラダイムはクラスベースオブジェクト指向である[9]。クラスはフィールド(メンバ変数)とメソッド(メンバ関数)をひとまとめにしたものである。クラスの構成要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスは入れ子のクラスである。Javaプログラムは1個以上のクラス定義文から形成される。Javaのクラス機構はカプセル化継承多態性をサポートしている。

Javaのカプセル化は、四つのアクセス修飾子(privatepackageprotectedpublic)でサポートされている。アクセス修飾子はフィールド定義メソッド定義と共に記されて可視性を決定する。privateは同クラス内限定、packageは同クラス内と同パッケージ内限定、protectedは同クラス内と同パッケージ内と派生クラス内限定、publicはどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はファイル単位のpackageなので隠蔽性よりも利便性が重視されている。

Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無くpublic継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。全てのクラスはObjectクラスを基底継承する事が強制されている。Objectクラスが持つロック機能はオブジェクト指向とマルチスレッド同期を調和させるものである。

Javaの多態性は、インターフェースと仮想関数とリフレクションと遅延バインディングでサポートされている。親クラスのvirtual指定メソッドが仮想関数の抽象メソッドになり、子クラスの同名メソッドが仮想関数の実装メソッドになる。インターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、implements構文によって任意の数だけクラスに実装指定できる。これはJavaの中でも比較的重視されておりクラスの動作局面を明確にする。リフレクションは動的ディスパッチ、メソッドミッシング、モンキーパッチなどの実装に活用できるが安易な使用は推奨されていない。遅延バインディングはinstanceof演算子による実行時型チェックと、(typename)によるダウンキャストの二つである。ダウンキャスト失敗時は例外発生によってフォローされる。

プラットフォーム非依存

プラットフォーム非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”Write once, run anywhere”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。

  1. Javaコンパイラは、Javaプログラムのソースコードを、Javaバイトコードと呼ばれる中間表現にコンパイルする。Javaバイトコードはアセンブラのニーモニックに似たもので、Java仮想マシン上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、Javaクラスファイルと呼ばれるclass拡張子のファイルにまとめられる。
  2. Java仮想マシンは、各プラットフォームの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
  3. Java仮想マシンは、指定されたJavaクラスファイルJavaクラスローダーで読み込み、その中のJavaバイトコードを逐一解釈しながら実行する。これはインタプリタ式に行うものと、実行時コンパイラで走行させるものがある。

公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ方式の導入によって速度問題に一定の解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコンパイル処理を更に最適化した動的再コンパイル(dynamic recompilation)という拡張技術も導入され、Javaプログラムの実行速度問題はほぼ解決されたと見なされている。

マルチスレッド

Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応できる各種設計を備えており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。

マルチスレッド「同期」の特徴としては、前述のObjectクラスの基底継承強制により全てのインスタンスにロック機能を持たせている事が挙げられる。このロックはsynchronizedキーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。synchronized修飾子の各メソッドはその全体が排他制御エリアになり、その呼び出し時はthisインスタンスからロックをデフォルト取得するので、イメージ的にインスタンス単位になる排他制御を自然に表現している。このロック普遍化はオブジェクト指向との調和を実現する設計と言える。synchronized静的メソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通単位の排他制御を表現している。また、synchronized()定義子の波括弧でくくられた任意のコードブロックは、this以外のインスタンスもロックオブジェクトにできる排他制御エリアになるので、きめ細かな同期も表現できる。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。

ガベージコレクション

Javaプログラムのメモリ管理は、Java仮想マシンに備えられたガベージコレクション機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。JavaのモデルであるC++では、オブジェクトの生成と破棄が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に力が入れられ、世代別ガベージコレクションという拡張技術も導入された。

なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。

分散コンピューティング

この対象はオブジェクト要求ブローカーを用いた分散システムdistributed system)の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、JavaオリジナルのRMIと、CORBAの二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。

分散コンピューティングからは外れるが、JavaのネットワークAPIは、TCP/IPUDPプロトコル上のソケット通信、セキュアなSSL / TLSソケット通信を扱っており、後にJava XMLアーキテクチャとして発展するXMLパーサおよびXML構造を操作できるDOMSAXを備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。

セキュリティ

分散ネットワークを指向するJavaは、サンドボックスモデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム(Javaバイトコード)による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。

  • クラスローダーはバイトコードをダウンロードして順次クラス化する。
  • 実行環境にあるセキュリティポリシーファイルに基づいて各種パーミッションが各クラスに付与される。セキュリティポリシーは主に指定クラス名とその対象パーミッションを照合するものである。
  • 実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
  • スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
  • その際はスレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
  • 遠隔ロードされたappletクラスなどパーミッション皆無のクラスを通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。

実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。

Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。

Javaの歴史

誕生の経緯

家電向けプロジェクトの立ち上げ(1990年12月)

ジェームズ・ゴスリン

Javaの歴史は、1990年12月にサン・マイクロシステムズ社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアであるジェームズ・ゴスリンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州メンローパーク市サンドヒルロードにある小さなオフィスで開発を始めた。

Oak言語とGreen OSの誕生(1991年)

グリーンチーム内では当時隆盛していたオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語であるC++に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の組み込みシステムであったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が至上命題である家電製品の制御装置には不向きであると判断されたためだった。加えてC++では移植性に対応できない点も指摘されており、プロジェクトの中でプラットフォーム非依存が特に重要な議題として上がった。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。

一方で、Mesa言語とC言語の長所を理想にしていたサン社エンジニアのビル・ジョイは、Further(彼方へ)という名の論文を書いてC++をモデルにした新しいオブジェクト指向言語の開発を自社に提案した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語にOakという名前をつけた。時に1991年秋であり、この「Oak」がJavaの前身になった。それと並行してOakプログラムが用いる基本ライブラリも整備された。

携帯端末、テレビ機器市場への参入と撤退(1992年~1994年5月)

Javaのマスコット「Duke」with BSDライセンス

1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から携帯情報端末(PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このユーザーインターフェース上で「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用セットトップボックス事業への参入を決めて、タイムワーナー社と3DO社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。

ワールドワイドウェブ参入(1994年6月~1994年9月)

1994年6月、サン社技術部長ジョン・ゲージがジェームズ・ゴスリンビル・ジョイ、パトリック・ノートン、エリック・シュミットら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らはワールドワイドウェブをプロジェクトの本命に据える事で一致した。革新的なウェブブラウザである「NCSA Mosaic」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。

Javaの始動(1994年10月~1996年1月)

HotJavaブラウザ

1994年秋までにグリーンチームは、OakをJavaに、WebRunnerを「HotJava」に改称した。その理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。

1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術がセールスポイント的にアピールされた。同時にネットスケープ社が「Netscape Navigator」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後の1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。

バージョン履歴

1996年1月の初リリースからバージョン更新はおおむね数年おきに行われていたが [10]、2017年9月の「Java SE 9」から一定の機能蓄積を待たずに半年単位で更新する定期リリースに変更された。従来の長期間サポート(LTS)も廃止され、原則的に次回バージョンまでの半年間サポートになった。なお2018年9月の「Java SE 11」はLTS宣言されている[11]。LTS宣言されたものは安定版、されてないものは機能先取り版といった位置付けである。現行の推奨安定バージョンは「Java SE 11」と「Java SE 8」である。運用期間の長さと普及度から「Java SE 8」の方が代表的バージョンと見なされている。

バージョン リリース日 無料公開アップデート期限[12][13] 延長サポート期限
サポート終了:JDK Beta 1995 ? ?
サポート終了:JDK 1.0 1996年1月 ? ?
サポート終了:JDK 1.1 1997年2月 ? ?
サポート終了:J2SE 1.2 1998年12月 ? ?
サポート終了:J2SE 1.3 2000年5月 ? ?
サポート終了:J2SE 1.4 2002年2月 2008年10月 2013年2月
サポート終了:J2SE 5.0 2004年9月 2009年11月 2015年4月
サポート終了:Java SE 6 2006年12月 2013年4月 2018年12月
サポート終了:Java SE 7 2011年7月 2015年4月 2022年7月
サポート中:Java SE 8 (LTS) 2014年3月 Oracle(商用)   2019年1月まで

Oracle(個人用)  2020年12月まで

AdoptOpenJDK  2026年5月以降も予定

Amazon Corretto 2023年6月までは保証[14]

2030年12月
サポート終了:Java SE 9 2017年9月 OpenJDK 2018年3月
サポート終了:Java SE 10 2018年3月 OpenJDK 2018年9月
サポート中:Java SE 11 (LTS) 2018年9月 Amazon Corretto 2024年8月以降も予定[14]

AdoptOpenJDK  2024年10月まで

2026年9月
サポート終了:Java SE 12 2019年3月 OpenJDK 2019年9月
サポート終了:Java SE 13 2019年9月 OpenJDK 2020年3月
現行バージョン:Java SE 14 2020年3月 OpenJDK 2020年9月
将来のリリース:Java SE 15 2020年9月 OpenJDK 2021年3月
将来のリリース:Java SE 16 2021年3月 OpenJDK 2021年9月
将来のリリース:Java SE 17 (LTS) 2021年9月 未公表 未公表
凡例
サポート終了
サポート中
現行バージョン
最新プレビュー版
将来のリリース

Javaプログラミング例

アプリケーション(コマンドライン)

// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
  • Javaプログラムでは全てのフィールド(変数)とメソッド(関数)がclass内に記述される。
  • Javaプログラムは、public void static main (String[] args)から開始される。これはプログラムの中で一つだけ定義されるクラスメソッド(静的メソッド)である。argsはJava実行環境から受け取る開始時パラメータであり、実行時のコマンドラインで指定された文字列が渡される。
  • System.outは、Systemクラスのクラスフィールド(静的フィールド)であるoutを指す。outは、PrintStreamクラスのインスタンスである。out.println("文字列")は、outによるprintlnメソッドの呼び出しを指す。

サーブレット

// 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に渡す。HelloServletRequestServletResponseを受け取る。
    • 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プログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、JREおよびJDKの構成内容と、追加されるJavaテクノロジの組み合わせを変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティ側からも提供されており、その標準化はJavaコミュニティプロセス(JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されているので、各企業、任意団体、開発者各自が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。

エディション

2019年現在、Java権利元のオラクル社は、対象環境に合わせたJavaプラットフォームの4つのエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。

Java Platform, Standard Edition (Java SE)
スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
Java Platform, Enterprise Edition (Java EE) / Jakarta EE
サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
2017年9月にOracle社は、今後のJava EEのアップグレードがエクリプス財団によって行われる事を発表した[15][16]。JavaEEの収益性低下とクラウドコンピューティング技術への対応急務がその背景にあったとされる。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった[17]
Java Platform, Micro Edition (Java ME)
組み込みシステムマイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
Java Card
スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。現在[いつ?]ではSIMカードATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。

Java実行環境(JRE)

Java実行環境 (Java Runtime Environment) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、''Java.exe''のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。

Javaクラスライブラリ

Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。

  1. 基礎ライブラリ - Java言語の基礎を扱う。
  2. 入出力ライブラリ - ファイル入出力など。
  3. コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
  4. 数学ライブラリ - 各種計算を扱う。
  5. 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. ネットワークライブラリ - ソケット通信を扱う。
  7. GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
  8. アプレットライブラリ - アプレット生成用。
  9. Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
  10. データベース接続ライブラリ - SQLを扱う。
  11. リモートメソッドライブラリ - 分散オブジェクトを扱う。
  12. セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
Javaアプリケーションの形態

Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。

Javaアプリケーション (application)
パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「Java Web Start」は任意のjnlpファイル(java network launching protocol)をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
Javaアプレット (applet)
サーバーからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。サンドボックス機能下で厳しい動作制約が加えられている。当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった。
Java Cardプラットフォームの分野であるスマートカード(ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
Javaサーブレット (servlet)
サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。
Javaサーバーページ (server page)
サーブレットをWEBサーバー用に特化したものであり、XHTML (HTML) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、JavaScriptの様にブラウザ側で実行するスクリプトではない。類似の技術にActive Server PagesPHPがある。

Java開発キット(JDK)

Java開発キット (Java Development Kit) は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。Javaコンパイラなどの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容と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 からは、エンタープライズ版とマイクロ版では Java SDK(Java Software Development Kit)と呼び、スタンダード版とカード版では JDK(Java Development Kit)と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。
Java API

APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ(package)と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオトで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、任意団体提供のorg、企業提供のcomがある。

  1. java.lang - Java言語の基礎を扱う。
  2. java.io - ファイル入出力など。
  3. java.util - 動的配列と動的連想配列。データ集合の操作。
  4. java.math - 各種計算を扱う。
  5. java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. java.net - ソケット通信を扱う。
  7. java.awt - グラフィカル・ユーザーインターフェースを扱う。
  8. java.applet - アプレット生成用。
  9. java.beans - ソフトウェアコンポーネント作成用。
  10. java.sql - SQLを扱う。
  11. java.rmi - 分散オブジェクトを扱う。
  12. java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
統合開発環境と開発支援ツール

統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。

開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。

  • Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
  • Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
  • Gradle - Apache AntApache Mavenのコンセプトに基づくオープンソースビルド自動化システム。
  • JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。

様々なJavaテクノロジ

Javaテクノロジは、各企業、任意団体、開発者グループから様々な形で公開されている。具体的な形態例では、org/comパッケージのAPI、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、Javaコミュニティプロセス(JCP)による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(standardization)と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。

  • JNDI (Java Naming and Directory Interface) - ネーミングサービスとディレクトリサービスを扱う
  • JSML (Java Speech Markup Language) - 音声合成システムにテキスト注釈を追加する
  • JDBC (Java Database Connectivity) - データベース接続
  • JDO (Java Data Objects) - オブジェクト永続化の仕様
  • JAI (Java Advanced Imaging) - 高水準な画像操作API
  • JAIN (Java API for Integrated Networks) - 統合通信ネットワーク用のAPI
  • JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア
  • Jini - 分散システムを構築するネットワークアーキテクチャ
  • Jiro - 分散した記憶装置を管理するテクノロジ
  • JavaSpaces - 分散システム環境でオブジェクトの送受信と永続化などを支援する技術
  • JML (Java Modeling Language) - 契約による設計(DbC)を指向した形式言語をソースコードに導入する
  • JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
  • JMX (Java Management Extensions) - 主に分散システムで依存性の注入によるJavaプログラムの動的再構成
  • JSF (JavaServer Faces) - WEBクライアントにユーザーインターフェースを提供するサーバー用テクノロジ
  • JNI (Java Native Interface) - 他の言語で実装されたネイティブコードを呼び出す技術
  • JXTA - Peer to Peer (P2P) の仮想ネットワークのためのオープンプロトコル
  • Java 3D - 3次元グラフィクスプログラミングのための高水準なAPI。Java 3D
  • JOGL (Java OpenGL) - OpenGLを使う3Dプログラミングのための低水準なAPI
  • LWJGL - ゲーム開発用のAPI。OpenGLOpenALOpenCLを扱える。様々なゲーム用コントローラーも扱える。
  • OSGi - サービスの動的な管理と遠隔保守
  • Blu-ray Disc Java - ブルーレイディスクで実行される各種コンテンツ制作用

Javaテクノロジの標準化

Javaテクノロジの標準化(standardization)は、Javaコミュニティプロセス(JCP)が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々のJava仕様要求書(JSRs)によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。

Javaオープンソースモデル

開発元のサン社(後にオラクル社が買収)はJava公開初期から、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォームの移植と拡張テクノロジの開発を促していた。しかしJava普及に一定のコントロールをかける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になるとIBM社BEAシステムズ社(後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。その目的は彼ら独自のJavaオープンソース化を実現する事であった。IBM社らはJava仮想マシンと標準クラスライブラリの互換製品を登場させ、それに基づく独自標準化も徐々に進めていた。Javaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取り続けていた。しかし2006年になると業界の変化を悟ったサン社は方針を変えて賛同し、2007年5月8日にはJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[19]。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などメジャーなオペレーティングシステムでは、オラクル社、IBM社、Blackdown社などの企業またはGNUプロジェクト、Kaffe.orgなどの任意団体による独自開発のJREとJDKが公開されている。
  • 米国Excelsior社が「Excelsior JET」というahead-of-timeコンパイラを販売している[20]。JavaソースコードをそのままWindows用実行ファイルに変換して起動の高速化やアプリケーションの難読化を実現できる。
  • JarファイルをWindows用実行ファイルにラッピングにするツールも存在する。「exewrap」「JSmooth」「Launch4j」「NSIS Java Launcher with automatic JRE installation」である。JSmoothは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。

Java認定資格

認定パス

オラクル[注釈 1]は複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。

現在受験可能な資格[21][22][23][24]
資格名 レベル 対象バージョン
Java Foundations Certified Junior Associate Junior Associate 不明
Oracle Certified Java Programmer, Bronze SE 7/8[注釈 2] Bronze Java SE 7/8
Oracle Certified Java Programmer, Silver SE 8[注釈 3] Associate Java SE 8
Oracle Certified Java Programmer, Gold SE 8[注釈 4] Professional Java SE 8
Oracle Certified Professional, Java EE 7 Application Developer Professional Java EE 7
Oracle Certified Master, Java EE 6 Enterprise Architect Master Java EE 6
Oracle Certified Expert, Java EE 6 Enterprise JavaBeans Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 JavaServer Faces Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Services Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Java Persistence API Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Component Developer Expert Java EE 6

脚注

注釈

  1. ^ 買収前はサン・マイクロシステムズによって。
  2. ^ 日本でのみ行われている[25]
  3. ^ 日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。
  4. ^ 日本以外での Oracle Certified Professional, Java SE 8 Programmer に対応。

出典

  1. ^ Write once, run anywhere?”. Computer Weekly (May 2, 2002). 2009年7月27日閲覧。
  2. ^ 1.2 Design Goals of the Java™ Programming Language”. Oracle (January 1, 1999). January 23, 2013時点のオリジナルよりアーカイブ。2013年1月14日閲覧。
  3. ^ a b McMillan (August 1, 2013). “Is Java Losing Its Mojo?”. wired.com. February 15, 2017時点のオリジナルよりアーカイブ。March 8, 2017閲覧。 “Java is on the wane, at least according to one outfit that keeps on eye on the ever-changing world of computer programming languages. For more than a decade, it has dominated the TIOBE Programming Community Index, and is back on top – a snapshot of software developer enthusiasm that looks at things like internet search results to measure how much buzz different languages have. But lately, Java has been slipping.”
  4. ^ Chan (January 22, 2019). “The 10 most popular programming languages, according to the 'Facebook for programmers'”. Business Insider. June 29, 2019時点のオリジナルよりアーカイブ。June 29, 2019閲覧。
  5. ^ Chan (January 22, 2019). “The 10 most popular programming languages, according to the 'Facebook for programmers'”. Business Insider. June 29, 2019時点のオリジナルよりアーカイブ。June 29, 2019閲覧。
  6. ^ JavaOne 2013 Review: Java Takes on the Internet of Things”. www.oracle.com. April 19, 2016時点のオリジナルよりアーカイブ。2016年6月19日閲覧。
  7. ^ Why should I uninstall older versions of Java from my system?”. Oracle. 2016年9月9日閲覧。
  8. ^ a b Java Software | Oracle”. www.oracle.com. 2019年10月19日閲覧。
  9. ^ 広辞苑 第六版
  10. ^ JAVASOFT SHIPS JAVA 1.0”. March 10, 2007時点のオリジナルよりアーカイブ。2008年2月5日閲覧。
  11. ^ Chander. “Introducing Java SE 11”. oracle.com. September 26, 2018時点のオリジナルよりアーカイブ。September 26, 2018閲覧。
  12. ^ Oracle Java SE Support Roadmap”. www.oracle.com. Template:Cite webの呼び出しエラー:引数 accessdate は必須です。
  13. ^ Support | AdoptOpenJDK”. adoptopenjdk.net. Template:Cite webの呼び出しエラー:引数 accessdate は必須です。
  14. ^ a b Gupta, Arun (2018年11月14日). “Introducing Amazon Corretto, a No-Cost Distribution of OpenJDK with Long-Term Support”. 2019年12月17日閲覧。
  15. ^ Opening Up Java EE - An Update” (英語). Oracle (2017年9月12日). 2019年3月10日閲覧。
  16. ^ EE4J、EclipseファウンデーションがオープンソースJava EEを準備”. InfoQ (2017年11月16日). 2019年3月10日閲覧。
  17. ^ Java EE は Jakarta EE となる”. InfoQ (2018年3月5日). 2019年3月10日閲覧。
  18. ^ 星 暁雄=日経BP Javaプロジェクト (2003年10月31日). “EclipseとWebSphere Studioはどう違うのか | 日経 xTECH(クロステック)”. 日経 xTECH(クロステック). Nikkei Business Publications, Inc.. 2019年11月17日閲覧。
  19. ^ 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日閲覧。
  20. ^ http://www.excelsior-usa.com/jet.html
  21. ^ オラクル Java SE 認定資格パス 概要”. 2019年3月7日閲覧。
  22. ^ オラクル Java EE and Web Services 認定資格パス 概要”. 2019年3月7日閲覧。
  23. ^ Java Foundations Certified Junior Associate (novice-level certification)”. 2019年3月10日閲覧。
  24. ^ 認定試験一覧”. 2019年3月7日閲覧。
  25. ^ Java資格が大幅リニューアル。Bronze/Silver/Goldが登場”. 2019年3月7日閲覧。

参考文献

関連項目

外部リンク

オラクル・JCP関連
技術情報