「Java」の版間の差分
編集の要約なし |
m 外部リンクの修正 (tech.nikkeibp.co.jp) (Botによる編集) |
||
(78人の利用者による、間の134版が非表示) | |||
1行目: | 1行目: | ||
{{Otheruses| |
{{Otheruses|プログラミング言語|その他|ジャバ}} |
||
{{混同|JavaScript |
{{混同|JavaScript}} |
||
{{出典の明記| date = 2019年3月}} |
|||
{{Infobox プログラミング言語 |
{{Infobox プログラミング言語 |
||
| fetchwikidata = ALL |
| fetchwikidata = ALL |
||
| onlysourced = true |
| onlysourced = true |
||
| name = Java |
| name = Java |
||
| |
| logo = |
||
| released = 1995年5月23日α版<br/>1995年秋β版<br/>1996年1月23日ver1.0 |
|||
| designer = [[Java Community Process]] |
| designer = [[Java Community Process]] |
||
| latest release version = Java Standard Edition |
| latest release version = Java Standard Edition 23.0.1 |
||
| latest release date = {{release date| |
| latest release date = {{release date|2024|10|15}} |
||
| typing = 強い[[静的型付け]] |
| typing = 強い[[静的型付け]] |
||
| implementations = [[Javaプラットフォーム]] |
| implementations = [[Javaプラットフォーム]] |
||
|paradigm = [[オブジェクト指向プログラミング|オブジェクト指向]], [[ソフトウェアコンポーネント|コンポーネントベース]], [[リフレクティブ]], [[ジェネリックプログラミング|ジェネリック]], [[関数型プログラミング|関数型]], [[並行計算|並行プログラミング]] |
|||
|influenced_by=[[C++]], [[Ada]]<ref>{{cite web|url={{Google books|0rUtBAAAQBAJ|page=PA133|keywords=|text=|plainurl=yes}}|title=Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans|first=Harry H.|last=Chaudhary|accessdate=2016-05-29|date=2014-07-28}}</ref>, [[Eiffel]]<ref>{{cite web|author1=Gosling, James|author2=McGilton, Henry|title=The Java Language Environment|date=May 1996|url=https://www.oracle.com/technetwork/java/langenv-140151.html|access-date=May 6, 2014|archive-url=https://web.archive.org/web/20140506214653/http://www.oracle.com/technetwork/java/langenv-140151.html|archive-date=May 6, 2014|url-status=live|df=mdy-all}}</ref>, [[Mesa]]<ref>{{cite web|author1=Gosling, James|author2=Joy, Bill|author3=Steele, Guy|author4=Bracha, Gilad|title=The Java Language Specification, 2nd Edition|url=https://java.sun.com/docs/books/jls/second_edition/html/intro.doc.html#237601|access-date=February 8, 2008|archive-url=https://web.archive.org/web/20110805051057/http://java.sun.com/docs/books/jls/second_edition/html/intro.doc.html#237601|archive-date=August 5, 2011 |url-status=live |df=mdy-all}}</ref>, [[Modula-3]]<ref>{{cite web|url=http://www.computerworld.com.au/index.php/id;1422447371;pp;3;fp;4194304;fpid;1|title=The A-Z of Programming Languages: Modula-3|publisher=Computerworld.com.au|accessdate=2010-06-09|url-status=dead|archiveurl=https://web.archive.org/web/20090105145818/http://www.computerworld.com.au/index.php/id%3B1422447371%3Bpp%3B3%3Bfp%3B4194304%3Bfpid%3B1|archivedate=January 5, 2009|df=mdy-all}}</ref>, [[Objective-C]]<ref>[[Patrick Naughton]] cites [[Objective-C]] as a strong influence on the design of the Java programming language, stating that notable direct derivatives include Java interfaces (derived from Objective-C's [[Objective-C#プロトコル|protocol]]) and primitive wrapper classes. [http://cs.gmu.edu/~sean/stuff/java-objc.html] {{Wayback|url=http://cs.gmu.edu/~sean/stuff/java-objc.html|title=Java Was Strongly Influenced by Objective-C|date=20110713014816}}</ref> |
|||
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]] |
| 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]] |
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]] |
||
| license = [[GNU General Public License]]、[[Java Community Process]] |
| license = [[GNU General Public License]]、[[Java Community Process]] |
||
| website = {{ConditionalURL}} |
| website = {{ConditionalURL}} |
||
18行目: | 22行目: | ||
}} |
}} |
||
{{プログラミング言語}} |
{{プログラミング言語}} |
||
'''Java'''(ジャバ)は、プログラミング言語Javaと、Javaプログラムの実行環境および開発環境を合わせた演算[[プラットフォーム (コンピューティング)|プラットフォーム]]の双方を指す総称である<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml |title=What is Java and why do I need it? |language=en |accessdate=2019-02-04}}</ref>。 |
|||
'''Java'''(ジャバ、ジャヴァ)は、汎用[[プログラミング言語]]と[[プラットフォーム (コンピューティング)|ソフトウェアプラットフォーム]]の双方を指している総称ブランドである<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml|title=What is Java and why do I need it?|language=en|accessdate=2019-01|publisher=}}</ref>。[[オラクル (企業)|オラクル]]およびその関連会社の登録商標である。1996年に[[サン・マイクロシステムズ]]によって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの版権もそちらに移行した。 |
|||
Javaソフトウェアは、企業内システムの構築のほか、家電機器および乗用車搭載の[[組み込みシステム]]、産業機械の[[マイクロコントローラ|マイクロ制御装置]]、各種[[モバイル端末]]、[[スマートカード]]、[[サーバー (コンピューター)|サーバーマシン]]、パーソナルコンピュータ、スマートフォンなどの様々な環境に普及しており、幅広い用途で使用されている。 |
|||
プログラミング言語Javaは、[[C++]]に類似の構文、[[クラスベース]]の[[オブジェクト指向プログラミング|オブジェクト指向]]、[[マルチスレッド]]、[[ガベージコレクション]]、[[ソフトウェアコンポーネント|コンポーネントベース]]、[[分散コンピューティング]]といった特徴を持ち、平易性重視のプログラム書式による堅牢性と、[[仮想マシン]]上での実行によるセキュリティ性および[[プラットフォーム非依存|プラットフォーム非依存性]]が理念とされている。[[Javaプラットフォーム]]は、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、[[サーバ|ビジネスサーバ]]、[[モバイル機器]]、[[組み込みシステム]]、[[スマートカード]]といった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術である[[Java仮想マシン]]は各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている<ref name="design_goals">{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html|title=1.2 Design Goals of the Java™ Programming Language|publisher=オラクル|date=January 1, 1999|accessdate=2013-01-14|archiveurl=https://web.archive.org/web/20130123204103/http://www.oracle.com/technetwork/java/intro-141325.html|archivedate=January 23, 2013}}</ref>。このテクノロジは''「[[write once, run anywhere]]''」と標榜されていた<ref>{{Cite web|url=http://www.computerweekly.com/Articles/2002/05/02/186793/write-once-run-anywhere.htm|title=Write once, run anywhere?|date=May 2, 2002|publisher=[[Computer Weekly]]|accessdate=2009-07-27}}</ref>。 |
|||
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>。 |
|||
2019年の時点で[[GitHub]]によると<ref name="名前なし-1">{{Cite web|author=Chan|first=Rosalie|title=The 10 most popular programming languages, according to the 'Facebook for programmers'|url=https://www.businessinsider.de/the-10-most-popular-programming-languages-according-to-github-2018-10?op=1|website=[[Business Insider]]|accessdate=June 29, 2019|archiveurl=https://archive.today/20190629083530/https://www.businessinsider.com/the-10-most-popular-programming-languages-according-to-github-2018-10?op=1&r=DE&IR=T|archivedate=June 29, 2019|date=January 22, 2019}}</ref>、Javaは特に[[クライアントサーバモデル|クライアント/サーバモデル]]の[[ウェブアプリケーション|Webアプリケーション]]で使用されている最も人気の高いプログラミング言語の1つであり<ref name="名前なし-1"/>、全世界でおよそ900万人の開発者がいるとレポートされている<ref>{{Cite web|url=https://www.oracle.com/technetwork/articles/java/afterglow2013-2030343.html|title=JavaOne 2013 Review: Java Takes on the Internet of Things|website=www.oracle.com|accessdate=2016-06-19|archiveurl=https://www.imarslan.com/javaone-2013-review-java-takes-on-the-internet-of-things|archivedate=April 19, 2016}}</ref>。最新バージョンは、2024年9月にリリースされたJava 23と、2021年9月にリリースされたJava 17の長期サポート(LTS)版である。オラクルは未解決のセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールと新バージョンへの移行を強く推奨している<ref>{{Cite web|url=https://www.java.com/en/download/faq/remove_olderversions.xml|title=Why should I uninstall older versions of Java from my system?|publisher=オラクル|accessdate=2016-09-09}}</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の特徴 == |
|||
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。}}また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億の[[Java Card]](Javaアプリケーションが動作する[[ICカード|スマートカード]])が購入されていると発表している<ref name=":0" />。 |
|||
現在の正規ベンダーである[[オラクル (企業)|オラクル]]の公式アピールは、以下の通りである<ref name=":0">{{Cite web|和書|title=Java Software {{!}} オラクル|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.<br/> |
|||
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造・自動車・保険・公共部門などの多くの業界で使用されています。}}オラクルによると、全世界の3億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚の[[Java Card]]が発行されている、と統計されている<ref name=":0" />。 |
|||
=== Javaの構文 === |
=== Javaの構文 === |
||
{{main|Javaの文法}}Javaプログラム |
{{main|Javaの文法}}Javaプログラム構文は、[[C++]]によく似たものである。[[オブジェクト指向言語]]の一面が強調されがちだが、C言語のような[[手続き型プログラミング|手続き型言語]]としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。 |
||
Javaは、同時に[[マルチパラダイムプログラミング言語|マルチパラダイム言語]]でもある。JDK 1.1で[[JavaBeans]]/[[Java Remote Method Invocation|JavaRMI]]/[[CORBA]]による[[ソフトウェアコンポーネント|コンポーネントプログラミング]]と、[[リフレクション (情報工学)|リフレクション]]APIによる[[メタプログラミング]]が備えられた。J2SE 5.0でジェネリクス構文/APIによる[[ジェネリックプログラミング]]が追加された。Java SE 7で並行[[Application Programming Interface|API]]による[[並行コンピューティング|並行プログラミング]]が追加された。Java SE 8では[[ラムダ式]]/関数型インターフェース/ストリームAPIなどによる[[関数型プログラミング]]が追加された。2014年(Java 8)以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。 |
|||
=== オブジェクト指向 === |
=== オブジェクト指向 === |
||
{{main|オブジェクト指向プログラミング}}Javaは、[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。[[クラス (コンピュータ)|クラス]]、[[インタフェース (抽象型)|インターフェース]]、[[インスタンス]]といった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスは[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。 |
|||
[[カプセル化]]は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、<code>private</code>は同クラス内限定、<code>package</code>は同クラス内と同パッケージ内限定、<code>protected</code>は同クラス内と同パッケージ内と派生クラス内限定、<code>public</code>は制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位の<code>package</code>なので隠蔽性よりも利便性が重視されている。 |
|||
[[継承 (プログラミング)|継承]]は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスは<code>Object</code>クラスをルートクラスとしてデフォルト継承する。<code>Object</code>クラスには[[ロック (計算機科学)|ロック]]機能が備えられており、これは[[並行プログラミング]]を前提にした仕様である。 |
|||
[[多態性]]は、[[仮想関数]]、[[抽象クラス]]、[[インタフェース (抽象型)|インターフェース]]、動的[[ダウンキャスト]]でサポートされている。スーパークラスの<code>virtual</code>メソッドを、サブクラスの同名メソッドで[[オーバーライド]]できる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、[[サブタイピング (計算機科学)|サブタイピング]]になる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストは<code>instanceof</code>演算子の実行時型チェックが可能で、ダウンキャスト失敗時は[[例外処理|例外]]発生する。 |
|||
Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文で''virtual''指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い[[静的型付け]]と共に安全な[[動的型付け]]も採用しており、''instanceof''演算子による型審査と、''(typename)''によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されている[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文の''implements''によって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaには[[リフレクション (情報工学)|リフレクション]]も導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、[[分散コンピューティング]]の発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。 |
|||
=== プラットフォーム非依存 === |
=== プラットフォーム非依存 === |
||
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェア |
{{main|Java仮想マシン}}[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定の[[ハードウェア]]や[[オペレーティングシステム]]に依存せずに、あらゆる環境での共通動作を保証する概念である。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。 |
||
#[[Javaコンパイラ]]は、Java |
#[[Javaコンパイラ]]は、Javaソースコードを、[[Javaバイトコード]]という[[中間表現]]にコンパイルする。Javaバイトコードは、[[Java仮想マシン]]用の実行コードである。Javaバイトコードは通常、[[Javaクラスファイル]]にまとめられる。 |
||
#[[Java仮想マシン]]は、各プラットフォームの |
#[[Java仮想マシン]]は、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームに[[Java実行環境]]の中核としてインストールされる。 |
||
#[[Java仮想マシン]]は、 |
#[[Java仮想マシン]]は、任意の[[Javaクラスファイル]]を[[Javaクラスローダー]]で読み込み、その[[Javaバイトコード]]を解釈実行する。インタプリタ式の解釈走行と、[[実行時コンパイラ]]で解釈走行させるものがある。 |
||
Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、[[実行時コンパイラ]]技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめて[[ネイティブコード]]にコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界と[[バッファオーバーフロー]]のチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。 |
|||
=== マルチスレッド === |
=== マルチスレッド === |
||
Javaプログラムは複数のスレッドを同時 |
{{main|マルチスレッド}}Javaプログラムは、複数以上の[[スレッド (コンピュータ)|スレッド]]を同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これは[[クライアント・サーバシステム]]の実装向けである。また、多数の断続的[[トランザクション]]をさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。 |
||
マルチスレッド |
Javaのマルチスレッド[[並行計算]]は、[[クリティカルセクション]][[同期]]が基準にされている。Javaの全インスタンスは、[[ロック (計算機科学)|ロック]]機能を備えている<code>Object</code>クラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaでは<code>synchronized</code>で指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、[[ミューテックス]]の[[モニタ (同期)|モニタ]]である。<code>synchronized</code>メソッドはその全体が排他セクションになり、そこでは[[This (プログラミング)|This]]インスタンスがロックオブジェクトになる。<code>synchronized</code>静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、<code>synchronized(指名変数)</code>構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。 |
||
ミューテックスのモニタ以外の、カウント[[セマフォ]]や[[バリア (計算機科学)|バリア]]や読み書きロックなどのロック手法は、並行APIの方で用意されている。 |
|||
=== ガベージコレクション === |
=== ガベージコレクション === |
||
{{see also|ガベージコレクション}} |
{{see also|ガベージコレクション}} |
||
Javaプログラムのメモリ管理は、[[Java仮想マシン]] |
Javaプログラムのメモリ管理は、[[Java仮想マシン]]の[[ガベージコレクション]]によって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、[[メモリリーク]]や不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。 |
||
ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。[[世代別ガベージコレクション|世代別ガベージコレクタ]]、応答時間短縮化の[[レイテンシ]]重視ガーベジコレクタ、休止時間短縮化の[[スループット]]重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。 |
|||
なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。 |
|||
=== 分散コンピューティング === |
=== 分散コンピューティング === |
||
{{see also|分散コンピューティング}} |
|||
この対象は[[Object Request Broker|オブジェクト要求ブローカー]]を用いた[[分散システム]](''distributed system'')の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、Javaオリジナルの[[Java Remote Method Invocation|RMI]]と、[[Common Object Request Broker Architecture|CORBA]]の二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。 |
|||
Javaの[[分散コンピューティング]]プログラミングは、[[Object Request Broker|オブジェクト要求ブローカー]]に準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する[[分散システム]]の構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格の[[Common Object Request Broker Architecture|CORBA]]またはJava独自規格の[[Java Remote Method Invocation|RMI]]が提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。 |
|||
業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルは[[IIOP]]、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くは[[Jakarta EE]]に属している。分散オブジェクトの中でサーバ機能に特化されたものは[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) と呼ばれている。 |
|||
分散コンピューティングからは外れるが、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]]を備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。 |
|||
[[Enterprise JavaBeans|EJB]]は、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、[[EJBコンテナ]]に内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。[[Java Naming and Directory Interface|JNDI]]は、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。 |
|||
EJBコンテナは、[[Webコンテナ|WEBコンテナ]]と連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナは[[サーブレット]]と[[JavaServer Pages|JSP]](Java Server Pages)を内包しているWEB用サーバアプリケーションであり、[[HTTP]]プロトコルを通して一般的な[[WEBブラウザ]]との同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。[[EJBコンテナ]]では[[JBoss]]や[[WebSphere Application Server|WebSphere]]などが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。[[Webコンテナ|WEBコンテナ]]では[[Apache Tomcat]]が有名である。 |
|||
=== セキュリティ === |
=== セキュリティ === |
||
{{see also|サンドボックス (セキュリティ)}} |
|||
分散ネットワークを指向するJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(''distributed'')指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。 |
|||
分散ネットワークプログラミングを重視しているJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは、[[Javaクラスファイル]]を遠隔ロードする機会が多いので、サンドボックス実行は必須になる。Javaのサンドボックスは、大抵は以下の手順になる。 |
|||
*[[クラスローダ|クラスローダー]]はバイトコードをダウンロードして順次クラス化する。 |
*[[クラスローダ|クラスローダー]]は、バイトコードをダウンロードして順次クラス化する。 |
||
*実行環境 |
*実行環境内のセキュリティポリシーファイルに従って、各種パーミッションが各クラスに付与される。セキュリティポリシーは主に、クラス名とそのパーミッションのペアで記述されている。 |
||
*実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。 |
*実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。 |
||
*スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。 |
*スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。 |
||
*その際はスレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。 |
*その際は、スレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。 |
||
*appletクラスなどパーミッションの |
*遠隔ロードされたappletクラスなどのパーミッション皆無のクラスのメソッドを一度でも通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。 |
||
実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。 |
|||
実際には上記に加えて、各クラスを役割やセキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。 |
|||
Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。 |
|||
== Javaの歴史 == |
== Javaの歴史 == |
||
84行目: | 98行目: | ||
'''家電向けプロジェクトの立ち上げ(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年)''' |
||
グリーンチーム内では当時 |
グリーンチーム内では当時の主流であったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語である[[C++]]に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の[[組み込みシステム]]であったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では[[移植性]]に対応できない点も指摘され、[[プラットフォーム非依存]]も重要な議題として提起された。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。 |
||
一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサン |
一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサンのエンジニアの[[ビル・ジョイ]]は、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーに''Further''という題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。これがJavaの前身である。 |
||
'''携帯端末、テレビ機器市場への参入と撤退(1992年 |
'''携帯端末、テレビ機器市場への参入と撤退(1992年 - 1994年5月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった[[携帯情報端末]] (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。 |
||
1992年11月、サンはファーストパーソンという会社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソンは、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー]]と[[3DO]]にそれぞれOakテクノロジを提示した。しかし、その余りに高度な柔軟さが却って倦厭されてしまい契約実現には到らなかった。サン本社はファーストパーソンの解散を決め、グリーンチームも本社に戻された。 |
|||
'''ワールドワイドウェブ参入(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月)''' |
||
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]] |
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]] |
||
1994年秋までにグリーンチームは、Oakを |
1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「[[HotJava]]」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。 |
||
1994年10月、JavaランタイムとHotJavaブラウザがサン |
1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイントとしてアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。 |
||
=== バージョン履歴 === |
=== バージョン履歴 === |
||
{{main|Javaバージョン履歴}} |
|||
1996年の第一回公開のJavaプラットフォームは「''Java Development Kit''」通称「''JDK''」と呼ばれており、最初のバージョン数値は「1.0」に定められた。通称とバージョン値を合わせたものが製品名とされて「JDK 1.0」で市場導入されている。当初は開発チームの控えめにしたい意向で小数点第一位がメジャーバージョン値にされたが、これは不必要な謙遜という声もあった。 |
|||
{| class="wikitable" |
|||
! バージョン !! リリース日 |
|||
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エデイションになった。 |
|||
|- |
|||
| JDK Beta || 1995年 |
|||
2005年の第六回メジャーバージョン公開である「1.5」から整数部分がメジャーバージョン値にされて「5.0」になり、通称と合わせた製品名は「J2SE 5.0」になった。他のエディションは後発なので「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「''Java Card Platform''」が正規のエディション認定されているが、バージョン体系は独自のままの「Java Card 2.2」であり、これは以降も継続された。 |
|||
|- |
|||
| JDK1.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|website=sun.com |access-date=2008-02-05 |url-status=dead |archive-url=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml |archive-date=March 10, 2007}}</ref> |
|||
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.1 || 1997年2月19日 |
|||
|- |
|||
最初のバージョン<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|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080625030452/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=2008-06-25|deadlinkdate=2019-03-04}}</ref>。まだ国際化対応はされず英語版のみだった。 |
|||
| J2SE 1.2 || 1998年12月8日 |
|||
|- |
|||
==== JDK 1.1 (1997年2月19日) ==== |
|||
| J2SE 1.3 || 2000年5月8日 |
|||
[[国際化と地域化|国際化]]対応され日本語版も追加された<ref>{{Cite press|title=SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080506220653/http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml|archivedate=2008-05-06|deadlinkdate=2019-03-04}}</ref>。 |
|||
|- |
|||
| J2SE 1.4 || 2002年2月6日 |
|||
*内部クラス(言語仕様) |
|||
|- |
|||
*[[JavaBeans]]([[ソフトウェアコンポーネント|ソフトウェアコンポート]]仕様とAPI) |
|||
| J2SE 5.0 || 2004年9月30日 |
|||
*[[JDBC|Java Database Connectivity]](データベースAPI) |
|||
|- |
|||
*[[Java Remote Method Invocation|RMI]](分散オブジェクトAPI) |
|||
| Java SE 6 || 2006年12月11日 |
|||
*[[リフレクション (情報工学)|Java Reflection]](クラスメタデータ操作API) |
|||
|- |
|||
*[[Abstract Window Toolkit|AWT]]のイベントモデル拡張 |
|||
| Java SE 7 || 2011年7月28日 |
|||
|- |
|||
==== J2SE 1.2 (1998年12月8日)「Playground」 ==== |
|||
| Java SE 8 || 2014年3月18日 |
|||
ここからコードネームが付けられるようになった<ref>{{Cite press|title=SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080506220658/http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.xml|archivedate=2008-05-06|deadlinkdate=2019-03-04}}</ref>。 |
|||
|- |
|||
| Java SE 9 || 2017年9月21日 |
|||
*<code>strictfp</code>キーワード(言語仕様、浮動小数点計算) |
|||
|- |
|||
*仮想マシンに実行時コンパイラ(''Just-In-Time Compiler'') |
|||
| Java SE 10 || 2018年3月20日 |
|||
*Javaプラグイン(WEBブラウザへのアプレット実行環境挿入) |
|||
|- |
|||
*Java Internet Description Language([[IDL (プログラミング言語)|IDL]]からJava CORBA用スタブ&スケルトンを生成) |
|||
| 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|last=Chander|website=oracle.com|access-date=September 26, 2018|archive-url=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archive-date=September 26, 2018|url-status=live|df=mdy-all}}</ref> |
|||
*[[Swing]](グラフィカルAPI) |
|||
|- |
|||
*Collection Framework(コレクションAPI) |
|||
| Java SE 12 || 2019年3月19日 |
|||
|- |
|||
==== J2SE 1.3 (2000年5月8日)「Kestrel」 ==== |
|||
| Java SE 13 || 2019年9月17日 |
|||
ここからメジャーバージョンのコードネームは鳥獣名、マイナーバージョンは昆虫名にするのが慣例になった<ref>{{Cite press|title=SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080516195335/http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html|archivedate=2008-05-16|deadlinkdate=2019-03-04}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.3/relnotes/features.html|title=JavaTM 2 SDK, Standard Edition, version 1.3 の新機能および機能拡張の概要|accessdate=2019-03-04|language=ja-jp}}</ref>。 |
|||
|- |
|||
| Java SE 14 || 2020年3月17日 |
|||
* 仮想マシンに[[HotSpot|HotSpotエンジン]](動的再コンパイル技術と[[世代別ガベージコレクション]]) |
|||
|- |
|||
*Java Platform Debugger Architecture(デバッガ・アーキテクチャ) |
|||
| Java SE 15 || 2020年9月15日<ref>{{cite web|url=https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15|title=The Arrival of Java 15!|date=September 15, 2020|publisher=[[Oracle Corporation|Oracle]]|access-date=2020-09-15}}</ref> |
|||
*[[Java Naming and Directory Interface|Java Name and Directory Interface]](ネーミング&ディレクトリサービスAPI) |
|||
|- |
|||
*JavaSound(サウンドAPI) |
|||
| Java SE 16 || 2021年3月16日 |
|||
*[[RMI-IIOP|RMI over IIOP]](RMIをIIOPプロトコル上でも使える仕様) |
|||
|- |
|||
| Java SE 17 || 2021年9月14日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/java17-jp-2021-09-17/|title=オラクル、Java 17をリリース|date=2021-09-17|publisher=[[Oracle Corporation|Oracle]]|access-date=2021-09-30}}</ref> |
|||
==== 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>。 |
|||
| Java SE 18 || 2022年3月22日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-18-2022-03-23/|title=オラクル、Java 18を発表|date=2022-03-22|publisher=[[Oracle Corporation|Oracle]]|access-date=2022-03-23}}</ref> |
|||
|- |
|||
*<code>assert</code> キーワード(言語仕様、例外発生ディレクティブ) |
|||
| Java SE 19 || 2022年9月20日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-19-2022-09-20/|title=オラクル、Java 19をリリース|date=2022-09-21|publisher=[[Oracle Corporation|Oracle]]|accessdate=2022-09-21}}</ref> |
|||
*例外処理の連鎖格納(言語仕様) |
|||
|- |
|||
*[[Java Web Start]] |
|||
| Java SE 20 || 2023年3月21日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-20-2023-03-21/|title=オラクル、Java 20をリリース|date=2023-03-22|publisher=[[Oracle Corporation|Oracle]]|accessdate=2022-03-23}}</ref> |
|||
*Regular Expression([[正規表現]]API) |
|||
|- |
|||
*Non-blocking I/O API(非遮断ストリーム入出力API) |
|||
| Java SE 21 || 2023年9月19日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/ocw-oracle-releases-java-21-2023-09-19/|title=オラクル、Java 21のリリースとサポート・ロードマップの延長を発表|date=2023-09-19|publisher=[[Oracle Corporation|Oracle]]|accessdate=2023-09-21}}</ref> |
|||
*[[ログ|Logging]](ログ取りAPI) |
|||
|- |
|||
*Image I/O([[JPEG]]と[[Portable Network Graphics|PNG]]を使えるAPI) |
|||
| Java SE 22 || 2024年3月19日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-22-2024-03-19/|title=オラクル、Java 22をリリース|date=2024-03-21|publisher=[[Oracle Corporation|Oracle]]|accessdate=2024-03-23}}</ref> |
|||
*Preferences(ツリー型のJava式セーブデータ収納庫API) |
|||
|- |
|||
*[[Java API for XML Processing]]([[Extensible Markup Language|XML]]パーサ&マニュピレータAPI、[[XSL Transformations|XSLT]]フォーマットAPI) |
|||
| Java SE 23 || 2024年9月17日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-23-2024-09-17/|title=オラクル、Java 23をリリース|date=2024-09-17|publisher=[[Oracle Corporation|Oracle]]|accessdate=2024-09-18}}</ref> |
|||
*Java Cryptography Extension(暗号化API) |
|||
|} |
|||
*Java Secure Socket Extension([[Transport Layer Security|TLS / SSL]]用API) |
|||
*Java Authentication and Authorization Service(認証&権限サービスAPI) |
|||
==== J2SE 5.0 (2004年9月30日)「Tiger」 ==== |
|||
言語仕様に大幅な拡張が加えられた<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 6 (2006年12月11日)「Mustang」 ==== |
|||
仮想マシンを含めた既存機能の改善と洗練に力が注がれた。 |
|||
* 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>。ここから追加機能の大半は規範テクノロジ相当のJSR(仕様要求)ではなく、拡張テクノロジ相当のJEP(改良提案)になった。 |
|||
* ローカル変数の[[型推論]] |
|||
* ガーベジコレクタ関連 |
|||
*[[ルート証明書]] |
|||
*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>。Java開発環境として「Oracle JDK」と「[[OpenJDK]]」の二つが提供されるようになり、前者の商用利用は有償サポート契約を結んだ顧客のみになった。Java EEのアップグレードがエクリプス財団による「Jakarta EE」に移譲されたので、JDKにEnterprise版連携モジュールが含まれなくなった。CORBAモジュールも外された。[[JavaFX|Java FX]]も取り除かれた。 |
|||
* 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 SE 14(2020年3月17日) ==== |
|||
JSR 389にて仕様規定。 |
|||
== Javaプログラミング例 == |
== Javaプログラミング例 == |
||
{{main|Javaの文法}} |
{{main|Javaの文法}} |
||
=== アプリケーション(コマンドライン) === |
|||
=== Hello World === |
|||
<source lang="java"> |
|||
<syntaxhighlight lang="java"> |
|||
// Hello.java |
// Hello.java |
||
public class Hello { |
public class Hello { |
||
270行目: | 187行目: | ||
} |
} |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
*Javaプログラムでは全てのフィールド |
*Javaプログラムでは全てのフィールドとメソッドが<code>'''class'''</code>内に記述される。 |
||
*Javaプログラムは |
*Javaプログラムは静的メソッド<code>'''public static void main (String[] args)'''</code>から開始される。<code>'''args'''</code>はプログラム開始時のコマンドライン・パラメータである。 |
||
*<code>'''System.out'''</code>は |
*<code>'''System.out'''</code>はSystemクラスの静的フィールドoutを意味する。outはPrintStream型のインスタンスである。<code>'''out.println("文字列")'''</code>はoutのprintlnメソッドを呼び出す。 |
||
=== サーブレット === |
|||
<source lang="java"> |
|||
// 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!"); |
|||
} |
|||
} |
|||
</source> |
|||
*'''<code>import</code>'''文は、[[コンパイル]]時にJavaコンパイラに対し、このソースコード内では'''{{Javadoc:SE|package=java.io|java/io}}'''パッケージおよび'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/package-summary.html javax.servlet]</code><!--{{Javadoc:EE|package=javax.servlet|javax/servlet}}-->'''パッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを伝える。 |
|||
*<code>'''Hello'''</code> <code>class</code> <code>'''extends'''</code> '''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/GenericServlet.html GenericServlet]</code><!--{{Javadoc:EE|javax/servlet|GenericServlet}}-->''' の部分は、<code>Hello</code>クラスが <code>GenericServlet</code>クラスを継承すること(<code>GenericServlet</code>の[[サブクラス (計算機科学)|サブクラス]]であること)を記述している。 |
|||
*<code>GenericServlet</code>クラスは、サーブレットの一般的なフレームワークを提供する。[[サーバ]]上で、[[クライアント (コンピュータ)|クライアント]]から送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。 |
|||
*<code>Hello</code>クラスは<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/Servlet.html Servlet]</code><!--{{Javadoc:EE|javax/servlet|Servlet}}-->で宣言された'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/Servlet.html#service(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse) service(ServletRequest, ServletResponse)]</code><!--{{Javadoc:EE|name=service(ServletRequest, ServletResponse)|javax/servlet|Servlet|service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}}-->'''メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。<code>service(ServletRequest, ServletResponse)</code>メソッドは、'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletRequest.html ServletRequest]</code><!--{{Javadoc:EE|javax/servlet|ServletRequest}}-->'''オブジェクトと'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html ServletResponse]</code><!--{{Javadoc:EE|javax/servlet|ServletResponse}}-->'''オブジェクトを<code>Hello</code>に渡す。<code>Hello</code>は<code>ServletRequest</code>と<code>ServletResponse</code>を受け取る。 |
|||
**<code>ServletRequest</code>オブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。 |
|||
**<code>ServletResponse</code>オブジェクトは、クライアントに送り返す応答を表すオブジェクトである。 |
|||
*<code>service(ServletRequest, ServletResponse)</code>メソッドの<code>throws ServletException, IOException</code>の部分では、このメソッドが<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletException.html ServletException]</code><!--{{Javadoc:EE|javax/servlet|ServletException}}-->もしくは{{Javadoc:SE|java/io|IOException}}の[[例外処理|例外]]を投げる可能性があることを宣言している。これらの例外は、<code>Hello</code> サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。 |
|||
*'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html#setContentType(java.lang.String) setContentType(String)]</code><!--{{Javadoc:EE|name=setContentType(String)|javax/servlet|ServletResponse|setContentType(java.lang.String)}}-->'''メソッドを呼び出して、クライアントに返すデータの[[メディアタイプ|MIME Content-Type]]を '''"text/html"''' に設定する。 |
|||
*'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html#getWriter() getWriter()]</code><!--{{Javadoc:EE|name=getWriter()|javax/servlet|ServletResponse|getWriter()}}-->'''メソッドを呼び出して'''{{Javadoc:SE|java/io|PrintWriter}}'''オブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。 |
|||
*'''{{Javadoc:SE|name=println(String)|java/io|PrintWriter|println(java.lang.String)}}'''メソッドを呼び出して、'''"Hello, world!"''' 文字列を応答データとして書き出す。 |
|||
*<!--'''<code>[http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/PrintWriter.html#close() close()]</code>{{Javadoc:SE|name=close()|java/io|PrintWriter|close()}}'''メソッドを呼び出して<code>PrintWriter</code>のストリームを閉じる。-->そして応答データは[[ソケット (BSD)|ソケット]][[ストリーム (プログラミング)|ストリーム]]に書き出され、クライアントに返される。 |
|||
== Javaプラットフォーム == |
== Javaプラットフォーム == |
||
{{Main|Javaプラットフォーム}} |
{{Main|Javaプラットフォーム}} |
||
Javaプラットフォーム |
Javaプラットフォーム (''Java Platform'') は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなく[[サードパーティー]]側からも提供されており、その標準化は[[Java Community Process|Javaコミュニティプロセス]] (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大なITエコシステムを構築している。 |
||
=== エディション === |
=== エディション === |
||
2019年現在、Java権利元のオラクル |
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 Platform, Standard Edition]] (Java SE) |
||
: スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。 |
: [[スマートフォン]]や[[タブレット端末]]を含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。 |
||
; [[Java Platform, Enterprise Edition]] |
; [[Jakarta EE|Java Platform, Enterprise Edition]] (Java EE) / [[Jakarta EE]] |
||
: サーバ |
: サーバマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバ及び多層クライアントサーバ、業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。 |
||
: 2017年9月に |
: 2017年9月にオラクルは今後のJava EEのバージョンアップが[[Eclipse Foundation|エクリプス財団]]によって行われる事を発表した<ref>{{Cite web|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update |title=Opening Up Java EE - An Update |date=2017-09-12 |publisher=オラクル |language=en |accessdate=2019-03-10}}</ref><ref>{{Cite web|和書|url=https://www.infoq.com/jp/news/2017/11/towards-java-EE-at-eclipse |title=EE4J、EclipseファウンデーションがオープンソースJava EEを準備 |date=2017-11-16 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。Java EEの商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンは'''Jakarta EE'''の名称で公開される事になった<ref>{{Cite web|和書|url=https://www.infoq.com/jp/news/2018/03/java-ee-becomes-jakarta-ee |title=Java EE は Jakarta EE となる |date=2018-03-05 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。 |
||
; [[Java Platform, Micro Edition]] |
; [[Java Platform, Micro Edition]] (Java ME) |
||
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ |
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。 |
||
; [[Javaカード|Java Card]] |
; [[Javaカード|Java Card]] |
||
: [[スマートカード]](ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。{{いつ範囲|date=2019年3月|現在}}では[[SIMカード]]や[[ATMカード]]など幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。 |
: [[スマートカード]](ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。{{いつ範囲|date=2019年3月|現在}}では[[SIMカード]]や[[ATMカード]]など幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。 |
||
=== Java実行環境 |
=== Java実行環境 (JRE) === |
||
{{Main|Java Runtime Environment}} |
{{Main|Java Runtime Environment}} |
||
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。[[Java仮想マシン]]、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。 |
Java実行環境 (''Java Runtime Environment''; JRE) は、Javaアプリケーションを実行するために必要なソフトウェアである。[[Java仮想マシン]]、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。 |
||
;Javaクラスライブラリ |
;Javaクラスライブラリ |
||
329行目: | 219行目: | ||
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。 |
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。 |
||
# 基礎ライブラリ - Java言語 |
# 基礎ライブラリ - Java言語の基礎を扱う。 |
||
# 入出力ライブラリ - ファイル入出力など。 |
# 入出力ライブラリ - ファイル入出力など。 |
||
# |
# コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。 |
||
# 数学ライブラリ - 各種計算。 |
# 数学ライブラリ - 各種計算を扱う。 |
||
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの[[国際化と地域化]]を扱う。 |
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの[[国際化と地域化]]を扱う。 |
||
# ネットワークライブラリ - ソケット |
# ネットワークライブラリ - ソケット通信を扱う。 |
||
# GUIライブラリ - |
# GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。 |
||
# |
# アプレットライブラリ - アプレット生成用。 |
||
# Javaビーンズライブラリ - |
# Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。 |
||
# データベース接続ライブラリ - SQLを扱う。 |
# データベース接続ライブラリ - SQLを扱う。 |
||
# リモートメソッドライブラリ - |
# リモートメソッドライブラリ - 分散オブジェクトを扱う。 |
||
#セキュリティライブラリ - |
#セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。 |
||
# バッファストリームライブラリ - 連続バイトデータを扱う。 |
|||
#リフレクションライブラリ - クラス定義を動的に操作する。 |
|||
;Javaアプリケーションの形態 |
;Javaアプリケーションの形態 |
||
350行目: | 238行目: | ||
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。 |
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。 |
||
;[[Javaアプレット]] (applet) |
;[[Javaアプレット]] (applet) |
||
:サーバ |
:サーバからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。[[サンドボックス (セキュリティ)|サンドボックス]]機能下で厳しい動作制約が加えられている。{{独自研究範囲|当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった|date=2020年12月10日 (木) 13:45 (UTC)}}。 |
||
:Java Cardプラットフォームの分野である[[スマートカード]](ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。 |
:Java Cardプラットフォームの分野である[[スマートカード]](ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。 |
||
;[[Java Servlet|Javaサーブレット]] (servlet) |
;[[Java Servlet|Javaサーブレット]] (servlet) |
||
:サーバ |
:サーバマシンで実行されるJavaプログラム。その名の通り手軽にサーバプログラムを実装出来るが、大規模サーバの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。 |
||
;[[JavaServer Pages|Javaサーバ |
;[[JavaServer Pages|Javaサーバページ]] (server page) |
||
:サーブレットをWEBサーバ |
:サーブレットをWEBサーバ用に特化したものであり、[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバ側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、[[JavaScript]]の様にブラウザ側で実行するスクリプトではない。類似の技術に[[Active Server Pages]]、[[PHP (プログラミング言語)|PHP]]がある。 |
||
=== Java開発キット |
=== Java開発キット (JDK) === |
||
{{main|Java Development Kit}} |
{{main|Java Development Kit}} |
||
Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。[[Javaコンパイラ]]などの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。 |
Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。[[Javaコンパイラ]]などの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。 |
||
*J2SE 1.2.2_004 までは、 |
*J2SE 1.2.2_004 までは、JDK (''Java Development Kit'') と呼んでいた。 |
||
*J2SE 1.4 までは、Java2 |
*J2SE 1.4 までは、Java2 SDK (''Java2 Software Development Kit'') と呼んでいた。 |
||
*J2SE 5.0 からは再び、 |
*J2SE 5.0 からは再び、JDK (''Java Development Kit'') と呼んだ。 |
||
*JavaSE 7 からは、エンタープライズ版とマイクロ版では Java |
*JavaSE 7 からは、エンタープライズ版とマイクロ版では Java SDK (''Java Software Development Kit'') と呼び、スタンダード版とカード版では JDK (''Java Development Kit'')と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。 |
||
;Java API |
;Java API |
||
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ |
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ (''package'') と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオドで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、任意団体提供のorg、企業提供のcomがある。 |
||
# java.lang - Java言語 |
# java.lang - Java言語の基礎を扱う。 |
||
# java.io - ファイル入出力など。 |
# java.io - ファイル入出力など。 |
||
# java.util - 配列 |
# java.util - 動的配列と動的連想配列。データ集合の操作。 |
||
# java.math - 各種計算。 |
# java.math - 各種計算を扱う。 |
||
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。 |
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。 |
||
# java.net - ソケット |
# java.net - ソケット通信を扱う。 |
||
# java.awt - |
# java.awt - グラフィカル・ユーザーインターフェイスを扱う。 |
||
# java.applet - アプレット生成用。 |
# java.applet - アプレット生成用。 |
||
# java.beans - |
# java.beans - ソフトウェアコンポーネント作成用。 |
||
# java.sql - SQLを扱う。 |
# java.sql - SQLを扱う。 |
||
# java.rmi - |
# java.rmi - 分散オブジェクトを扱う。 |
||
# java.security - |
# java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。 |
||
# java.nio - 連続バイトデータを扱う。 |
|||
# java.lang.reflect - クラス定義を動的に操作する。 |
|||
;統合開発環境と開発支援ツール |
;統合開発環境と開発支援ツール |
||
統合開発環境 |
統合開発環境 (IDE)は、JDKを中核にしてビジュアルエディターやビルドマネジャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。 |
||
*'''[[NetBeans]]''' - [[サン・マイクロシステムズ |
*'''[[NetBeans]]''' - ([[サン・マイクロシステムズ]]→[[オラクル (企業)|オラクル]])オープンソースIDE。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。 |
||
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM |
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - ([[IBM]]→[[Eclipse財団]])オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org] [http://eclipsewiki.net/eclipse/ EclipseWiki]。 |
||
*'''WebSphere Studio''' - |
*'''WebSphere Studio''' -([[IBM]])商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|和書|url=https://xtech.nikkei.com/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|en|Rational Application Developer|label='''IBM Rational'''}} - (IBM) [[Rational]]ブランド商用IDE。WebSphere Studioの後継製品。 |
||
*'''[[JBuilder]]''' - [[ボーランド |
*'''[[JBuilder]]''' - ([[ボーランド]]→[[エンバカデロ・テクノロジーズ]])商用IDE。JBuilder2007からEclipseベースになっている。[http://www.embarcadero.com/jp/products/jbuilder JBuilder]。 |
||
*[[JDeveloper|'''Oracle JDeveloper''']] - オラクル |
*[[JDeveloper|'''Oracle JDeveloper''']] - (オラクル)Oracle Application Serverと統合されている。2005年6月28日に無料化した。[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]。 |
||
*'''Oracle Workshop for WebLogic''' - |
*'''Oracle Workshop for WebLogic''' - ([[BEAシステムズ]]→オラクル){{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop]。 |
||
*'''[[BlueJ]]''' - サン |
*'''[[BlueJ]]''' - ([[サン・マイクロシステムズ]]、豪[[ディーキン大学]]、英[[ケント大学]]の共同開発)フリーIDE。[http://www.bluej.org/ BlueJ]。 |
||
*'''[[IntelliJ IDEA]]''' - JetBrains |
*'''[[IntelliJ IDEA]]''' - (JetBrains) 商用IDE。[[Android Studio]]のベースになった。[http://www.jetbrains.com/idea/ IntelliJ IDEA]。 |
||
*'''JCreator''' - Xinox Software |
*'''JCreator''' - (Xinox Software) 商用IDE。[http://www.jcreator.com/ JCreator]。 |
||
*'''[[Xcode]]''' - [[ |
*'''[[Xcode]]''' - ([[Apple]])[[macOS]]に付属するIDE。 |
||
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。 |
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。 |
||
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。 |
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make (UNIX)|make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。 |
||
*'''[[Apache Maven]]''' - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。 |
*'''[[Apache Maven]]''' - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。 |
||
*'''[[Gradle]]''' - [[Apache Ant]]や[[Apache Maven]]のコンセプトに基づくオープンソースビルド自動化システム。 |
*'''[[Gradle]]''' - [[Apache Ant]]や[[Apache Maven]]のコンセプトに基づくオープンソースビルド自動化システム。 |
||
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。 |
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。 |
||
=== |
=== Javaテクノロジの数々 === |
||
<!--================================================================================ |
{{Main|Java Community Process}}<!--================================================================================ |
||
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。 |
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。 |
||
=================================================================================--> |
=================================================================================--> |
||
Javaテクノロジは、各 |
Javaテクノロジは、個人を含む各種組織から様々な形態で公開されている。開発元から提示された技術は、[[Java Community Process]] (JCP) による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化 (''standardization'') と言う。Javaテクノロジが準拠すべき規範仕様は、JCP管理下で発行される数々の[[:Category:Java specification requests|Java仕様要求]] (Java Specification Request) にて定義されている。Javaテクノロジは様々な分野に導入されている。その一例を以下に列挙する。 |
||
; [[Java Native Interface|JNI]] (Java Native Interface) : 他の言語で実装されたネイティブコードを呼び出す技術 |
|||
; JMI (Java Metadata Interface) : Javaのメタデータの作成・アクセス・検索・送受信に関する仕様 |
|||
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキストの注釈を追加する |
|||
; JML (Java Modeling Language) : [[契約による設計]] (DbC) を指向した形式言語をソースコードに導入する |
|||
*[[JDBC]]<!--(Java Database Connectivity)--> - [[データベース]]接続の API |
|||
; [[Java Management Extensions|JMX]] (Java Management Extensions) : 主に分散システムで[[依存性の注入]]によるJavaプログラムの動的な再構成技術 |
|||
*[[Java Data Objects|JDO]] (Java Data Objects) - Java[[オブジェクト (プログラミング)|オブジェクト]]の[[永続性 (計算機科学)|永続化]]のインタフェース |
|||
; JDMK (Java Dynamic Management Kit) : JMX仕様に基づいた開発支援ソフトウェア |
|||
*JAI (Java Advanced Imaging) - 画像を扱うための高水準なオブジェクト指向 API |
|||
; [[Java Data Objects|JDO]] (Java Data Objects) : [[オブジェクト (プログラミング)|オブジェクト]][[永続性|永続化]]の仕様 |
|||
*JAIN (Java API for Integrated Networks) - 統合された通信ネットワークの API |
|||
; Jini : 分散システムを構築するネットワークアーキテクチャ |
|||
*JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア |
|||
; JavaSpaces : Jiniの分散システム環境でオブジェクトの送受信と永続化などをサポートするテクノロジ |
|||
; JAIN (Java API for Integrated Networks) : 統合通信ネットワーク用のAPI |
|||
*Jiro - 分散した記憶装置を管理する技術 |
|||
; [[JavaServer Faces|JSF]] (Java Server Faces) : WEBクライアントにユーザーインターフェースを提供するサーバ用テクノロジ |
|||
*JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術 |
|||
; [[JXTA]] : [[Peer to Peer|P2P]]の仮想ネットワークのためのオープンプロトコル |
|||
*JML (Java Modeling Language) - [[契約による設計|契約による設計(DbC)]]を指向した形式言語をソースコードに導入する |
|||
; [[OSGi]] : サービスの動的な管理と遠隔保守 |
|||
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様 |
|||
; [[Java3D]] : 3次元グラフィクスプログラミングのための高水準なAPI。[https://java3d.dev.java.net/ Java 3D]<!--([http://java.sun.com/products/java-media/3D/ ホーム]、[http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/ API])--> |
|||
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 分散オブジェクト環境における管理と監視を行う技術 |
|||
; JOGL (Java OpenGL) : [[OpenGL]]を使う3Dプログラミングのための低水準なAPI |
|||
*[[JavaServer Faces|JSF]] (JavaServer Faces) - WEBクライアントに一定のデザインに基づいたUIを提供するサーバー用技術 |
|||
; JAI (Java Advanced Imaging) : 高水準な画像操作API |
|||
*[[Java Native Interface|JNI]] (Java Native Interface) - 他の言語で実装されたネイティブコードを呼び出す技術 |
|||
<!--; Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) : java.media - マルチメディア向けAPI--> |
|||
*[[JXTA]] - [[Peer to Peer]] (P2P) の仮想ネットワークのためのオープンプロトコル |
|||
; [[LWJGL]] : ゲーム開発用のAPI。[[OpenGL]], [[OpenAL]], [[OpenCL]]を扱える。様々なゲーム用コントローラーも扱える。 |
|||
*[[Java3D|Java 3D]] - 3次元グラフィクスプログラミングのための高水準な API [https://java3d.dev.java.net/ Java 3D]<!--([http://java.sun.com/products/java-media/3D/ ホーム]、[http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/ API])--> |
|||
; JSML (Java Speech Markup Language) : [[音声合成]]システムにテキスト注釈を追加する |
|||
*JOGL (Java OpenGL) - [[OpenGL]] を使う3Dグラフィクスプログラミングのための低水準な API |
|||
<!--; Shared Data ToolkitSound--> |
|||
*[[LWJGL]] - ゲーム開発用のAPI。[[OpenGL]]、[[OpenAL]]、[[OpenCL]]を扱える。様々なゲーム用コントローラーも扱える。 |
|||
; [[BD-J|Blu-ray Disc Java]] : ブルーレイディスク (BD) で実行される各種コンテンツ制作用 |
|||
*[[OSGi]] - サービスの動的な管理と遠隔保守<!-- |
|||
*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}} |
|||
Javaテクノロジの標準化(''standardization'')は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々の[[:Category:Java specification requests|Java仕様要求書(JSRs)]]によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。 |
|||
*[http://www.jcp.org/en/jsr/detail?id=14 JSR 14] ''Add [[総称型|Generic Types]] To The Java Programming Language'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=133 JSR 133] ''Java Memory Model and Thread Specification Revision'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=166 JSR 166] ''Concurrency Utilities'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=175 JSR 175] ''A Metadata Facility for the Java Programming Language'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] ''J2SE 5.0 (Tiger) Release Contents'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=201 JSR 201] ''Extending the Java Programming Language with [[列挙型|Enumerations]], [[オートボクシング|Autoboxing]], [[foreach文|Enhanced for loops]] and Static Import'' (J2SE 5.0) |
|||
*[http://www.jcp.org/en/jsr/detail?id=244 JSR 244] ''Java EE 5 Specification'' (Java EE 5) |
|||
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0) |
|||
=== Javaオープンソースモデル === |
=== Javaオープンソースモデル === |
||
[[サン・マイクロシステムズ]]は1996年のリリース当初からJava実行環境とJava開発環境をオープンソース化しており、サードパーティーにJavaテクノロジ開発への参入をアピールしていた。ただしJavaの普及に一定のコントロールをかける為にソースコードの改変までは認めていなかった。2004年になると[[IBM]]が業界の優位性を活かしてJavaオープンソースプロジェクトの主導権を握るようになった。[[Java Community Process|Javaコミュニティプロセス]]を取り巻く業界の変化を悟ったサン・マイクロシステムズはIBMとの本格的な提携を承認し、2007年にJava SE 6を「[[OpenJDK]]」として[[GNU General Public License|GNU一般公開ライセンス]]の下でリリースした<ref>{{Cite web|title=Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community|url=http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.3.xml|author=Sun Microsystems, Inc|date=2007-5-8|accessdate=2009年9月16日}}</ref>。OpenJDKではソースコードの改変も認められた。[[GNUプロジェクト]]は「[[GNU Interpreter for Java]]」、[[GNUコンパイラコレクション]]の「[[GNU Compiler for Java]]」、互換クラスライブラリの「[[GNU Classpath]]」を公開した。Windows用GNU Compilerは、[[MinGW]]と併せて[[Cygwin]]の環境上でも実行できた。 |
|||
;Javaテクノロジのオープンソース化 |
|||
1996年のJava登場初期から、ベンダー元の[[サン・マイクロシステムズ|サン社]](後に[[オラクル (企業)|オラクル社]]が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になると[[IBM|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。その目的は彼ら独自のJavaオープンソース化を実現する事であり、Java仮想マシンと標準クラスライブラリの互換製品を登場させ、その他の標準化も徐々に進めていた。そうした中でJavaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取り続けていた。しかし業界の変化を悟ったサン社は2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「[[OpenJDK]]」として[[GNU General Public License|GNU一般公開ライセンス]]の下でリリースした<ref>{{Cite web|title=Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community|url=http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.3.xml|author=Sun Microsystems, Inc|date=2007-5-8|accessdate=2009年9月16日}}</ref>。OpenJDKではソースコードの改変も認められた。「[[GNU Classpath]]」は、J2SE 1.4のクラスライブラリの99%以上を実装し[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk14-classpath.html]、J2SE 5.0では95%以上を実装している[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath.html]。また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 General Public License|GNU一般公開ライセンス]]に従う必要があるが、MinGWの方はライセンスフリーである。 |
|||
;その他 |
|||
WindowsやLinuxなどのメジャーOSでは、オラクル、IBM、Blackdown、GNUプロジェクト、Kaffe.orgなどによるJavaプラットフォームが公開されている。また、JavaソースコードをそのままWin用実行ファイルに変換する「Excelsior JET」や<ref>http://www.excelsior-usa.com/jet.html</ref>、JarファイルをWin用実行ファイルに変換する「[http://exewrap.osdn.jp/ exewrap]」「[http://launch4j.sourceforge.net/ Launch4j]」「[http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS]」「[http://jsmooth.sourceforge.net/ JSmooth]」なども販売ないし公開されている。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 --> |
|||
* 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認定資格 == |
== Java認定資格 == |
||
474行目: | 334行目: | ||
代わりに現行のオラクルの再受験ポリシーを記述する。-->認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。 |
代わりに現行のオラクルの再受験ポリシーを記述する。-->認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。 |
||
{| class="sortable wikitable" style="font-size:small" |
{| class="sortable wikitable" style="font-size:small" |
||
|+ 現在受験可能な資格<ref>{{Cite web|url=https://education.oracle.com/ja/oracle-certification-path/product_267 |title=オラクル Java SE 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|url=https://education.oracle.com/ja/oracle-certification-path/product_264 |title=オラクル Java EE and Web Services 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|url=https://education.oracle.com/products/trackp_372 |title=Java Foundations Certified Junior Associate (novice-level certification) |accessdate=2019-03-10}}</ref><ref>{{Cite web|url=http://www.oracle.com/jp/education/certification/examlist-172597-ja.html#2 |title=認定試験一覧 |accessdate=2019-03-07}}</ref> |
|+ 現在受験可能な資格<ref>{{Cite web|和書|url=https://education.oracle.com/ja/oracle-certification-path/product_267 |title=オラクル Java SE 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|和書|url=https://education.oracle.com/ja/oracle-certification-path/product_264 |title=オラクル Java EE and Web Services 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|url=https://education.oracle.com/products/trackp_372 |title=Java Foundations Certified Junior Associate (novice-level certification) |accessdate=2019-03-10}}</ref><ref>{{Cite web|和書|url=http://www.oracle.com/jp/education/certification/examlist-172597-ja.html#2 |title=認定試験一覧 |accessdate=2019-03-07}}</ref> |
||
! 資格名 !! レベル !! 対象バージョン |
! 資格名 !! レベル !! 対象バージョン |
||
|- |
|- |
||
| Java Foundations Certified Junior Associate || data-sort-value="0" | Junior Associate || {{Unknown}} |
| Java Foundations Certified Junior Associate || data-sort-value="0" | Junior Associate || {{Unknown}} |
||
|- |
|- |
||
| Oracle Certified Java Programmer, Bronze SE 7/8{{efn|日本でのみ行われている<ref>{{Cite web|url=https://www.atmarkit.co.jp/ait/articles/1209/27/news141.html |title=Java資格が大幅リニューアル。Bronze/Silver/Goldが登場 |accessdate=2019-03-07}}</ref>。}} || data-sort-value="0" | Bronze || Java SE 7/8 |
| Oracle Certified Java Programmer, Bronze SE 7/8{{efn|日本でのみ行われている<ref>{{Cite web|和書|url=https://www.atmarkit.co.jp/ait/articles/1209/27/news141.html |title=Java資格が大幅リニューアル。Bronze/Silver/Goldが登場 |accessdate=2019-03-07}}</ref>。}} || data-sort-value="0" | Bronze || Java SE 7/8 |
||
|- |
|- |
||
| Oracle Certified Java Programmer, Silver SE 8{{efn|日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。}} || data-sort-value="1" | Associate || Java SE 8 |
| Oracle Certified Java Programmer, Silver SE 8{{efn|日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。}} || data-sort-value="1" | Associate || Java SE 8 |
||
500行目: | 360行目: | ||
|} |
|} |
||
== |
== 注釈 == |
||
{{脚注ヘルプ}} |
|||
=== 注釈 === |
|||
{{Reflist|group=注釈}} |
{{Reflist|group=注釈}} |
||
=== 出典=== |
|||
== 出典 == |
|||
{{reflist|2}} |
|||
{{Reflist|2}} |
|||
== 参考文献 == |
== 参考文献 == |
||
528行目: | 387行目: | ||
*[[Javaコンパイラ]] |
*[[Javaコンパイラ]] |
||
*[[Java Community Process]] - Java技術の標準化プロセス |
*[[Java Community Process]] - Java技術の標準化プロセス |
||
*[[Javaチャンピオン]] |
|||
== 外部リンク == |
== 外部リンク == |
||
'''オラクル・JCP関連''' |
|||
*[https://java.com/ja/ Java |
*[https://www.java.com/ja/ Java] {{Ja icon}} - Javaのユーザー向け公式サイト |
||
*[https://www.oracle.com/jp/java/ Javaソフトウェア | オラクル | Oracle 日本] - オラクル |
|||
*[https://home.java.net/ Java.net] {{Ref-en}} - Javaの技術者向け公式サイト |
|||
*[https://www.jcp.org/ Java Community Process] {{ |
*[https://www.jcp.org/ Java Community Process] {{En icon}} - JCPのサイト。JSRなどを閲覧できる |
||
*[https://www.oracle.com |
**[https://www.oracle.com/jp/java/technologies/downloads/ Java Downloads] |
||
**[https:// |
**[https://docs.oracle.com/javase/jp/7/ Java Platform Standard Edition 7 ドキュメント] |
||
**[https:// |
**[https://www.oracle.com/jp/java/technologies/java-se-api-doc.html Java SE APIおよびドキュメント] |
||
**[https://docs.oracle.com/javase/jp/7/api/ コア API ドキュメント] |
|||
**[https://docs.oracle.com/cd/E26537_01/tutorial/ Java チュートリアル] |
**[https://docs.oracle.com/cd/E26537_01/tutorial/ Java チュートリアル] |
||
'''技術情報''' |
|||
*[https://www.atmarkit.co.jp/ait/subtop/java/ @IT: Java Agile] {{ |
*[https://www.atmarkit.co.jp/ait/subtop/java/ @IT: Java Agile] {{Ja icon}} - Java技術者のための情報提供/情報交換フォーラム |
||
*[ |
*[https://developer.ibm.com/languages/java/ IBM developerWorks Java technology] {{Ja icon}} - IBM developerWorks の開発者向けの記事 |
||
*[https://openjdk.org/ OpenJDK] {{En icon}} |
|||
*[http://www.computer-books.us/java.php Computer-Books.us] {{Ref-en}} - Java の複数の書籍(無償でダウンロード可能) |
|||
*[https://www.oracle.com/jp/java/ Java SE] - オラクル(旧サン)によるJREとJDKの実装 |
|||
*[http://www.oracle.com/technetwork/jp/middleware/jrockit/overview/ Oracle JRockit] - オラクル(旧BEAシステムズ)によるJava仮想マシンとJDKの実装 |
|||
*[http://openjdk.java.net/ OpenJDK] {{Ref-en}} |
|||
*[http://gcc.gnu.org/java/ GNU Compiler for Java (GCJ)] {{Ref-en}} |
|||
{{Java}} |
{{Java}} |
||
553行目: | 408行目: | ||
{{プログラミング言語一覧}} |
{{プログラミング言語一覧}} |
||
{{FOSS}} |
{{FOSS}} |
||
{{典拠管理}} |
|||
{{DEFAULTSORT:JAVA}} |
|||
[[カテゴリ:Java|*]] |
|||
[[ |
[[Category:Java|*]] |
||
[[Category:Javaプラットフォーム|*Java]] |
|||
[[カテゴリ:オブジェクト指向言語]] |
|||
[[ |
[[Category:サン・マイクロシステムズ]] |
||
[[ |
[[Category:オラクル]] |
||
[[ |
[[Category:オブジェクト指向言語]] |
||
[[Category:Java仮想マシンで動作するプログラミング言語]] |
|||
[[Category:基本情報技術者試験]] |
|||
[[Category:プログラミング言語]] |
2024年12月5日 (木) 12:23時点における最新版
パラダイム | オブジェクト指向, コンポーネントベース, リフレクティブ, ジェネリック, 関数型, 並行プログラミング |
---|---|
登場時期 |
1995年5月23日α版 1995年秋β版 1996年1月23日ver1.0 |
設計者 | Java Community Process |
開発者 | サン・マイクロシステムズ、オラクル |
最新リリース | Java Standard Edition 23.0.1/ 2024年10月15日 |
型付け | 強い静的型付け |
主な処理系 | Javaプラットフォーム |
影響を受けた言語 | C++, Ada[1], Eiffel[2], Mesa[3], Modula-3[4], Objective-C[5] |
影響を与えた言語 | C#, D, Dart, Groovy, Scala, Kotlin, Ceylon |
プラットフォーム |
Solaris, Linux, Windows, macOS, AIX, System i |
ライセンス | GNU General Public License、Java Community Process |
ウェブサイト |
www |
拡張子 | java、class、jar |
Java(ジャバ、ジャヴァ)は、汎用プログラミング言語とソフトウェアプラットフォームの双方を指している総称ブランドである[6]。オラクルおよびその関連会社の登録商標である。1996年にサン・マイクロシステムズによって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの版権もそちらに移行した。
プログラミング言語Javaは、C++に類似の構文、クラスベースのオブジェクト指向、マルチスレッド、ガベージコレクション、コンポーネントベース、分散コンピューティングといった特徴を持ち、平易性重視のプログラム書式による堅牢性と、仮想マシン上での実行によるセキュリティ性およびプラットフォーム非依存性が理念とされている。Javaプラットフォームは、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、ビジネスサーバ、モバイル機器、組み込みシステム、スマートカードといった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術であるJava仮想マシンは各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている[7]。このテクノロジは「write once, run anywhere」と標榜されていた[8]。
2019年の時点でGitHubによると[9]、Javaは特にクライアント/サーバモデルのWebアプリケーションで使用されている最も人気の高いプログラミング言語の1つであり[9]、全世界でおよそ900万人の開発者がいるとレポートされている[10]。最新バージョンは、2024年9月にリリースされたJava 23と、2021年9月にリリースされたJava 17の長期サポート(LTS)版である。オラクルは未解決のセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールと新バージョンへの移行を強く推奨している[11]。
Javaの特徴
[編集]現在の正規ベンダーであるオラクルの公式アピールは、以下の通りである[12]。特に業務用システムの構築に最適であるとしている。
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億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚のJava Cardが発行されている、と統計されている[12]。
Javaの構文
[編集]Javaプログラム構文は、C++によく似たものである。オブジェクト指向言語の一面が強調されがちだが、C言語のような手続き型言語としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。
Javaは、同時にマルチパラダイム言語でもある。JDK 1.1でJavaBeans/JavaRMI/CORBAによるコンポーネントプログラミングと、リフレクションAPIによるメタプログラミングが備えられた。J2SE 5.0でジェネリクス構文/APIによるジェネリックプログラミングが追加された。Java SE 7で並行APIによる並行プログラミングが追加された。Java SE 8ではラムダ式/関数型インターフェース/ストリームAPIなどによる関数型プログラミングが追加された。2014年(Java 8)以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。
オブジェクト指向
[編集]Javaは、クラスベースのオブジェクト指向である[13]。クラス、インターフェース、インスタンスといった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスはカプセル化、継承、多態性をサポートしている。
カプセル化は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、private
は同クラス内限定、package
は同クラス内と同パッケージ内限定、protected
は同クラス内と同パッケージ内と派生クラス内限定、public
は制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位のpackage
なので隠蔽性よりも利便性が重視されている。
継承は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスはObject
クラスをルートクラスとしてデフォルト継承する。Object
クラスにはロック機能が備えられており、これは並行プログラミングを前提にした仕様である。
多態性は、仮想関数、抽象クラス、インターフェース、動的ダウンキャストでサポートされている。スーパークラスのvirtual
メソッドを、サブクラスの同名メソッドでオーバーライドできる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、サブタイピングになる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストはinstanceof
演算子の実行時型チェックが可能で、ダウンキャスト失敗時は例外発生する。
プラットフォーム非依存
[編集]プラットフォーム非依存とは、Javaプログラムが特定のハードウェアやオペレーティングシステムに依存せずに、あらゆる環境での共通動作を保証する概念である。”Write once, run anywhere”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。
- Javaコンパイラは、Javaソースコードを、Javaバイトコードという中間表現にコンパイルする。Javaバイトコードは、Java仮想マシン用の実行コードである。Javaバイトコードは通常、Javaクラスファイルにまとめられる。
- Java仮想マシンは、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームにJava実行環境の中核としてインストールされる。
- Java仮想マシンは、任意のJavaクラスファイルをJavaクラスローダーで読み込み、そのJavaバイトコードを解釈実行する。インタプリタ式の解釈走行と、実行時コンパイラで解釈走行させるものがある。
Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめてネイティブコードにコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界とバッファオーバーフローのチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。
マルチスレッド
[編集]Javaプログラムは、複数以上のスレッドを同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これはクライアント・サーバシステムの実装向けである。また、多数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。
Javaのマルチスレッド並行計算は、クリティカルセクション同期が基準にされている。Javaの全インスタンスは、ロック機能を備えているObject
クラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaではsynchronized
で指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、ミューテックスのモニタである。synchronized
メソッドはその全体が排他セクションになり、そこではThisインスタンスがロックオブジェクトになる。synchronized
静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、synchronized(指名変数)
構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。
ミューテックスのモニタ以外の、カウントセマフォやバリアや読み書きロックなどのロック手法は、並行APIの方で用意されている。
ガベージコレクション
[編集]Javaプログラムのメモリ管理は、Java仮想マシンのガベージコレクションによって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、メモリリークや不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。
ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。世代別ガベージコレクタ、応答時間短縮化のレイテンシ重視ガーベジコレクタ、休止時間短縮化のスループット重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。
分散コンピューティング
[編集]Javaの分散コンピューティングプログラミングは、オブジェクト要求ブローカーに準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する分散システムの構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格のCORBAまたはJava独自規格のRMIが提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。
業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルはIIOP、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くはJakarta EEに属している。分散オブジェクトの中でサーバ機能に特化されたものはEJB (Enterprise JavaBeans) と呼ばれている。
EJBは、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、EJBコンテナに内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。JNDIは、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。
EJBコンテナは、WEBコンテナと連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナはサーブレットとJSP(Java Server Pages)を内包しているWEB用サーバアプリケーションであり、HTTPプロトコルを通して一般的なWEBブラウザとの同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。EJBコンテナではJBossやWebSphereなどが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。WEBコンテナではApache Tomcatが有名である。
セキュリティ
[編集]分散ネットワークプログラミングを重視しているJavaは、サンドボックスモデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム(Javaバイトコード)による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは、Javaクラスファイルを遠隔ロードする機会が多いので、サンドボックス実行は必須になる。Javaのサンドボックスは、大抵は以下の手順になる。
- クラスローダーは、バイトコードをダウンロードして順次クラス化する。
- 実行環境内のセキュリティポリシーファイルに従って、各種パーミッションが各クラスに付与される。セキュリティポリシーは主に、クラス名とそのパーミッションのペアで記述されている。
- 実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
- スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
- その際は、スレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
- 遠隔ロードされたappletクラスなどのパーミッション皆無のクラスのメソッドを一度でも通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。
実際には上記に加えて、各クラスを役割やセキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
Javaの歴史
[編集]誕生の経緯
[編集]家電向けプロジェクトの立ち上げ(1990年12月)
Javaの歴史は、1990年12月にサン・マイクロシステムズ(サン)が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するための水面下プロジェクトをリサーチ段階を兼ねて試験的に立ち上げた事から始まる。サンはこの分野が今後の重要市場になると予測していた。サンのエンジニアであるジェームズ・ゴスリンやパトリック・ノートンらの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らはカリフォルニア州メンローパーク市サンドヒルロードに用意された比較的小さなオフィスで開発を始めた。
Oak言語とGreen OSの誕生(1991年)
グリーンチーム内では当時の主流であったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語であるC++に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の組み込みシステムであったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では移植性に対応できない点も指摘され、プラットフォーム非依存も重要な議題として提起された。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。
一方で、Mesa言語とC言語の長所を理想にしていたサンのエンジニアのビル・ジョイは、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーにFurtherという題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。これがJavaの前身である。
携帯端末、テレビ機器市場への参入と撤退(1992年 - 1994年5月)
1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった携帯情報端末 (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。
1992年11月、サンはファーストパーソンという会社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソンは、ケーブルテレビ用セットトップボックス事業への参入を決めて、タイム・ワーナーと3DOにそれぞれOakテクノロジを提示した。しかし、その余りに高度な柔軟さが却って倦厭されてしまい契約実現には到らなかった。サン本社はファーストパーソンの解散を決め、グリーンチームも本社に戻された。
ワールドワイドウェブ参入(1994年6月〜1994年9月)
1994年6月、サン技術部長ジョン・ゲージがジェームズ・ゴスリン、ビル・ジョイ、パトリック・ノートン、エリック・シュミットら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らはワールドワイドウェブをプロジェクトの本命に据える事で一致した。革新的なウェブブラウザである「NCSA Mosaic」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
Javaの始動(1994年10月~1996年1月)
1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「HotJava」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。
1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術がセールスポイントとしてアピールされた。同時にネットスケープが「Netscape Navigator」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
バージョン履歴
[編集]バージョン | リリース日 |
---|---|
JDK Beta | 1995年 |
JDK1.0 | 1996年1月23日[14] |
JDK 1.1 | 1997年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日[15] |
Java SE 12 | 2019年3月19日 |
Java SE 13 | 2019年9月17日 |
Java SE 14 | 2020年3月17日 |
Java SE 15 | 2020年9月15日[16] |
Java SE 16 | 2021年3月16日 |
Java SE 17 | 2021年9月14日[17] |
Java SE 18 | 2022年3月22日[18] |
Java SE 19 | 2022年9月20日[19] |
Java SE 20 | 2023年3月21日[20] |
Java SE 21 | 2023年9月19日[21] |
Java SE 22 | 2024年3月19日[22] |
Java SE 23 | 2024年9月17日[23] |
Javaプログラミング例
[編集]Hello World
[編集]// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
- Javaプログラムでは全てのフィールドとメソッドが
class
内に記述される。 - Javaプログラムは静的メソッド
public static void main (String[] args)
から開始される。args
はプログラム開始時のコマンドライン・パラメータである。 System.out
はSystemクラスの静的フィールドoutを意味する。outはPrintStream型のインスタンスである。out.println("文字列")
はoutのprintlnメソッドを呼び出す。
Javaプラットフォーム
[編集]Javaプラットフォーム (Java Platform) は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティー側からも提供されており、その標準化はJavaコミュニティプロセス (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大な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月にオラクルは今後のJava EEのバージョンアップがエクリプス財団によって行われる事を発表した[24][25]。Java EEの商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった[26]。
- Java Platform, Micro Edition (Java ME)
- 組み込みシステム、マイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
- Java Card
- スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。現在[いつ?]ではSIMカードやATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。
Java実行環境 (JRE)
[編集]Java実行環境 (Java Runtime Environment; JRE) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、''Java.exe''のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
- Javaクラスライブラリ
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
- 基礎ライブラリ - Java言語の基礎を扱う。
- 入出力ライブラリ - ファイル入出力など。
- コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
- 数学ライブラリ - 各種計算を扱う。
- 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
- ネットワークライブラリ - ソケット通信を扱う。
- GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
- アプレットライブラリ - アプレット生成用。
- Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
- データベース接続ライブラリ - SQLを扱う。
- リモートメソッドライブラリ - 分散オブジェクトを扱う。
- セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
- 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 Pages、PHPがある。
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がある。
- java.lang - Java言語の基礎を扱う。
- java.io - ファイル入出力など。
- java.util - 動的配列と動的連想配列。データ集合の操作。
- java.math - 各種計算を扱う。
- java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
- java.net - ソケット通信を扱う。
- java.awt - グラフィカル・ユーザーインターフェイスを扱う。
- java.applet - アプレット生成用。
- java.beans - ソフトウェアコンポーネント作成用。
- java.sql - SQLを扱う。
- java.rmi - 分散オブジェクトを扱う。
- java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
- 統合開発環境と開発支援ツール
統合開発環境 (IDE)は、JDKを中核にしてビジュアルエディターやビルドマネジャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。
- NetBeans - (サン・マイクロシステムズ→オラクル)オープンソースIDE。NetBeans.org NetBeans.jp。
- Eclipse SDK - (IBM→Eclipse財団)オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。eclipse.org EclipseWiki。
- WebSphere Studio -(IBM)商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの[27]。現在はアップデート停止。WebSphere。
- IBM Rational - (IBM) Rationalブランド商用IDE。WebSphere Studioの後継製品。
- JBuilder - (ボーランド→エンバカデロ・テクノロジーズ)商用IDE。JBuilder2007からEclipseベースになっている。JBuilder。
- Oracle JDeveloper - (オラクル)Oracle Application Serverと統合されている。2005年6月28日に無料化した。JDeveloper。
- Oracle Workshop for WebLogic - (BEAシステムズ→オラクル)WebLogicと統合されている。Oracle Workshop。
- BlueJ - (サン・マイクロシステムズ、豪ディーキン大学、英ケント大学の共同開発)フリーIDE。BlueJ。
- IntelliJ IDEA - (JetBrains) 商用IDE。Android Studioのベースになった。IntelliJ IDEA。
- JCreator - (Xinox Software) 商用IDE。JCreator。
- Xcode - (Apple)macOSに付属するIDE。
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
- Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
- Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
- Gradle - Apache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システム。
- JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。
Javaテクノロジの数々
[編集]Javaテクノロジは、個人を含む各種組織から様々な形態で公開されている。開発元から提示された技術は、Java Community Process (JCP) による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化 (standardization) と言う。Javaテクノロジが準拠すべき規範仕様は、JCP管理下で発行される数々のJava仕様要求 (Java Specification Request) にて定義されている。Javaテクノロジは様々な分野に導入されている。その一例を以下に列挙する。
- JNI (Java Native Interface)
- 他の言語で実装されたネイティブコードを呼び出す技術
- JMI (Java Metadata Interface)
- Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
- JML (Java Modeling Language)
- 契約による設計 (DbC) を指向した形式言語をソースコードに導入する
- JMX (Java Management Extensions)
- 主に分散システムで依存性の注入によるJavaプログラムの動的な再構成技術
- JDMK (Java Dynamic Management Kit)
- JMX仕様に基づいた開発支援ソフトウェア
- JDO (Java Data Objects)
- オブジェクト永続化の仕様
- Jini
- 分散システムを構築するネットワークアーキテクチャ
- JavaSpaces
- Jiniの分散システム環境でオブジェクトの送受信と永続化などをサポートするテクノロジ
- JAIN (Java API for Integrated Networks)
- 統合通信ネットワーク用のAPI
- JSF (Java Server Faces)
- WEBクライアントにユーザーインターフェースを提供するサーバ用テクノロジ
- JXTA
- P2Pの仮想ネットワークのためのオープンプロトコル
- OSGi
- サービスの動的な管理と遠隔保守
- Java3D
- 3次元グラフィクスプログラミングのための高水準なAPI。Java 3D
- JOGL (Java OpenGL)
- OpenGLを使う3Dプログラミングのための低水準なAPI
- JAI (Java Advanced Imaging)
- 高水準な画像操作API
- LWJGL
- ゲーム開発用のAPI。OpenGL, OpenAL, OpenCLを扱える。様々なゲーム用コントローラーも扱える。
- JSML (Java Speech Markup Language)
- 音声合成システムにテキスト注釈を追加する
- Blu-ray Disc Java
- ブルーレイディスク (BD) で実行される各種コンテンツ制作用
Javaオープンソースモデル
[編集]サン・マイクロシステムズは1996年のリリース当初からJava実行環境とJava開発環境をオープンソース化しており、サードパーティーにJavaテクノロジ開発への参入をアピールしていた。ただしJavaの普及に一定のコントロールをかける為にソースコードの改変までは認めていなかった。2004年になるとIBMが業界の優位性を活かしてJavaオープンソースプロジェクトの主導権を握るようになった。Javaコミュニティプロセスを取り巻く業界の変化を悟ったサン・マイクロシステムズはIBMとの本格的な提携を承認し、2007年にJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[28]。OpenJDKではソースコードの改変も認められた。GNUプロジェクトは「GNU Interpreter for Java」、GNUコンパイラコレクションの「GNU Compiler for Java」、互換クラスライブラリの「GNU Classpath」を公開した。Windows用GNU Compilerは、MinGWと併せてCygwinの環境上でも実行できた。
WindowsやLinuxなどのメジャーOSでは、オラクル、IBM、Blackdown、GNUプロジェクト、Kaffe.orgなどによるJavaプラットフォームが公開されている。また、JavaソースコードをそのままWin用実行ファイルに変換する「Excelsior JET」や[29]、JarファイルをWin用実行ファイルに変換する「exewrap」「Launch4j」「NSIS」「JSmooth」なども販売ないし公開されている。
Java認定資格
[編集]オラクル[注釈 1]は複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。
資格名 | レベル | 対象バージョン |
---|---|---|
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 |
注釈
[編集]出典
[編集]- ^ Chaudhary, Harry H. (2014年7月28日). “Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans”. 2016年5月29日閲覧。
- ^ “The Java Language Environment” (May 1996). May 6, 2014時点のオリジナルよりアーカイブ。May 6, 2014閲覧。
- ^ “The Java Language Specification, 2nd Edition”. August 5, 2011時点のオリジナルよりアーカイブ。February 8, 2008閲覧。
- ^ “The A-Z of Programming Languages: Modula-3”. Computerworld.com.au. January 5, 2009時点のオリジナルよりアーカイブ。2010年6月9日閲覧。
- ^ Patrick Naughton cites Objective-C as a strong influence on the design of the Java programming language, stating that notable direct derivatives include Java interfaces (derived from Objective-C's protocol) and primitive wrapper classes. [1] Java Was Strongly Influenced by Objective-C - ウェイバックマシン(2011年7月13日アーカイブ分)
- ^ “What is Java and why do I need it?” (英語). 2019年1月閲覧。
- ^ “1.2 Design Goals of the Java™ Programming Language”. オラクル (January 1, 1999). January 23, 2013時点のオリジナルよりアーカイブ。2013年1月14日閲覧。
- ^ “Write once, run anywhere?”. Computer Weekly (May 2, 2002). 2009年7月27日閲覧。
- ^ a b Chan (January 22, 2019). “The 10 most popular programming languages, according to the 'Facebook for programmers'”. Business Insider. June 29, 2019時点のオリジナルよりアーカイブ。June 29, 2019閲覧。
- ^ “JavaOne 2013 Review: Java Takes on the Internet of Things”. www.oracle.com. April 19, 2016時点のオリジナルよりアーカイブ。2016年6月19日閲覧。
- ^ “Why should I uninstall older versions of Java from my system?”. オラクル. 2016年9月9日閲覧。
- ^ a b “Java Software | オラクル”. www.oracle.com. 2019年10月19日閲覧。
- ^ 広辞苑 第六版
- ^ “JAVASOFT SHIPS JAVA 1.0”. sun.com. March 10, 2007時点のオリジナルよりアーカイブ。2008年2月5日閲覧。
- ^ Chander, Sharat. “Introducing Java SE 11”. oracle.com. September 26, 2018時点のオリジナルよりアーカイブ。September 26, 2018閲覧。
- ^ “The Arrival of Java 15!”. Oracle (September 15, 2020). 2020年9月15日閲覧。
- ^ “オラクル、Java 17をリリース”. Oracle (2021年9月17日). 2021年9月30日閲覧。
- ^ “オラクル、Java 18を発表”. Oracle (2022年3月22日). 2022年3月23日閲覧。
- ^ “オラクル、Java 19をリリース”. Oracle (2022年9月21日). 2022年9月21日閲覧。
- ^ “オラクル、Java 20をリリース”. Oracle (2023年3月22日). 2022年3月23日閲覧。
- ^ “オラクル、Java 21のリリースとサポート・ロードマップの延長を発表”. Oracle (2023年9月19日). 2023年9月21日閲覧。
- ^ “オラクル、Java 22をリリース”. Oracle (2024年3月21日). 2024年3月23日閲覧。
- ^ “オラクル、Java 23をリリース”. Oracle (2024年9月17日). 2024年9月18日閲覧。
- ^ “Opening Up Java EE - An Update” (英語). オラクル (2017年9月12日). 2019年3月10日閲覧。
- ^ “EE4J、EclipseファウンデーションがオープンソースJava EEを準備”. InfoQ (2017年11月16日). 2019年3月10日閲覧。
- ^ “Java EE は Jakarta EE となる”. InfoQ (2018年3月5日). 2019年3月10日閲覧。
- ^ 星 暁雄=日経BP Javaプロジェクト (2003年10月31日). “EclipseとWebSphere Studioはどう違うのか | 日経 xTECH(クロステック)”. 日経 xTECH(クロステック). Nikkei Business Publications, Inc.. 2019年11月17日閲覧。
- ^ 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
- ^ “オラクル Java SE 認定資格パス 概要”. 2019年3月7日閲覧。
- ^ “オラクル Java EE and Web Services 認定資格パス 概要”. 2019年3月7日閲覧。
- ^ “Java Foundations Certified Junior Associate (novice-level certification)”. 2019年3月10日閲覧。
- ^ “認定試験一覧”. 2019年3月7日閲覧。
- ^ “Java資格が大幅リニューアル。Bronze/Silver/Goldが登場”. 2019年3月7日閲覧。
参考文献
[編集]- 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に対する批判
- C♯とJavaの比較
- Java仮想マシン
- Javaコンパイラ
- Java Community Process - Java技術の標準化プロセス
- Javaチャンピオン
外部リンク
[編集]オラクル・JCP関連
- Java - Javaのユーザー向け公式サイト
- Javaソフトウェア | オラクル | Oracle 日本 - オラクル
- Java Community Process - JCPのサイト。JSRなどを閲覧できる
技術情報
- @IT: Java Agile - Java技術者のための情報提供/情報交換フォーラム
- IBM developerWorks Java technology - IBM developerWorks の開発者向けの記事
- OpenJDK