削除された内容 追加された内容
バージョン更新
(同じ利用者による、間の8版が非表示)
1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}
 
{{複数の問題
|独自研究=2019年3月
|正確性=2019年3月
|出典の明記=2019年3月
|更新=2019年3月
}}
 
{{Infobox プログラミング言語
37 ⟶ 30行目:
== 特徴 ==
=== Javaの理念 ===
Javaは5つの理念に基づいて開発された<ref>"1.2 Design Goals of the Java™ Programming Language". Oracle. January 1, 1999. Archived from the original on January 23, 2013. Retrieved January 14, 2013.</ref>{{出典無効|date=2019-02-26|title=Webリソースかのような記述の仕方だがURLが示されていない。}}
{{独自研究|section=1|date=2019年3月}}
{{正確性|section=1|date=2019年3月}}
{{出典の明記|section=1|date=2019年3月}}<!-- URLが記載されていないので検証不可能。[[Wikipedia:検証可能性]] -->
Javaは5つの理念に基づいて開発された<ref>"1.2 Design Goals of the Java™ Programming Language". Oracle. January 1, 1999. Archived from the original on January 23, 2013. Retrieved January 14, 2013.</ref>{{出典無効|date=2019-02-26|title=Webリソースかのような記述の仕方だがURLが示されていない。}}。
 
# シンプルで、[[オブジェクト指向プログラミング|オブジェクト指向]]で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢でセキュリティ重視にする(''robust and secure'')
# [[プラットフォーム非依存]]で、[[移植 (ソフトウェア)|移植]]を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''executingto execute with high performance'')
# [[インタプリタ|インタプリタ式]]で、[[マルチスレッド]]で、[[多態性|動的可変多態]]にする(''interpreted, threaded, and dynamic'')
 
Javaの言語仕様は、[[C++]]のそれから堅牢性を損ねる部分を取り除いたものと考える事が出来る。[[ポインタ (プログラミング)|ポインタ]]、[[変数 (プログラミング)|直アドレス変数の[[インスタンス]]と[[配列]]、[[コンストラクタ|コピーコンストラクタ]]、[[テンプレート (プログラミング)|テンプレート]]、[[演算子オーバーロード]]、[[goto文]]などが言語仕様から外された。[[例外処理]]構文保持されている。Javaの全ての変数と[[インスタンス]]は実体アドレスを指す参照値に統一使用が推奨されている。[[配列]]は特殊なインスタンスとなっており、[[文字列]]も自動的にインスタンスとなった。これによって特に[[引数]]と返値の受け渡しに混乱が無くなり堅牢性も増した。非参照データを自動解放する[[ガベージコレクタ]]が導入されたので、メモリ管理の不要に伴うプログラムの簡素化が促進された。オブジェクト指向は[[C++]]と同様の[[クラス (コンピュータ)|クラス]]のメカニズムに基づく仕様から[[多重継承]]が取り除かれ、匿名クラスの構文が追加されている。後者はクラス定義利便性を高めた。[[仮想関数]]によ基本とな演算式と[[多態性]]が重視されており、[[仮想関数]]の集合体である''interface''制御構文が専門に用意された。[[カプセル化]]はソースコード単位がデフォルトの緩やかなので利便性が優先されている。また、堅牢性を重視しながらも動的な[[型システム|型比較]]C++[[型変換|型キャスト]]と[[リフレクション (情報工学)|リフレクション]]が備えられており、この点では動的な多態性の実現が優先されている。[[スレッド (コンピュータ)|スレッド]]と[[ネットワーク・コンピューティング|ネットワーク]]関連のAPIが充実してる類似のもJava大きな特徴である。これらの結論としてJavaの言語仕様は比較的憶える事が少なく、シンプルなものと評価する事が出来る。加えてJava仮想マシン上でのプログラム実行は基礎レベルからの堅牢性とセキュリティを実現した
 
'''データの在り方'''
 
: Javaの全[[インスタンス]]は実体データを指す参照値(アドレス)に統一されている。[[配列]]は特殊なインスタンスとなっており、[[文字列]]も自動的にインスタンスとなった。これによって特に[[引数]]と返値の受け渡しに混乱が無くなり堅牢性も増した。非参照インスタンスを自動解放する[[ガベージコレクタ]]が導入されたので、メモリ管理の不要に伴うプログラムの簡素化と堅牢さも促進された。なお、8bitから64bitまでの数値を収納するデータは[[変数 (プログラミング)|直アドレス変数]]となっているが、そのアドレスを扱う事は出来ない。
 
'''型定義と関数の在り方'''
 
: [[ジェネリックプログラミング|ジェネリクス]]([[テンプレート (プログラミング)|テンプレート]])と[[演算子オーバーロード]](+[[関数オブジェクト]])を除外した事は同時に、データ型とメソッド呼出に対する認識を厳格化し、利便性よりも堅牢性を重視するというJavaの哲学を示す事になったが、後年にはパラダイムシフトが発生している。比較的早期のJava 5.0においてコレクションクラスに限り[[ジェネリックプログラミング|ジェネリクス]]に類似した構文が導入されている。後年のJava 8では[[無名関数|ラムダ式]]、[[型推論]]、メソッド参照、ストリームといった関数型プログラミング由来の構文が導入された。これによって当初の哲学であるメソッド呼出認識の厳格化はほぼ失われ、型認識の明確化も部分的に崩れる様になった。細部の実装には、堅牢性よりも利便性を重視した'''[[関数型プログラミング]]'''の使用が容認された事で、Javaの方向性は大きく変化したと言える。
 
'''オブジェクト指向の在り方'''
 
: オブジェクト指向は[[C++]]と同様の[[クラス (コンピュータ)|クラス]]のメカニズムに基づく仕様から[[多重継承]]が取り除かれ、無名クラスの構文が追加されている。後者は[[プロトタイプベース]]オブジェクトの取り扱いに近い利便性を実現した。[[カプセル化]]はソースコード単位がデフォルトの緩やかなもので利便性が優先されている。Javaの[[多態性]]の中心は[[仮想関数]]であり、その集合体である''interface''構文が専門に用意されている。''interfaceは[[継承]]と区別されて多重に[[派生型|実装]]できる。''また堅牢性を重視しながらも動的な[[型システム|型比較]]と[[型変換|型キャスト]]と[[リフレクション (情報工学)|リフレクション]]が備えられており、動的な多態性の実現が優先されている。上述二点の多態性の背景には[[分散コンピューティング]]の重視があり、その実現をサポートする[[ネットワーク・コンピューティング|ネットワーク]]機能と[[Java Remote Method Invocation|リモートメソッド]]関連および[[Common Object Request Broker Architecture|CORBA]]のAPIが充実している事もJavaの大きな特徴である。
 
'''その他'''
 
: Javaでは[[分散コンピューティング|分散]]と共に[[並行コンピューティング]]が重視されており、[[スレッド (コンピュータ)|スレッド]]の同期を取る''synchronized''構文が専門に用意され、同期性をサポートするAPIも拡充されている。Javaの予約語は少なくAPIは膨大であり、シンプルで応用性に富んだ言語仕様と見る事が出来る。基礎部分を簡素化して残りをアドオン的にする設計は、Javaの主眼である[[マルチプラットフォーム|マルチプラットフォーム性]]の実現を助けた。加えてJava仮想マシン上でのプログラム実行は基礎レベルからの堅牢性とセキュリティを実現した。
 
=== オブジェクト指向 ===
77 ⟶ 83行目:
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし、またバージョン間の[[互換性]]に注意して開発が進められている。プラットフォームに依存しない(Javaプラットフォーム自体を除く)[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはプラットフォーム([[CPU]])に依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、[[中間言語]]([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された([[pコードマシン]]など、過去にもあったものだが、なぜか新しいものであるかのように宣伝される<sup class="noprint Template-Fact">[''[[Wikipedia:「要出典」をクリックされた方へ|要出典]]'']</sup>)。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存していないことであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]依存していないこであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
 
Javaのプラットフォーム非依存性は、次のようにして実現されている。
113 ⟶ 121行目:
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ([[主記憶装置]])を管理する負担を軽減する。あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。従来のオブジェクト指向プログラミング言語である[[C++]]では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
Javaは[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
Javaは[[ガベージコレクション]]機能を備えておた事により、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
 
ガベージコレクションを備えていない[[C++]]などの言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]において、[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域をメモリ内の[[ヒープ領域]]に動的に割り当てた場合([[動的メモリ確保]])、そのオブジェクトがもはや必要なくなった場合に、プログラマは必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不適切なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、プログラミングミスなどにより、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことであり、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
132 ⟶ 142行目:
 
=== ネットワーク機能 ===
Javaでは充実した[[Javaクラスライブラリ|標準ライブラリ]]により、[[コンピュータネットワーク]]を使う活用するソフトウェアを、効率良く開発できる。Javaはその初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] ([[IPv4]]) のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境 ([[Java Remote Method Invocation|Java RMI]], [[Common Object Request Broker Architecture|CORBA]]) のソフトウェアの開発も早い時期からできるようになっていた。[[Java近年<sup Remoteclass="noprint MethodInline-Template Invocationnowrap">[''[[Wikipedia:言葉を濁さない|Java RMIいつ?]]もしく'']</sup>で、さまざまな[[Common Object Request Broker Architecture|CORBAネットワークプロトコル]]の分散オブジェクト技術を標高水なライブラリが使えるよことができになっている。{{いつ範囲|date=2019年2月|近年}}では、[[W3C]]により標準化された拡張その他汎用[[マークアップ言語]]ひとつである[[Extensible Markup Language|XML]]で記述された文書を扱うライブラリも早期より、実装・標準サポートまざまなれた。近年<sup class="noprint Inline-Template nowrap">[''[通信[Wikipedia:言葉を濁さない|いつ?]]'']</sup>では、XMLプロトコルセサと[[XSL Transformations|XSLT]]プロセサがJava標準ライブラリに統合され提供されている。充実したネットワークプロトコル]]機能とXML文書高水準でえるよ機能を有効組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。
 
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
144 ⟶ 155行目:
 
=== セキュリティ ===
Java初期のバ[[コンピュジョタセキュリティ|セキュリティ]]を考慮して設計されており、[[サからドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる([[Javaアプレット]])を安全に。初期のバージョンからコードの実行でき前に様々なセキュリティチェックを行えよう設計メカニズムが実装されていた。
 
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
155 ⟶ 167行目:
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
 
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけ[[ピリオド]]で繋ぐことができる。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定できるので短いコード記述が可能となる。
 
== 歴史 ==
580 ⟶ 592行目:
 
== Javaプラットフォーム ==
{{独自研究|section=1|date=2019年3月}}
{{Main|Javaプラットフォーム}}
Javaプラットフォーム(''Java Platform'')は、Javaプログラムを開発または実行する為のソフトウェア群の総称であり、より具体的に言うと{{独自研究範囲|'''Java実行環境'''(JRE)と'''Java開発キット'''(JDK)と'''それ以外のJavaテクノロジ'''の複合体である|date=2019-03-07}}。JavaテクノロジとはJavaに関連するIT技術の総称である。Javaプラットフォームは対象環境に合わせて、JREおよびJDKの構成内容と、追加されるJavaテクノロジの組み合わせを変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティ側からも提供されており、その標準化は[[Java Community Process|Javaコミュニティプロセス]](JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されているので、各企業各団体及び開発者各自が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。
 
=== エディション ===
{{いつ範囲|date=2019年3月|現在}}、Java権利元のオラクル社は、対象環境に合わせたJavaプラットフォームの4つのエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。なお、これら公式エディションの他にも、サードパーティ側から様々なJavaプラットフォームの互換品=互換エディションが公開されている
 
; [[Java Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータなどのデスクトップクライアント環境向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。プロファイルとして組込システム開発者向けであの「Java SE Embedded」が存在する。
: 組み込みシステム向けのプロファイルとしてJava SE Embeddedが存在する。
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。プロファイルとしてWeb開発者向けの「Web Profile」が存在する。
: 2017年9月OracleJava 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=Oracle |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>。Oracle[[クラウドコンピューティング]]技術への対応の急務その背景にあった。Java EEの商標は現行版のサポート手放さなかった続けるOracle社が保持しので新しい名称が投票エクリプス財団によって決められ、る今後のバージョンは'''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>。
:; Web Profile
:: Webアプリケーション開発に焦点を当てた[[サブセット]]。Java EE 6から追加された。
:; Eclipse MicroProfile
:: [[マイクロサービス]]開発に焦点を当てた、Java EEのサブセットと追加仕様からなるプロファイル。Eclipse Foundationが主導するコミュニティベースの仕様だが、Java EEのEclipse Foundationへの移管に伴い、将来正式なプロファイルとなる可能性がある<ref>{{Cite web|url=https://www.eclipse.org/ee4j/faq.php#microprofile |title=EE4J FAQ | publisher=Eclipse Foundation |language=en |accessdate=2019-03-10 }}</ref>。
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
603 ⟶ 609行目:
 
=== Java実行環境(JRE) ===
{{未検証|section=1|date=2019年3月}}
{{Main|Java Runtime Environment}}
 
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。'''[[Java仮想マシン]]'''(''Java Virtual Machine'')と、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>を始めとする様々な'''スターター'''(Web用プラグインを含む)と、'''Javaクラスライブラリ'''(''Java Class Library'')で構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。エンドユーザはソフトウェアパッケージか、企業/団体サイトからのダウンロード、又はWEBブラウザ[[プラグイン]]を通してJava実行環境をインストールする。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
 
;Javaクラスライブラリ
640 ⟶ 645行目:
 
=== Java開発キット(JDK) ===
{{未検証|section=1|date=2019年3月}}
{{main|Java Development Kit}}
 
652 ⟶ 656行目:
;Java API
 
APIは、Application Programming Interface(アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、およびそれらに属するメソッド、フィールド、定数の集合である。またそのプロトコル(定義情報と使用方法)を指す。プログラマはこれを用いてアプリケーションソフトウェアの開発を行う。
 
# java.lang - Java言語仕様の基礎を扱う。