削除された内容 追加された内容
編集の要約なし
Javaの元々の主な対象は組込システムであり、どの電子機器上でもプログラム(従来の制御回路を置き換えたもの)を問題なく動作させるのが目的です。実行環境はそのワンクッションに過ぎず、開発環境は全く関係無いです。要は各機器上でプログラムが走ればいいので、この場合は実行環境と開発環境は該当しません。
29行目:
}}
{{プログラミング言語}}
'''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プラットフォームと呼ばれる。Javaの関連技術は「Javaテクノロジー」と総称されている<ref>{{Cite web|url=https://docs.oracle.com/cd/E26537_01/tutorial/getStarted/intro/definition.html |title=About the Java Technology (The Java? Tutorials > Getting Started > The Java Technology Phenomenon) |language=ja-jp |accessdate=2019-02-24}}</ref>。Javaの構文は[[C++]]<!-- C言語ではない。 -->に類似しており、[[オブジェクト指向]]と[[並行計算|並行コンピューティング]]が主な[[プログラミングパラダイム|パラダイム]]として導入されている。Javaテクノロジーの主な目標は、従来のソフトウェアが抱えていた[[移植性]]問題の解決であった。''"[[Write once, run anywhere]]"''(一度書けばどこでも動く)をキャッチコピーにし、特定の環境に依存しない理想的な[[クロスプラットフォーム]]・プログラムの開発・実行環境の実現を目指して設計公開された。
 
Javaプログラムは[[Javaバイトコード]]と呼ばれる中間言語([[中間表現]])に[[コンパイラ|コンパイル]]されて、[[Java仮想マシン]]と呼ばれるソフトウェア上で実行される。各コンピュータ環境に対応したJava仮想マシンがハードウェア間の差異を吸収し、特定の環境に依存しないプログラム動作を実現する仕組みとなっている。Java登場初期の対象であった家電機器の[[組み込みシステム]]を始め、[[マイクロコントローラ|マイクロ制御装置]]、[[携帯機器]]、[[パーソナルコンピュータ]]、[[サーバー (コンピューター)|サーバーマシン]]、[[スマートカード]]といった様々な環境にJavaソフトウェアは普及している。
43行目:
 
# 言語仕様はシンプルで、オブジェクト指向で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢(バグ多発コードとエラー動作の抑止)で安全(不正アクセスの防止)にする(''robust and secure'')
# プラットフォーム非依存で、移植を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''executing with high performance'')
51行目:
 
=== オブジェクト指向 ===
Javaプログラム[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である。[[|オブジェクト指向プログラミング手法]]に基づいて組み立てられる事が奨励されている。Java言語でいう'''オブジェクト'''とは、現実世界をモデフィー化すドとメソッドを一纏めにしたイメージ的概念であ手法。'''フィールド'''は他言語でいう変数ひとつであり、データ(状態)とそれに'''メソッド'''は数に相当する。オブジェクト内のメソッドは、同所属のフィールドを扱う事を想定されていので、これもイメージ的に変数に付随して(処理)をまる関数めて[[考える事が出来る。Java言語のオブジェクト (指向は[[クラスベース]]と呼ばれるタイログであり、'''クミング)|ス'''はオブジェクト]](物体)との設計図を意味して扱ういる
 
実際のコンピュータ・プロセスにおけるオブジェクトは、インスタンスとして存在している。'''インスタンス'''とは具体的に言うと任意のサイズを占めるメモリ領域の事であり、その構成は基本的に(1)所持フィールド、(2)親インスタンスID、(3)クラス情報ID、となっている。主にローカル設計のプラットフォーム(=Java仮想マシン)では(2)と(3)が省かれてる事もある。(2)(3)のIDは連想値または直アドレス値のどちらかになり、これもプラットフォームによって異なる。メソッドのコード領域はインスタンスには含まれない事になる。こちらはイメージ概念であるオブジェクトの構成要素となり、この点で実装概念であるインスタンスと異なっている。
Javaのプログラムは複数の[[クラス (コンピュータ)|クラス]]から構成される。[[オブジェクト指向]]におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[オブジェクト (プログラミング)|オブジェクト]]はインスタンスと呼ばれる。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスは[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[ポリモーフィズム]]をサポートする。
 
Javaのプログラム複数の[[クラス (コンピュータ)|クラス]]から構成される。[[オブジェクト指向]]定義すおけ状態を「クラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[フィールドオブジェクト (計算機科学プログラミング)|フィールドオブジェクト]]」([[インスタンス変数]])と呼び、振ばれ舞いを「。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスは[[メソッドカプセル化]]・[[継承 (計算機科学プログラミング)|メソッド継承]]」と呼ぶ。それぞれ、[[C++ポリモーフィズム]]で「メンバをサポ変数」「メンバー関数」と呼ばれているものに相当する。なおJavaのオブジェクト指向は、[[Smalltalk]]に代表されるような[[メッセージパッシング]]によるオブジェクト指向ではなく、C++に代表されるようなクラス機構を中心としたオブジェクト指向である。後者は、限られた計算機資源でもオブジェクト指向を実現できるというメリットがある。
 
[[継承 (プログラミング)|継承]]とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。継承は拡張とも呼ばれ、Javaのクラス構文では継承の際に<code>extends</code>キーワードが使われる。Javaのクラスはすべて、暗黙的に基底クラス{{Javadoc:SE|name=java.lang.Object|java/lang|Object}}から派生する。また、C++のような実装の[[多重継承]]はサポートせず、単一継承のみをサポートする。ただし、クラスは複数の[[インタフェース (抽象型)|インタフェース]]を実装 (<code>implements</code>) することができる。Javaのインタフェースは、C++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である<ref group="注釈">実装の多重継承をサポートせず、インタフェースにより型の多重継承のみをサポートするという設計思想は、後発の[[C Sharp|C#]]などでも採用されている。</ref>。ただし、Java 8以降はインタフェースのデフォルトメソッドにより、実装の多重継承も限定的にサポートするようになった。
598行目:
{{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実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
 
エンドユーザはソフトウェアパッケージか、企業/団体サイトからのダウンロード、又はWEBブラウザ[[プラグイン]]を通してJava実行環境をインストールする。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
 
;Javaクラスライブラリ
689 ⟶ 687行目:
拡張テクノロジは様々な営利企業および任意団体から、javaxパッケージまたはorgパッケージのJava API、JREとJDKを中核にした拡張仕様コンテナの形態で提供されている。また、様々なアプリケーション、ソフトウェアコンポーネント、データベースシステム、ネットワークプロトコル等を組み合わせたソフトウェア・システムとして公開されている。以下はその代表例であり、いずれも[[Java Community Process|Javaコミュニティプロセス]]によって標準化されている。
 
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービス名前解決・[[ディレクトリ・サービス|ディレクトリ階層特定]]サービス]]へのアクセス
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキストの注釈を追加する
*[[JDBC]]<!--(Java Database Connectivity)--> - [[データベース]]接続の API
713 ⟶ 711行目:
*[http://community.java.net/javadesktop/ JavaDesktop]
*[[FindBugs]] - javaソースコードからコーディングレベルのバグを発見する開発支援ツール。
*[[CheckStyle]]
 
=== Javaテクノロジの標準化 ===
{{Main|Java Community Process}}
 
Javaプラットフォームを形成するJavaテクノロジの標準化は、[[Java Community Process|Javaコミュニティプロセス]] (Java Community Process, JCP) に管理されていた。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPに参画する事でJavaテクノロジの標準化カンファレンスに関与できた。[[ボーランド|ボーランド社]]、[[富士通]]、[[Apacheソフトウェア財団]]、[[ヒューレット・パッカード|ヒューレット・パッカード社]]なども参加していた。JCPはJavaプラットフォームに追加される仕様や技術を、JSRs (''Java Specification Requests'') と呼ばれる文書で公開していた。Java言語仕様と標準APIその一例を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=41 JSR 41] ''A Simple [[表明|Assertion]] Facility'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=47 JSR 47] ''[[ロギング|Logging]] API Specification''(J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=51 JSR 51] ''New I/O APIs for the Java Platform'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=59 JSR 59] ''J2SE Merlin Release Contents'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=121 JSR 121] ''Application Isolation API''
*[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)
731 ⟶ 723行目:
*[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=203 JSR 203] ''More New I/O APIs for the Java Platform ("NIO.2") '' (Java SE 7)
*[http://www.jcp.org/en/jsr/detail?id=204 JSR 204] ''Unicode Supplementary Character Support'' (J2SE 5.0) - [[Unicode]] 3.1 のサポート
*[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=270 JSR 270] ''Java SE 6 ("Mustang") Release Contents'' (Java SE 6)
*[http://www.jcp.org/en/jsr/detail?id=275 JSR 275] ''Physical Units/Quantities Support (Java SE) - JScienceをもとにした[[リファレンス実装]]''
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0)
 
765 ⟶ 753行目:
JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。
<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
 
== Javaへの批判 ==
{{出典の明記|section=1|date=2019年3月}}
<!-- WARN: 特定執筆者の無思慮かつ勝手な独断で内容が削除・改竄されすぎていて、まともな項目の体をなしていない。出典もまったくない。加えて、内容がまったく検証されておらず、間違った記述もかなり多い。また、古い内容だからといって削除するのはおかしい。たとえ古い内容であっても、歴史を振り返るうえでは重要なものもある。根拠となる出典を示せる場合、「以前は……という批判があったが、その後……となった」などの形で残すべき。 -->
{{main|Javaに対する批判}}
 
=== 言語設計 ===
{{see|[[C SharpとJavaの比較|C#とJavaの比較]]}}
 
=== 動作性能 ===
{{main|Javaの性能}}
<!-- WARN: 「それなり」「概ね」「それほど」といったあいまいな修飾語は避けるべき。 -->
{{要出典範囲|date=2019年3月|公開初期のJava仮想マシンは動作速度の遅さと必要メモリリソースの大きさを指摘される機会が多かったが、開発元の技術研鑽による[[ジャストインタイムコンパイラ|JITコンパイル]]の導入とその改善の積み重ねによって、ネイティブコード実行とさほど遜色の無い動作速度が得られるようになった。メモリ消費量にもそれなりの抑制が見られたが、こちらは仮想マシン機能の巧みな取捨選択で実現されているケースが多く、またある程度はハードウェア環境の進化にも依存していた}}。{{いつ範囲|date=2019年3月|現在}}のJava仮想マシンは{{要出典範囲|date=2019年3月|動作速度面で概ね好評を得ており、またメモリリソース面でもそれほど問題は指摘されていない}}。
 
=== ルックアンドフィール ===
<!-- これはJavaというよりはSwingに対する批判。 -->
[[ルック・アンド・フィール|ルックアンドフィール]] (look and feel) とは、アプリケーションにおけるグラフィカルユーザインタフェース (GUI) 部分の外観と振る舞いである。クロスプラットフォーム指向で開発されたJavaは、同時に特定のデザインに依存しない方針を貫いていたため、[[ウィジェットツールキット]]である[[Swing]]には独自のルックアンドフィール「Metal」が採用されていた。しかしこのルックアンドフィールは、各プラットフォームにおけるネイティブGUIアプリケーションのルックアンドフィールと大きく異なるため、馴染みにくさを指摘されることが多かった。Swingは[[プラグイン]]可能なルックアンドフィールの機構を備えており、サンはSwingの表示処理に適用できる[[Microsoft Windows|Windows]]、[[Classic Mac OS|Mac OS]]、[[Motif (GUI)|Motif]]といった各OSのルックアンドフィールを模倣したテーマを提供するようになった。これにより、アプリケーションはSwing既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールを利用できるようになった<ref group="注釈"><code>UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())</code>を呼び出すことで、システムネイティブのルックアンドフィールを適用できる。</ref>。
 
=== 移植性と互換性 ===
Javaは高い[[移植性]]と[[互換性]]を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の[[下位互換]]性・[[上位互換]]性が完全ではないことが問題として議論の対象になっている。Javaは高い移植性を保つため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。[[Java Native Interface]] (JNI) を経由することで、C/C++言語などを利用して特定のプラットフォーム固有あるいはプロセッサ独自の機能にアクセスすることはできるが、その場合はJavaによる移植性や互換性の恩恵は得られなくなる。
 
== Java認定資格 ==
820 ⟶ 788行目:
 
== 脚注 ==
{{脚注ヘルプ}}'''注釈'''{{Reflist|group=注釈}}'''出典'''{{reflist|2}}
=== 注釈 ===
{{Reflist|group=注釈}}
=== 出典 ===
{{reflist|2}}
 
== 参考文献 ==
839 ⟶ 803行目:
{{Wikibooks|Java}}
{{Commonscat|Java (programming language)}}
*[[Javaの文法に対する批判]]
{{see|*[[C SharpとJavaの比較|C#C♯とJavaの比較]]}}
*[[Javaの性能]]
*[[キーワード (Java)の文法]]
*[[キーワード (Java)|Javaのキーワード (予約語)]]
*[[Javaプラットフォーム]]
*[[Java Platform, Standard Edition]] (Java SE)