「Java」の版間の差分
削除された内容 追加された内容
→プラットフォーム非依存: 出典明記 |
Javaプラットフォーム |
||
(同じ利用者による、間の26版が非表示) | |||
1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}{{出典の明記| date = 2019年3月}}{{未検証|section=1|date=2019年3月}}
{{Infobox プログラミング言語
| fetchwikidata = ALL
10行目:
| latest release date = {{release date|2020|01|14}}
| typing = 強い[[静的型付け]]
| implementations = [[Javaプラットフォーム]]
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>
| license = [[GNU General Public License]]、[[Java Community Process]]
| website = {{ConditionalURL}}
18行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は
Javaソフトウェアは、企業
Java言語は、近年のグローバルな[[機械学習]]の需要増加により世界シェアで[[Python]]には抜かれたが、システム開発では依然信頼されている言語であり、世界シェア2位の座を保っている<ref>{{Cite web|title=PYPL PopularitY of Programming Language index|url=http://pypl.github.io/PYPL.html|website=pypl.github.io|accessdate=2019-10-19|language=en}}</ref>。
== Javaの特徴 ==
Java開発元のSun Microsystemsを買収し、Java開発を引き継いだ[[オラクル (企業)|Oracle]]による公式な主張は下記である<ref name=":0">{{Cite web|title=Java Software {{!}} Oracle|url=https://www.oracle.com/java/|website=www.oracle.com|accessdate=2019-10-19}}</ref>。企業内システムの開発に最適であるとしている。
{{Quotation|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アプリケーションが動作する[[ICカード|スマートカード]])が購入されていると発表している<ref name=":0" />。
=== Javaの構文 ===
{{main|Javaの文法}}Javaプログラムの構文は、[[C言語]]または[[C++]]によく似たものである。オブジェクト指向言語としての一面が強調されがちだが、幾つかの構文ルールの違いを除いては、C言語とほぼ同様にシンプルな[[手続き型プログラミング]]のスタイルでもプログラミングできる。Javaはオブジェクト指向のプログラミングスタイルをそれほど強制しない。
=== オブジェクト指向 ===
Javaの主要プログラミングパラダイムは、[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通り[[クラス (コンピュータ)|クラス]]の仕組みを中心にする。クラスは任意のフィールド(=変数)と任意のメソッド(=関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これは[[プロトタイプベース]]・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaのプログラムは、この1個以上のクラス定義文を組み合わせて形成される。Javaはクラスベース・オブジェクト指向の三つの要点とされる[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。
Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(''private''、''package''、''protected''、''public'')によってサポートされている。アクセス修飾子はフィールド定義とメソッド定義のそれぞれ先頭に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位の''package''なので隠蔽性よりも利便性が重視されている。
Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無く''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルの全てのクラスは、基礎APIで用意されているObjectクラスを継承最上位の基底クラスにするのが強制されている。Objectクラスにはロック機能が備えられているのでオブジェクト指向とマルチスレッド同期の調和に一役買っている。
Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文で''virtual''指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い[[静的型付け]]と共に安全な[[動的型付け]]も採用しており、''instanceof''演算子による型審査と、''(typename)''によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されている[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文の''implements''によって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaには[[リフレクション (情報工学)|リフレクション]]も導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、[[分散コンピューティング]]の発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。
=== プラットフォーム非依存 ===
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
#[[Javaコンパイラ]]は、Javaプログラムのソースコードを、[[Javaバイトコード]]と呼ばれる[[中間表現]]にコンパイルする。Javaバイトコードはアセンブラのニーモニックに似たもので、[[Java仮想マシン]]上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、[[Javaクラスファイル]]と呼ばれるclass拡張子のファイルにまとめられる。
#[[Java仮想マシン]]は、各プラットフォームの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
#[[Java仮想マシン]]は、指定された[[Javaクラスファイル]]を[[Javaクラスローダー]]で読み込み、その中の[[Javaバイトコード]]を逐一解釈しながら実行する。これはインタプリタ式に行うものと、[[実行時コンパイラ]]で走行させるものがある。
公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ方式の導入によって速度問題に一定の解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコンパイル処理を更に最適化した動的再コンパイル(''dynamic recompilation'')という拡張技術も導入され、Javaプログラムの実行速度問題はほぼ解決されたと見なされている。
=== マルチスレッド ===
Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応できる各種設計を備えており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
マルチスレッド「同期」の特徴としては、前述のObjectクラスの基底継承強制により全てのインスタンスにロック機能を持たせている事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子の各メソッドはその全体が排他制御エリアになり、その呼び出し時はthisインスタンスからロックをデフォルト取得するので、イメージ的にインスタンス単位になる排他制御を自然に表現している。このロック普遍化はオブジェクト指向との調和を実現する設計と言える。''synchronized''静的メソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通単位の排他制御を表現している。また、''synchronized()''定義子の波括弧でくくられた任意のコードブロックは、this以外のインスタンスもロックオブジェクトにできる排他制御エリアになるので、きめ細かな同期も表現できる。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaプログラムのメモリ管理は、[[Java仮想マシン]]に備えられた[[ガベージコレクション]]機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。Javaのモデルである[[C++]]では、オブジェクトの生成と破棄が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に力が入れられ、[[世代別ガベージコレクション]]という拡張技術も導入された。
なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。
=== 分散コンピューティング ===
この対象は[[Object Request Broker|オブジェクト要求ブローカー]]を用いた[[分散システム]](''distributed system'')の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、Javaオリジナルの[[Java Remote Method Invocation|RMI]]と、[[Common Object Request Broker Architecture|CORBA]]の二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。
分散コンピューティングからは外れるが、JavaのネットワークAPIは、[[インターネット・プロトコル・スイート|TCP/IP]]と[[User Datagram Protocol|UDP]]プロトコル上の[[ソケット (BSD)|ソケット]]通信、セキュアな[[Transport Layer Security|SSL]] / [[Transport Layer Security|TLS]]ソケット通信を扱っており、後にJava XMLアーキテクチャとして発展する[[Extensible Markup Language|XML]]パーサおよびXML構造を操作できる[[Document Object Model|DOM]]&[[Simple API for XML|SAX]]を備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。
=== セキュリティ ===
分散ネットワークを指向するJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(''distributed'')指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。
*[[クラスローダ|クラスローダー]]はバイトコードをダウンロードして順次クラス化する。
*実行環境にあるセキュリティポリシーファイルに基づいて各種パーミッションが各クラスに付与される。セキュリティポリシーは主に指定クラス名とその対象パーミッションを照合するものである。
*実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
*スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
*その際はスレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
*appletクラスなどパーミッションのないクラスを通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。
実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。
== Javaの歴史 ==
=== 誕生の経緯 ===
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
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月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から[[携帯情報端末]](PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このユーザーインターフェース上で「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー|タイムワーナー]]社と[[3DO]]社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。
'''ワールドワイドウェブ参入(1994年6月~1994年9月)'''
1994年6月、サン社技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、[[パトリック・ノートン]]、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
'''Javaの始動(1994年10月~1996年1月)'''
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]]
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」が市場リリースされた。
=== バージョン履歴 ===
1996年の第一回公開のJavaプラットフォームは「''Java Development Kit''」通称「''JDK''」と呼ばれており、最初のバージョン数値は「1.0」に定められた。通称とバージョン値を合わせたものが製品名とされて「JDK 1.0」で市場導入されている。当初は開発チームの控えめにしたい意向で小数点第一位がメジャーバージョン値にされたが、これは不必要な謙遜という声もあった。
1998年の第三回メジャーバージョン公開である「1.2」では大幅な技術刷新をアピールするべく「''Java 2''」と次世代呼称にした。これは経営側の判断だったので開発側は小数点第一位の数値改訂を譲らなかった。製品仕様の確立で「''Development Kit''」は「''Platform''」に置き換えられた。マーケットの分化を示唆する「Standard」のエディション名も付けられた。こうして「''Java 2 Platform, Standard Edition''」の通称「''J2SE''」とバージョン値「1.2」を合わせた製品名「J2SE 1.2」で市場導入された。この次世代呼称と小数点第一位の混在名は意味が不明瞭で製品バージョンへの理解を妨げかねないと不評を買っている。この時はまだStandard版だけであったが、翌1999年にEnterprise版の「J2EE 1.2」とMicro版の「J2ME 1.2」が市場導入されて3エデイションになった。
2005年の第六回メジャーバージョン公開である「1.5」から整数部分がメジャーバージョン値にされて「5.0」になり、通称と合わせた製品名は「J2SE 5.0」になった。他のエディションは後発なので「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「''Java Card Platform''」が正規のエディション認定されているが、バージョン体系は独自のままの「Java Card 2.2」であり、これは以降も継続された。
2006年の第七回メジャーバージョン公開で「''Java 2''」の次世代呼称が外されて「''Java''」になり、バージョン値からも小数点以下が外された。「''Java Platform, Standard Edition''」「''Java Platform, Enterprise Edition''」「''Java Platform, Mirco Edition''」の各通称と各バージョン値を合わせた製品名は「Java SE 6」「Java EE 5」「Java ME 5」になった。なお、マイナーバージョンアップの際には再び小数点以下が付けられた。この命名方式は現在まで続いている。
==== JDK 1.0 (1996年1月23日) ====
最初のバージョン<ref>{{Cite press|title=JAVASOFT SHIPS JAVA 1.0|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.html
==== JDK 1.1 (1997年2月19日) ====
*内部クラス(言語仕様)
*[[JavaBeans]]([[ソフトウェアコンポーネント|ソフトウェアコンポート]]仕様とAPI)
*[[JDBC|Java Database Connectivity]](データベースAPI)
*[[Java Remote Method Invocation|RMI]](分散オブジェクトAPI)
*[[リフレクション (情報工学)|Java Reflection]](クラスメタデータ操作API)
*[[Abstract Window Toolkit|AWT]]のイベントモデル拡張
==== J2SE 1.
ここからコードネーム
*<code>strictfp</code>キーワード(言語仕様、浮動小数点計算)
*仮想マシンに実行時コンパイラ(''Just-In-Time Compiler'')
*Javaプラグイン(WEBブラウザへのアプレット実行環境挿入)
*Java Internet Description Language([[IDL (プログラミング言語)|IDL]]からJava CORBA用スタブ&スケルトンを生成)
*[[Swing]](グラフィカルAPI)
*Collection Framework(コレクションAPI)
==== J2SE
ここからメジャーバージョンのコードネーム
* 仮想マシンに[[HotSpot|HotSpotエンジン]](動的再コンパイル技術と[[世代別ガベージコレクション]])
*Java Platform Debugger Architecture(デバッガ・アーキテクチャ)
*[[Java Naming and Directory Interface|Java Name and Directory Interface]](ネーミング&ディレクトリサービスAPI)
*JavaSound(サウンドAPI)
*[[RMI-IIOP|RMI over IIOP]](RMIをIIOPプロトコル上でも使える仕様)
==== J2SE 1.4 (2002年2月6日)「Merlin」 ====
このバージョンからJavaコミュニティプロセス([[Java Community Process]])による仕様策定が開始された<ref>[http://www.jcp.org/en/jsr/detail?id=59 JSR 59]</ref><ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |title=SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080906195714/http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |archivedate=2008-09-06}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.4/relnotes/features.html |title=JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要 |accessdate=2019-03-04 |language=ja-jp}}</ref>。
*<code>assert</code> キーワード(言語仕様、例外発生ディレクティブ)
*例外処理の連鎖格納(言語仕様)
*[[Java Web Start]]
*Regular Expression([[正規表現]]API)
*Non-blocking I/O API(非遮断ストリーム入出力API)
*[[ログ|Logging]](ログ取りAPI)
*Image I/O([[JPEG]]と[[Portable Network Graphics|PNG]]を使えるAPI)
*Preferences(ツリー型のJava式セーブデータ収納庫API)
*[[Java API for XML Processing]]([[Extensible Markup Language|XML]]パーサ&マニュピレータAPI、[[XSL Transformations|XSLT]]フォーマットAPI)
*Java Cryptography Extension(暗号化API)
*Java Secure Socket Extension([[Transport Layer Security|TLS / SSL]]用API)
*Java Authentication and Authorization Service(認証&権限サービスAPI)
====
言語仕様に大幅な拡張が加えられた<ref>{{cite press|url=http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |title=Sun Ships New Version of Java Platform |publisher=Sun Microsystems |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |archivedate=2005-02-15}} </ref><ref>{{cite web|url=https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html |title=J2SE(TM) 5.0 の新機能 |language=ja-jp |accessdate=2006-07-08}}</ref>。
*[[ジェネリクス]](コレクションコンテナに収納要素の型指定が可能 <code>List<T></code>)
* [[オートボクシング]]([[プリミティブ型|プリミティブ]]と[[プリミティブラッパークラス|ラッパークラス]]の自動変換による相互代入)
* [[列挙型]](<code>enum</code>キーワードで定数列挙の型を定義)
* 可変引数(最終引数の型名+3個のドットで自動配列化 <code>void drawText(String... lines)</code>)
*[[アノテーション]](<code>@</code>キーワードで、クラスメタデータの各要素に任意のタグワードと注釈を埋め込む)
*拡張<code>for</code>文(コレクションコンテナから各要素を順々に取り出すのが便利になるループ文)
*静的インポート文(他クラスの定数のフルパスを<code>import</code>で指定可能)
*[[Java Management Extensions]](MBeanを用いた[[依存性の注入]]による実行プログラム動的再構成の最適化)
*メモリモデルの改善によるスレッド処理高速化
==== Java SE
仮想マシンを含めた既存機能の改善と洗練に力が注がれた。
* Scripting for the Java Platform(スクリプト言語との連携サポート)
*Java Architecture for XML Binding(Java XMLアーキテクチャ)
*Java API for XML Web Services
*Java Compiler API(Javaコンパイラへのディレクティブ的なAPI)
*[[Unicode正規化]] API
*Plugging annotation(コンパイル解析用途のアノテーション)
*[[Swing]]の高速化、[[Windows Aero|Windows]]用ルック&フィールの追加、Windows[[タスクトレイ]]表示
* Update10で、Java Quick Starter(アプリ起動高速化)Java Kernel(Java環境インストール高速化)を搭載<ref>{{Cite web|url=http://internet.watch.impress.co.jp/cda/news/2008/10/22/21274.html|title=「Java SE 6 Update 10」公開、動作速度を高速化|language=ja-jp|accessdate=2008-12-03}}</ref>
==== Java SE 7 (2011年7月28日)「Dolphin」 ====
サン社を買収したオラクル社による初のメジャーバージョンリリースである。
*言語仕様の細かな拡張
*invoke_dynamic API(実装クラスとメソッドシグネチャの組み換えによる動的メソッド呼び出し)
*New File I/O Library(新しいファイル入出力ライブラリ)
*Concurrency Library(並列処理系ライブラリ)
*コレクションフレームワークへのティムソートの採用
*暗号化APIに[[楕円曲線暗号]]を導入
*ネットワークAPIに[[Stream Control Transmission Protocol|Stream Control Transmissionプロトコル]]とSockets Directプロトコルを導入
*グラフィック関連の強化
*Update2で、[[JavaFX]]の導入
==== Java SE 8 (2014年3月18日) ====
ここでコードネームが廃止された<ref>[http://jcp.org/en/jsr/detail?id=337 JSR 337: Java SE 8 Release Contents]</ref>。
*言語仕様に[[無名関数|ラムダ式]]の導入(引数 -> 関数式)
*関数型インターフェース
*Stream API(コレクションコンテナ各要素への連続的なラムダ式適用)
*JavaScriptのコードを埋め込めるNashorn Javaスクリプトエンジンの搭載(Project Nashorn)
*Annotation on Java types(型アノテーション)
*Repeating annotations(反復アノテーション)
*Date and Time API(日付時刻)
*静的結合 [[Java Native Interface]] ライブラリ
*Java ME 8 に[[Connected Limited Device Configuration|CLDC]]と[[Connected Device Configuration|CDC]]が統合された<ref>{{Cite web|url=http://cloud.watch.impress.co.jp/docs/news/20120221_513391.html|title=7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch|language=ja-jp|accessdate=2012-02-22}}</ref>。
==== Java SE 9 (2017年9月21日) ====
ここからメジャーバージョンは一定の新機能蓄積を待たずに公開する毎年3月と9月の年2回定期リリース制に変更された<ref>{{Cite web|url=https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html|title=Oracle Java SE サポート・ロードマップ|language=ja-jp|accessdate=2018-10-19}}</ref>。
* 言語仕様に''package''を統合分類する「''module''」の導入(Project Jigsaw)
* 言語仕様の細かな拡張(Project Coin)
*並列処理APIのアップデート、Flowクラスの追加など
* Compact Stringの追加
* 「JShell」の搭載。コンソール形式でJavaコードを入力し実行結果を確認できる
* 「The Java Linker」の搭載。ユーザー環境に最適なモジュールと仮想マシンモードを自動選択実行する
*仮想マシンに前方コンパイル(''Ahead-Of-Time Compilation'')の導入
* XML catalogs(永続的URLへのマッピング)
*[[HiDPI]] Graphicsの導入(画像拡大縮小の改善)
==== Java SE 10 (2018年3月20日) ====
JSR 383にて仕様規定<ref>[http://jcp.org/en/jsr/detail?id=383 JSR 383: Java™ SE 10 (18.3)]</ref>
* ローカル変数の[[型推論]]
* ガーベジコレクタ関連
*[[ルート証明書]]
*Unicode language-tag extensions(Unicode言語タグの取り扱い)
==== Java SE 11 (2018年9月25日) ====
JSR 384にて仕様規定<ref>[http://jcp.org/en/jsr/detail?id=384 JSR 384: JavaTM SE 11 (18.9)]</ref>
* Dynamic class-file constants(invoke_dynamic拡張、動的ロードされたクラスへの定数ブートストラップ呼出)
* [[無名関数|ラムダ式]]への型推論
* HTTPクライアント実装へのAPI
* Flight recorder(Javaプログラム実行トレース用の軽快な各種データ収集フレームワーク)
* Unicode 10.0.0のサポート
* ガーベジコレクタ関連
==== Java SE 12 (2019年3月19日) ====
JSR 386にて仕様
* ガーベジコレクタ関連
* switch文の拡張
* JVM Constants API(主にクラスの動的ロードに関連した仮想マシン内の定数プールの操作)
==== Java SE 13(2019年9月17日) ====
JSR 388にて仕様
* ソケットAPIの再実装
* switch文の拡張
* Text Blocks(文字列定義の複数行化)
== Javaプログラミング例 ==
{{main|Javaの文法}}
=== アプリケーション(コマンドライン) ===
<source lang="java">
// Hello.java
339 ⟶ 269行目:
</source>
*Javaプログラムでは全てのフィールド(変数)とメソッド(関数)が<code>'''class'''</code>内に記述される。
*Javaプログラムは、<code>'''public void static main (String[] args)'''</code>から開始される。これはプログラムの中で一つだけ定義されるクラスメソッド(静的メソッド)である。<code>'''args'''</code>はJava実行環境から受け取る開始時パラメータであり、実行時のコマンドラインで指定された文字列が渡される。
*<code>'''System.out'''</code>は、Systemクラスのクラスフィールド(静的フィールド)であるoutを指す。outは、PrintStreamクラスのインスタンスである。<code>'''out.println("文字列")'''</code>は、outによるprintlnメソッドの呼び出しを指す。
=== サーブレット ===
<source lang="java">
// Hello.java
496 ⟶ 308行目:
; [[Java Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言え
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模であ
: 2017年9月にOracle社は、今後のJava EEの
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
506 ⟶ 318行目:
=== Java実行環境(JRE) ===
{{Main|Java Runtime Environment}}
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。
;Javaクラスライブラリ
536 ⟶ 347行目:
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
;[[Javaアプレット]] (applet)
:サーバーからダウンロードされて
:Java Cardプラットフォームの分野である[[スマートカード]](ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
;[[Java Servlet|Javaサーブレット]] (servlet)
:サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
543 ⟶ 355行目:
=== Java開発キット(JDK) ===
{{main|Java Development Kit}}
Java開発キット (''Java Development Kit'') は、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 API
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて
# java.lang - Java言語仕様の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 配列の操作とList、Set、Mapなどのデータ集合。
# java.math - 各種計算。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
# java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
# java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
# java.applet - アプレット生成用。
# java.beans - Java版ソフトウェアコンポーネント作成用。
# java.sql - SQLを扱う。
# java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
# java.security - 様々な通信セキュリティプロトコルを扱う。
# java.nio - 連続バイトデータを扱う。
# java.lang.reflect - クラス定義を動的に操作する。
;統合開発環境と開発支援ツール
統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。
*'''[[NetBeans]]''' - [[サン・マイクロシステムズ|サン社]]→[[オラクル (企業)|オラクル社]]製。オープンソースIDE。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM|IBM社]]→[[Eclipse財団]]。オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]。
*'''WebSphere Studio''' - IBM社。商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|url=https://tech.nikkeibp.co.jp/it/members/ITPro/J2EE/20031030/1/|title=EclipseとWebSphere Studioはどう違うのか {{!}} 日経 xTECH(クロステック)|accessdate=2019-11-17|publisher=Nikkei Business Publications, Inc.|author=星 暁雄=日経BP Javaプロジェクト|website=日経 xTECH(クロステック)|date=2003-10-31}}</ref>。現在はアップデート停止。[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]。
*'''{{仮リンク|IBM Rational Application Developer for WebSphere Software|en|Rational Application Developer}}''' - IBM社。[[Rational]]ブランド商用IDE。WebSphere Studioの後継製品。
*'''[[JBuilder]]''' - [[ボーランド|ボーランド社]]→[[エンバカデロ・テクノロジーズ|エンバカデロ社]]。商用IDE。JBuilder2007からEclipseベースになっている。[http://www.embarcadero.com/jp/products/jbuilder JBuilder]。
*[[JDeveloper|'''Oracle JDeveloper''']] - オラクル社。Oracle Application Serverと統合されている。2005年6月28日に無料化した。[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]。
*'''Oracle Workshop for WebLogic''' - オラクル社([[BEAシステムズ|BEAシステムズ社]])。{{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]。
*'''[[BlueJ]]''' - サン社とDeakin University(
*'''[[IntelliJ IDEA]]''' - JetBrains社
*'''JCreator''' - Xinox Software社
*'''[[Xcode]]''' - [[アップル (企業)|アップル社]]。[[macOS]]に付属する
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
583 ⟶ 410行目:
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービスと[[ディレクトリ・サービス|ディレクトリサービス]]を扱う
607 ⟶ 434行目:
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Shared Data ToolkitSound-->
*[[BD-J|Blu-ray Disc Java]] - ブルーレイディスクで実行される各種コンテンツ制作用
=== Javaテクノロジの標準化 ===
{{Main|Java Community Process}}
*[http://www.jcp.org/en/jsr/detail?id=14 JSR 14] ''Add [[総称型|Generic Types]] To The Java Programming Language'' (J2SE 5.0)
628 ⟶ 452行目:
=== Javaオープンソースモデル ===
;Javaテクノロジのオープンソース化
1996年のJava登場初期から、ベンダー元の[[サン・マイクロシステムズ|サン社]](後に[[オラクル (企業)|オラクル社]]が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になると[[IBM|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。そ
;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 General Public License|GNU一般公開ライセンス]]に従う必要があるが、MinGWの方はライセンスフリーである。
;その他
* WindowsやLinuxなどメジャーなオペレーティングシステムでは、オラクル社、IBM社、Blackdown社などの企業またはGNUプロジェクト、Kaffe.orgなどの任意団体による独自開発のJREとJDKが公開されている。
* 米国Excelsior社が「Excelsior JET」というahead-of-timeコンパイラを販売している<ref>http://www.excelsior-usa.com/jet.html</ref>。JavaソースコードをそのままWindows用実行ファイルに変換して起動の高速化やアプリケーションの[[難読化コード|難読化]]を実現できる。
* [[Jar|Jarファイル]]をWindous用実行ファイルにラッピングにするツールも存在する。「[http://exewrap.osdn.jp/ exewrap]」「[http://jsmooth.sourceforge.net/ JSmooth]」「[http://launch4j.sourceforge.net/ Launch4j]」「[http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS Java Launcher with automatic JRE installation]」である。JSmoothは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
== Java認定資格 ==
|