削除された内容 追加された内容
バージョン更新
(同じ利用者による、間の5版が非表示)
1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|Javaプラットフォーム|Javaプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}{{未検証|section=1|date=2019年3月}}{{出典の明記| date = 2019年3月}}
{{Infobox プログラミング言語
| fetchwikidata = ALL
| onlysourced = true
| name = Java
| logo = File: Java 20131025 1864663017.jpg
| released = {{start date and age|1995}}
| designer = [[Java Community Process]]
11 ⟶ 12行目:
| typing = 強い[[静的型付け]]
| implementations = [[Javaプラットフォーム]]
|paradigm = [[オブジェクト指向]], コンポーネントベース, [[ジェネリックプログラミング|ジェネリック]], [[関数型プログラミング|関数型]], [[命令型プログラミング]]
|influenced_by=CLU,<ref name="BarbaraLiskov">{{cite book |title=Program Development in Java - Abstraction, Specification, and Object-Oriented Design|author=[[Barbara Liskov]] with [[John Guttag]]|publisher=USA, Addison Wesley|year=2000}}</ref> [[Simula|Simula67]],<ref name="BarbaraLiskov"/> [[C++]],<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> [[Oberon]],<ref>[[Niklaus Wirth]] stated on a number of public occasions, e.g. in a lecture at the Polytechnic Museum, Moscow in September 2005 (several independent first-hand accounts in Russian exist, e.g. one with an audio recording: {{cite web|author=Filippova, Elena|title=Niklaus Wirth's lecture at the Polytechnic Museum in Moscow|date=September 22, 2005|url=http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1155}}), that the Sun Java design team licensed the Oberon compiler sources a number of years prior to the release of Java and examined it: a (relative) compactness, type safety, garbage collection, no multiple inheritance for classes{{snd}} all these key overall design features are shared by Java and Oberon.</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#Protocols|protocol]]) and primitive wrapper classes. [http://cs.gmu.edu/~sean/stuff/java-objc.html] {{Webarchive|url=https://web.archive.org/web/20110713014816/http://cs.gmu.edu/~sean/stuff/java-objc.html|date=July 13, 2011}}</ref>[[Object Pascal]]<ref>In the summer of 1996, Sun was designing the precursor to what is now the event model of the AWT and the JavaBeans component architecture. Borland contributed greatly to this process. We looked very carefully at Delphi Object Pascal and built a working prototype of bound method references in order to understand their interaction with the Java programming language and its APIs.[https://web.archive.org/web/20120627043929/http://java.sun.com/docs/white/delegates.html White Paper About Microsoft's Delegates]</ref>
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>Embedded Systems
| license = [[GNU General Public License]]、[[Java Community Process]]
| website = {{ConditionalURL}}
18 ⟶ 21行目:
}}
{{プログラミング言語}}
[[ファイル:Java 20131025 1864663017.jpg|境界|右|フレームなし|280x280ピクセル]]
'''Java'''(ジャヴァ)は、[[クラスベース]]の[[オブジェクト指向プログラミング|オブジェクト指向]]の、実装の[[結合度|依存関係]]をできるだけ少なくするように設計された汎用[[プログラミング言語]]である。これは、アプリケーション開発者が一度書いたらどこでも実行できるようにすること(WORA:''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コードは、再コンパイルを必要とせずに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=Oracle|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>。Javaアプリケーションは、通常、基礎となるコンピュータアーキテクチャに関係なく、あらゆるJava仮想マシン(JVM)上で実行できるバイトコードにコンパイルされる。Javaの構文は[[C言語|C]]および[[C++|C ++]]に似ているが、どちらよりも[[低水準言語|低レベル]]の機能が少ない。2019年の時点で、[[GitHub]] <ref name=":02">{{Cite web|url=https://www.wired.com/2013/01/java-no-longer-a-favorite/|title=Is Java Losing Its Mojo?|quote=Java is on the wane, at least according to one outfit that keeps on eye on the ever-changing world of computer programming languages. For more than a decade, it has dominated the [[TIOBE index|TIOBE]] Programming Community Index, and is back on top – a snapshot of software developer enthusiasm that looks at things like internet search results to measure how much buzz different languages have. But lately, Java has been slipping.|first=Robert|author=McMillan|date=August 1, 2013|publisher=[[wired.com]]|accessdate=March 8, 2017|archiveurl=https://web.archive.org/web/20170215115409/https://www.wired.com/2013/01/java-no-longer-a-favorite/|archivedate=February 15, 2017}}</ref> <ref>{{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=":02" /> <ref>{{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>、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>。
 
29 ⟶ 31行目:
{{Quotation|Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector.
 
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。}}また全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億の[[Java Card]](Javaアプリケーションが動作する[[ICカード|スマートカード]])が購入されていると発表している<ref name=":0" />。
 
=== Javaの構文 ===
35 ⟶ 37行目:
 
=== オブジェクト指向 ===
{{main|オブジェクト指向プログラミング}}Javaの主要パラダイムは[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。クラスはフィールド(メンバ変数)とメソッド(メンバ関数)をひとまとめにしたものである。クラスの構成要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスは入れ子クラス)の六種類である。Javaプログラムは1個以上のクラス定義文から形成される。Javaのクラス機構は[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。
 
Javaのカプセル化は、フィールドとメソッドの可視性を定める四つのアクセス修飾子(''private''、''package''、''protected''、''public'')でサポートされている。これはフィールド&メソッド定義に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はファイル単位の''package''なので隠蔽性よりも利便性が重視されている。Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており多重継承は除外されている。既存クラスを元にして任意のフィールドとメソッドを追加した新しいクラスを作成できる。Javaの全クラスはObjectクラスをデフォルト継承する。全クラスの派生元になるObjectクラスが持つロック機能はオブジェクト指向とマルチスレッド同期を調和させている。Javaの多態性は、[[仮想関数]]と[[インタフェース (抽象型)|インターフェース]]と実行時[[ダウンキャスト]]と[[リフレクション (情報工学)|リフレクション]]でサポートされている。親クラスの''abstract''メソッドが仮想関数の抽象メソッドになり、子クラスの同名オーバーライドメソッドが仮想関数の実装メソッドになる。インターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、''implements''構文によって任意の数だけクラスに実装できる。実行時ダウンキャストは''instanceof''演算子による実行時型チェックで事前確認でき、ダウンキャスト失敗時は例外発生によってフォローできる。リフレクションはクラスの構造内容を操作できる機能で[[ダイナミックバインディング|動的ディスパッチ]]、[[メッセージ転送|メソッドミッシング]]、[[モンキーパッチ]]などの実装に活用できる。ただし安易な使用は推奨されていない
 
Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており多重継承は除外されている。継承タイプも除外されており''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。Javaの全クラスはObjectクラスをデフォルト継承する。全クラスの派生元になるObjectクラスが持つロック機能はオブジェクト指向とマルチスレッド同期を調和させている。
 
Javaの多態性は、[[仮想関数]]と[[インタフェース (抽象型)|インターフェース]]と実行時[[ダウンキャスト]]と[[リフレクション (情報工学)|リフレクション]]でサポートされている。親クラスの''abstract''メソッドが仮想関数の抽象メソッドになり、子クラスの同名オーバーライドメソッドが仮想関数の実装メソッドになる。インターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、''implements''構文によって任意の数だけクラスに実装できる。インターフェースはJavaの中でも比較的重視されており各クラスの動作局面を明確にする。実行時ダウンキャストは''instanceof''演算子による実行時型チェックで事前確認でき、ダウンキャスト失敗時は例外発生によってフォローできる。リフレクションはクラスの構造内容を操作できる機能で[[ダイナミックバインディング|動的ディスパッチ]]、[[メッセージ転送|メソッドミッシング]]、[[モンキーパッチ]]などの実装に活用できる。ただし安易な使用は推奨されていない。
 
=== プラットフォーム非依存 ===
{{main|Java仮想マシン}}[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
 
#[[Javaコンパイラ]]は、Javaプログラムのソースコードを、[[Javaバイトコード]]と呼ばれる[[中間表現]]にコンパイルする。Javaバイトコードは[[アセンブリ言語|アセンブラ]][[ニーモニック]]に似たもので、[[Java仮想マシン]]上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、[[Javaクラスファイル]]と呼ばれるclass拡張子のファイルにまとめられる。
#[[Java仮想マシン]]は、各プラットフォームの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
#[[Java仮想マシン]]は、指定された[[Javaクラスファイル]]を[[Javaクラスローダー]]で読み込み、その中の[[Javaバイトコード]]を逐一解釈しながら実行する。これはインタプリタ式に行うものと、[[実行時コンパイラ]]で走行させるものがある。
 
公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、Java仮想マシンへの実行時コンパイラ方式技術と動的再コンパイル技術(''dynamic recompilation'')の導入によって速度問題に一定のはほぼ解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコJava仮想マシパイル処理を更に最適化した動的再コンパイル(''dynamic recompilation'')はメモリ境界バッファオーバーフローに対するチェックを随時行う拡張技術も導入され、Javaながらプログラムを走行させる実行速度問題はほぼ解決され時の堅牢性も実現している。まと見な、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからまなコード暴走や致命的エラーの頻発を事前に抑止するという安全性も実現している。
 
=== マルチスレッド ===
{{main|マルチスレッド}}Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応できる各種設計を備えており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
 
マルチスレッド「同期」の特徴としては、前述のObjectクラスの基底継承強制により全てのインスタンスにロック機能を持たせている事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子の各メソッドはその全体が排他制御エリアになり、その呼び出し時はthisインスタンスからロックをデフォルト取得するので、イメージ的にインスタンス単位になる排他制御を自然に表現している。このロック普遍化はオブジェクト指向との調和を実現する設計と言える。''synchronized''静的メソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通単位の排他制御を表現している。また、''synchronized()''定義子の波括弧でくくられた任意のコードブロックは、this以外のインスタンスもロックオブジェクトにできる排他制御エリアになるので、きめ細かな同期も表現できる。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
59 ⟶ 57行目:
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaプログラムのメモリ管理は、[[Java仮想マシン]]に備えられた[[ガベージコレクション]]機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。Javaのモデルである[[C++]]では、オブジェクトの生成と破棄が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に並々ならぬ力が入れられており、[[世代別ガベージコレクション]]という拡張、応答時間短縮ガーベジコレクタなどの技術更新は現在導入された進行中である
 
なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。
=== 分散コンピューティング ===
{{see also|分散コンピューティング}}
この対象[[分散コンピューティング]]は[[Object Request Broker|オブジェクト要求ブローカー]]を用の機構に基づいた[[分散システム]](''distributed system'')の実現技術であり、る。これはネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行するインフラ[[分散シトラクチャテム]]の構築をサポートする。各プラットフォーム上で稼働されるサーバーログラム、リケーションとクライアントログラム、あるいリケーションその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェ業界共通規格の[[Common Object Request Broker Architecture|CORBA]]またはJava独自規格の[[Java Remote Method Invocation|RMI]]が提供する運用アーキテト要求ブチャと通信プーカートコルを通して他のオブジェクトと相互リクエストを送コミュニケーションする。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、Javaオリジナルの[[Java Remote Method Invocation|RMI]]と、[[Common Object Request Broker Architecture|CORBA]]の二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な設計技術実装れている。CORBAの通信プロトコルは[[IIOP]]、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くは[[Java EE|エンタープライズ版]](Java EE)に属している。分散オブジェクトの中でサーバー機能に特化されたものは[[Enterprise JavaBeans|EJB]](''Enterprise JavaBeans'')と呼ばれている。
 
[[Enterprise JavaBeans|EJB]]は、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、[[EJBコンテナ]]と呼ばれるサーバーアプリケーションに内包されて運用される。EJB同士を含む他の分散オブジェクトと通信する際のプロトコルはIIOPかJRMPが使われる。与えられた識別名から分散オブジェクトと各種リソースのネットワーク上の位置を特定してアクセスさせる機能が[[Java Naming and Directory Interface|JNDI]]である。EJBコンテナは[[Webコンテナ|WEBコンテナ]]と連携し、WEBコンテナの方をより一般的なクライアント窓口とすることが多い。WEBコンテナは[[サーブレット]]と[[JavaServer Pages|JSP]](''Java Server Pages'')を内包し、[[HTTP]]を通して一般的な[[WEBブラウザ]]との同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。[[EJBコンテナ]]では[[JBoss]]や[[WebSphere Application Server|WebSphere]]などが有名である。これらはWEBコンテナと統合されている事が多い。[[Webコンテナ|WEBコンテナ]]では[[Apache HTTP Server|Apatche]]が有名である。
分散コンピューティングからは外れるが、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]]を備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。
 
=== セキュリティ ===
{{see also|サンドボックス (セキュリティ)}}
分散ネットワークを指向するJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(''distributed'')指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。
 
78 ⟶ 76行目:
 
実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
 
Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。
 
== Javaの歴史 ==
86 ⟶ 82行目:
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]]社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアである[[ジェームズ・ゴスリン]]とパトリック・ノートンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードにある小さなオフィスで開発を始めた。
 
'''Oak言語とGreen OSの誕生(1991年)'''
 
グリーンチーム内では当時隆盛していのメインストリームであったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語である[[C++]]に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の[[組み込みシステム]]であったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が至上命題である最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では[[移植性]]に対応できない点も指摘されており、プロジェクトの中で[[プラットフォーム非依存]]が特に重要な議題として上がった。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサン社エンジニアの[[ビル・ジョイ]]は、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーに''Further''(彼方へ)という題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンはこの新しい言語に「Oak」という名前をつけた。これがJavaの前身である
 
一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサン社エンジニアの[[ビル・ジョイ]]は、''Further''(彼方へ)という名の論文を書いてC++をモデルにした新しいオブジェクト指向言語の開発を自社に提案した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。時に1991年秋でありこの「Oak」がJavaの前身になった。それと並行してOakプログラムが用いる基本ライブラリも整備された。
 
'''携帯端末、テレビ機器市場への参入と撤退(1992年~1994年5月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から[[携帯情報端末]](PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー|タイムワーナー]]社と[[3DO]]社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。
104 ⟶ 98行目:
1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「[[HotJava]]」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(''Bean'')はJavaテクノロジ内でコンポーネントを指す用語にされている。
 
1994年10月、JavaランタイムとHotJavaブラウザがサン社の幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開された。1995年5、同月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイント的にアピールされ、同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。基礎およびコアテクノロジは市場リリースに恥じない段階まで進捗していたが、綜合基盤であるプラットフォームと呼べる域までは達しておらず、初リリースのプロダクト名はJavaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
 
=== バージョン履歴 ===
{{main|Javaバージョン履歴}}1996年1月の初リリースからバージョン更新はおおむね数年おきに行われていたが <ref>{{Cite web|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|title=JAVASOFT SHIPS JAVA 1.0|accessdate=2008-02-05|archiveurl=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=March 10, 2007}}</ref>、2017年9月の「Java SE 9」から一定の機能蓄積を待たずに強制公開する旨が発表され、毎年3月9月の年二回定期リリース制に変更された。それに伴い従来の長期間サポート(LTS)制度も廃止され、原則的に次回バージョンまでの半年間サポートになった。2018年9月の「Java SE 11」から有償契約LTS制度が発表され、このバージョンはLTS対象とされた<ref>{{Cite web|url=https://blogs.oracle.com/java-platform-group/introducing-java-se-11|title=Introducing Java SE 11|first=Sharat|author=Chander|website=oracle.com|accessdate=September 26, 2018|archiveurl=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archivedate=September 26, 2018}}</ref>。LTS対象バージョンは安定版、そうでないものは新機能提供版といった位置付けである。現行のLTS対象バージョンは「Java SE 11」と「Java SE 8」である。
301 ⟶ 296行目:
== Javaプラットフォーム ==
{{Main|Javaプラットフォーム}}
Javaプラットフォーム(''Java Platform'')は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、JREJava実行環境およびJDKJava開発環境の構成内容と、追加されるJavaテクノロジの組み合わせ追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティ側からも提供されており、その標準化は[[Java Community Process|Javaコミュニティプロセス]](JCP)が管理している。Javaテクノロジの中核実行環境なるJREとJDKJava開発環境はオープンソース化されているので各企業、任意団体、開発者各自が営利または非営利で膨大様々数のソフトウェアと関連技術を公開しており、巨大なITエコシステムを構築している。
 
=== エディション ===
382 ⟶ 377行目:
統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。
 
*'''[[NetBeans]]''' - [[サン・マイクロシステムズ|サン社]]→[[オラクル (企業)|オラクル社]]製。オープンソースIDE。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM|IBM社]]→[[Eclipse財団]]オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org(英語)org] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)EclipseWiki]。
*'''WebSphere Studio''' - ([[IBM|IBM社]])商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|url=https://tech.nikkeibp.co.jp/it/members/ITPro/J2EE/20031030/1/|title=EclipseとWebSphere Studioはどう違うのか {{!}} 日経 xTECH(クロステック)|accessdate=2019-11-17|publisher=Nikkei Business Publications, Inc.|author=星 暁雄=日経BP Javaプロジェクト|website=日経 xTECH(クロステック)|date=2003-10-31}}</ref>。現在はアップデート停止。[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]。
*{{仮リンク|IBM Rational Application Developer for WebSphere Software|en|Rational Application Developer|label='''IBM Rational'''}} - ([[IBM|IBM社]])[[Rational]]ブランド商用IDE。WebSphere Studioの後継製品。
*'''[[JBuilder]]''' - [[ボーランド|ボーランド社]]→[[エンバカデロ・テクノロジーズ|エンバカデロ社]]商用IDE。JBuilder2007からEclipseベースになっている。[http://www.embarcadero.com/jp/products/jbuilder JBuilder]。
*[[JDeveloper|'''Oracle JDeveloper''']] - ([[オラクル (企業)|オラクル社。Oracle]])Oracle Application Serverと統合されている。2005年6月28日に無料化した。[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]。
*'''Oracle Workshop for WebLogic''' - オラクル社([[BEAシステムズ|BEAシステムズ社]]→[[オラクル (企業)|オラクル社]]){{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]。
*'''[[BlueJ]]''' - ([[サン・マイクロシステムズ|サン社とDeakin University(]]、)とUniversity of Kent([[ディーキン大学]]、)が[[ケント大学]]の共同開発したフリーIDE。[http://www.bluej.org/ BlueJ]。
*'''[[IntelliJ IDEA]]''' - JetBrains(JetBrains)商用IDE。[[Android Studio]]のベースになった商用IDE。[http://www.jetbrains.com/idea/ IntelliJ IDEA]。
*'''JCreator''' - Xinox(Xinox Software社商用IDE。[http://www.jcreator.com/ JCreator]。
*'''[[Xcode]]''' - [[アップル (企業)|アップル社]][[macOS]]に付属するIDE。
 
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
401 ⟶ 396行目:
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。
 
=== 様々なJavaテクノロジの数々 ===
{{Main|Java Community Process}}<!--================================================================================
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
Javaテクノロジは個人を含む企業、任意団体、開発者グループ種組織から様々な形で公開されている。具体的な形態例では、org/comパッケージのAPI、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(''standardization'')と言う。Javaテクノロジが準拠すべき規範仕様多岐、JCP管理下で発行される数々の[[:Category:Java specification requests|Java仕様要求]](Java Specification Request)て定義されてい。Javaテクノロジは様々な分野に存在し導入されている。その一例を以下に列挙する。
 
*[[Java Naming and DirectoryNative Interface|JNDIJNI]] (Java Naming and DirectoryNative Interface) - 他の言語で実装されたーミングサービスと[[デイテレクトリ・サブコビス|ディレクトリサービス]]扱う呼び出す技術
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキスト注釈を追加する
*JML (Java Modeling Language) - [[契約による設計|契約による設計(DbC)]]を指向した形式言語をソースコードに導入する
*[[JDBC]] (Java Database Connectivity) - [[データベース]]接続
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 主に分散システムで[[依存性の注入]]によるJavaプログラムの動的再構成技術
*JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア
*[[Java Data Objects|JDO]] (Java Data Objects) - [[オブジェクト (プログラミング)|オブジェクト]][[永続性 (計算機科学)|永続化]]の仕様
*Jini - 分散システムを構築するネットワークアーキテクチャ
*JAI (Java Advanced Imaging) - 高水準な画像操作API
*JavaSpaces - Jiniの分散システム環境でオブジェクトの送受信と永続化などを支援サポートする技術テクノロジ
*JAIN (Java API for Integrated Networks) - 統合通信ネットワーク用のAPI
*[[JavaServer Faces|JSF]] (JavaServerJava Server Faces) - WEBクライアントにユーザーインターフェースを提供するサーバー用テクノロジ
*JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア
*Jini - 分散システムを構築するネットワークアーキテクチャ
*Jiro - 分散した記憶装置を管理するテクノロジ
*JavaSpaces - 分散システム環境でオブジェクトの送受信と永続化などを支援する技術
*JML (Java Modeling Language) - [[契約による設計|契約による設計(DbC)]]を指向した形式言語をソースコードに導入する
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 主に分散システムで[[依存性の注入]]によるJavaプログラムの動的再構成
*[[JavaServer Faces|JSF]] (JavaServer Faces) - WEBクライアントにユーザーインターフェースを提供するサーバー用テクノロジ
*[[Java Native Interface|JNI]] (Java Native Interface) - 他の言語で実装されたネイティブコードを呼び出す技術
*[[JXTA]] - [[Peer to Peer]] (P2P) の仮想ネットワークのためのオープンプロトコル
*[[OSGi]] - サービスの動的な管理と遠隔保守<!--
*[[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])-->
*JOGL (Java OpenGL) - [[OpenGL]]を使う3Dプログラミングのための低水準なAPI
*JAI (Java Advanced Imaging) - 高水準な画像操作API<!--
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*[[LWJGL]] - ゲーム開発用のAPI。[[OpenGL]]、[[OpenAL]]、[[OpenCL]]を扱える。様々なゲーム用コントローラーも扱える。
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキスト注釈を追加する<!--
*[[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|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社買収)が、こ業界部分的優位性を活かしてJavaオープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。そ目的は彼ら独自のJavaオープンソース化主導権実現す事であようになった。IBM社らは[[Java仮想マシンと標準クラスライブラリの互換製品を登場させ、それに基づく独自標準化も徐々に進めていた。 Community Process|Javaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場]]を取り続けていた。しかし2006年になると巻く業界の変化を悟ったサン社は方針IBM社との本格的な提携変えて賛同承認し、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プロジェクト]]は「[[GNU ClasspathInterpreter for Java]]」J2SE[[GNUコンパイラコレクション]]の「[[GNU Compiler for 1.4のJava]]」、互換クラスライブラリの99%以上「[[GNU Classpath]]」実装公開た。Windows用GNU Compilerは、[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk14-classpath.html[MinGW]、J2SE 5.0では95%以上を実装し]と併せいる[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath.html[Cygwin]]。また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 [[Jar|JET」や<ref>http://www.excelsior-usa.com/jet.html</ref>、Jarファイル]]WindowsWin用実行ファイルにラッピングに変換するツールも存在する。「[http://exewrap.osdn.jp/ exewrap]」「[http://jsmoothlaunch4j.sourceforge.net/ JSmoothLaunch4j]」「[http://launch4jnsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation Launch4jNSIS]」「[http://nsisjsmooth.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS Java Launcher with automatic JRE installationJSmooth]」である。JSmoothは、Java実行環境が無い時はそれなど自動インストールする機能を備えている。また純粋販売Java実行環境では不可能だったタスクアイコンを表示いし公開せる機能も備えている。<!-- ただし、これらのツールには最新の[[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ファイル]]をWindows用実行ファイルにラッピングにするツールも存在する。「[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認定資格 ==