削除された内容 追加された内容
編集の要約なし
1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}
 
{{複数の問題
|出典の明記=2019年2月
|更新=2019年2月
}}
 
{{Infobox プログラミング言語
43 ⟶ 38行目:
# インタプリタ(仮想マシン)式で、マルチスレッドで、コードを動的に再解釈できる(''interpreted, threaded, and dynamic'')
 
(1)に関しては、C言語をモデルにした構文が採用され、予約語を少なくしている。オブジェクト指向はクラスベースとしたが、メッセージベースを実装できる仕様APIも追加された。同時にネットワーク系クラスライブラリの充実により分散オブジェクト技術にも適合した。(2)に関しては、ポインタ、アドレス直指定変数、多重継承、ジェネリクス、演算子オーバーロードなどを破棄し、強い型定義、例外処理、ガーベジコレクタなどを採用した。動作上の堅牢性は仮想マシンとセキュリティチェックを兼ねたクラスローダを根幹とし、これは同時にプログラムをサンドボックス化して基礎レベルからの安全性を確立した。(3)と(4)は、Java仮想マシンの技術に依存した。(5)に関しては、マルチスレッドの取り扱いは<code>synchronized</code>ブロックと3つの予約語というシンプルな設計でまとめられた。ダイナミック性は様々に解釈できるが、多重ディスパッチは<code>instanceof</code>演算子とダウンキャストと例外処理の活用で実装でき、動的ディスパッチは<code>serializable</code>インターフェースとリフレクションAPIの活用で表現できた。
 
=== オブジェクト指向 ===
145 ⟶ 140行目:
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。
 
Javaは「[[パッケージ (Java)|パッケージ(''package'')]]」という[[名前空間]]を持つ。これはクラスとインターフェースを文字列レベルで分類し、またクラス名定義の衝突を回避する為の機能である。パッケージ名は任意の数だけカンマで繋いで階層構造を表す事が出来る。クラスライブラリはパッケージ単位でまとめられている。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際は、先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、パッケージ内のクラスをデフォルト指定出来るので短いコード記述が可能となる。
 
== 歴史 ==
245 ⟶ 240行目:
{{いつ範囲|date=2019年2月|現在}}では、[[リッチクライアント]]や[[Web 2.0]]の登場により新たな[[パラダイム]]が生まれようとしている。すなわち[[World Wide Web|ウェブ]]を基盤とした[[ウェブアプリケーション]]と[[スタンドアローン|スタンドアロン]]アプリケーションの融合である。ウェブアプリケーションを[[Ajax]]や [[Java Web Start]]、[[Adobe Flash]] などと組み合わせることにより、Web2.0時代に見合ったより洗練されたアプリケーションを開発することができる。
 
==== WindoswWindowsとMS版Java ====
{{いつ範囲|date=2013年1月|一昔前}}、ほとんどの [[パーソナルコンピュータ]] (PC) のユーザは、何ら問題なく[[World Wide Web|ウェブ]]および[[デスクトップ環境]]上で[[Javaアプリケーション]]を実行できていた。かつて多くのPCメーカーは、自分たちが製造・販売する[[Microsoft Windows|Windows]] PCに[[Java Runtime Environment|Java実行環境]] (JRE) を同梱していた。[[アップル (企業)|アップル]]の[[macOS]]や、多くの[[Linuxディストリビューション]]でも、Java実行環境を同梱していた。{{いつ範囲|date=2013年1月|今}}では追加インストールが必要である。しかしながらパーソナルコンピュータにおいてJavaアプリケーションは殆ど使われなくなってしまっているので、[[マイクロソフト]]が2001年頃以降にJava実行環境をWindowsに同梱していないことの影響は小さい。
 
811 ⟶ 806行目:
Javaに対する批判を大まかに記述する。
 
=== '''実行性能 ==='''{{main|Javaの性能}}
{{main|Javaの性能}}
Javaの初期のバージョンでは、[[C言語|C]]や[[C++]]などの[[ネイティブ]]に[[コンパイラ|コンパイル]]する言語と比べて、とても実行が遅く[[主記憶装置|メモリ]]の消費が激しいとして、批判されることが多かったが、{{いつ範囲|date=2017年10月|近年}}のバージョンでは改善されてきている。{{いつ範囲|date=2019年2月|近年}}の[[Java仮想マシン]]で採用している[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]や動的再コンパイルの実行性能は、従来の言語のネイティブコンパイラとほぼ同じ水準の実行性能かそれ以上を達成することがある。これは頻繁にメモリアクセスを行う[[プログラム (コンピュータ)|プログラム]]においてJavaの[[ガベージコレクション]]の技術が、[[C言語|C]]の[[malloc]]や[[free]]よりも高い性能を発揮できることによる。こうした事情から、Javaの実行性能については、議論の対象となっている。
 
=== '''ルックアンドフィール ==='''
 
[[Look and feel|ルックアンドフィール]]に関して、Javaの[[Swing]]の[[ウィジェット・ツールキット|ツールキット]]を使った[[グラフィカルユーザインタフェース]] (GUI) を備えたアプリケーションの既定のルックアンドフィールが、従来のネイティブなアプリケーションとは大きく異なるため、エンドユーザの人々にとってJavaのGUIアプリケーションはなじみにくいと批判されることがある。Javaではプラグイン可能なルックアンドフィールの機構を備えており、サンは [[Microsoft Windows|Windows]]、[[macOS]]および[[Motif (GUI)|Motif]]の各ルックアンドフィールのクローンを提供した。そのため、Swingの既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールでJavaのアプリケーションを動かすよう指定することができる。しかしエンドユーザにとってこの指定方法は簡単ではないと指摘されることがある。
 
=== '''言語設計 ==='''
 
言語の設計(デザイン)に対する批判をいくつかの側面から述べる。
 
833 ⟶ 829行目:
なお、[[C Sharp|C#]]は[[Delphi]]の設計思想を取り入れた言語であり、登場当初からプロパティをサポートしている。演算子オーバーロードについても、C++より限定的ではあるがサポートされる。そのほか、Javaで問題視されていたプリミティブ型の扱いやジェネリクスなどに対して、C#は独自の解決策を提示している。
 
{{see also|C SharpとJavaの比較}}'''クラスパス'''
 
=== クラスパス ===
一般に、Javaプログラムを実行する際、-classpathオプションを使用するか、[[環境変数]]の[[クラスパス]] (CLASSPATH) を必要に応じて適切に設定する必要がある。クラスパスを指定すると、既定のカレントディレクトリという設定が上書きされる。したがって、クラスパスを変更するソフトをインストールするなど設定を変えられた場合は、Java実行環境は正しくJavaプログラムを実行することができなくなることがある。このため Javaを使い始めた人々は、クラスパスについて戸惑うことがある。サンは-classpathオプションを指定する方法を推奨していた。{{要出典|date=2018-08}}
 
=== '''移植性・互換性 ==='''
 
Javaは高い[[移植性]]と[[互換性]]を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の[[下位互換]]性・[[上位互換]]性が完全ではないことが問題として議論の対象になっている。Javaは高い移植性を保つため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。[[Java Native Interface]] (JNI) を経由することで、C/C++言語などを利用して特定のプラットフォーム固有あるいはプロセッサ独自の機能にアクセスすることはできるが、その場合はJavaによる移植性や互換性の恩恵は得られなくなる。
<!--
926 ⟶ 922行目:
 
== 外部リンク ==
 
==== オラクル・JCP関連 ====
 
*[https://java.com/ja/ Java.com] {{Ref-ja}} - Javaのユーザー向け公式サイト
*[https://home.java.net/ Java.net] {{Ref-en}} - Javaの技術者向け公式サイト
936 ⟶ 934行目:
**[http://docs.oracle.com/cd/E26537_01/tutorial/ Java チュートリアル]
 
==== 技術情報 ====
 
*[http://www.atmarkit.co.jp/fjava/ @IT: Java Agile] {{Ref-ja}} - Java技術者のための情報提供/情報交換フォーラム
*[http://www.ibm.com/developerworks/jp/java/ IBM developerWorks Java technology] {{Ref-ja}} - IBM developerWorks の開発者向けの記事
*[http://www.computer-books.us/java.php Computer-Books.us] {{Ref-en}} - Java の複数の書籍(無償でダウンロード可能)
 
=== JREとJDKの実装 ===
 
'''プロプライエタリ'''
 
*[http://www.oracle.com/jp/technologies/java/standard-edition/overview/ 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}}