「Java」の版間の差分
削除された内容 追加された内容
バージョン更新 |
Goldensundown2 (会話 | 投稿記録) |
||
(同じ利用者による、間の8版が非表示) | |||
1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}
{{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>
▲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'')
#
# 高いパフォーマンスで動作する(''
#
Javaの言語仕様は、[[C++]]のそれから堅牢性を損ねる部分を取り除いたものと考える事が出来る。[[ポインタ (プログラミング)|ポインタ]]、
'''データの在り方'''
: 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のプラットフォーム非依存性は、次のようにして実現されている。
113 ⟶ 121行目:
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ([[主記憶装置]])を管理する負担を軽減する。あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。従来のオブジェクト指向プログラミング言語である[[C++]]では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
Javaは[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。▼
▲
ガベージコレクションを備えていない[[C++]]などの言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]において、[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域をメモリ内の[[ヒープ領域]]に動的に割り当てた場合([[動的メモリ確保]])、そのオブジェクトがもはや必要なくなった場合に、プログラマは必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不適切なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、プログラミングミスなどにより、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことであり、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
132 ⟶ 142行目:
=== ネットワーク機能 ===
Javaでは充実した[[
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
144 ⟶ 155行目:
=== セキュリティ ===
Java
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
155 ⟶ 167行目:
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけ
== 歴史 ==
580 ⟶ 592行目:
== Javaプラットフォーム ==
{{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 Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータ
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。プロファイルとしてWeb開発者向けの「Web Profile」が存在する。
: 2017年9月
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
603 ⟶ 609行目:
=== Java実行環境(JRE) ===
{{Main|Java Runtime Environment}}
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。'''[[Java仮想マシン]]'''(''Java Virtual Machine'')と、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>を始めとする様々な'''スターター'''
;Javaクラスライブラリ
640 ⟶ 645行目:
=== Java開発キット(JDK) ===
{{main|Java Development Kit}}
652 ⟶ 656行目:
;Java API
APIは、
# java.lang - Java言語仕様の基礎を扱う。
|