削除された内容 追加された内容
タグ: 2017年版ソースエディター
(同じ利用者による、間の1版が非表示)
26行目:
 
Javaは、1995年に[[サン・マイクロシステムズ]]によって公開された。2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの各種権利もオラクルに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年4月現在の最新メジャーバージョンは、2019年3月19日に公開された第12版となっている。
 
== Javaの方針 ==
Javaは5つの方針に基づいて開発された<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html |title=The Java Language Environment |accessdate=2019-04-24}}</ref>。これらはJavaテクノロジの中枢となる[[仮想マシン]]に向けられたものでもあるが、言語仕様にも大きく反映されている。
 
# シンプルで、[[オブジェクト指向プログラミング|オブジェクト指向]]で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢で安全にする(''robust and secure'')
#[[プラットフォーム非依存]]で、[[移植 (ソフトウェア)|移植]]を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''to execute with high performance'')
#[[インタプリタ|インタプリタ式]]で、[[スレッド (コンピュータ)|スレッド式]]で、動的([[最適化 (情報工学)|最適化]])にする(''interpreted, threaded, and dynamic'')
<!-- 同じ内容が別の項にもあり冗長かなと思ったので取り敢えずコメントアウト
あとで確認して書き直します。
 
変数の在り方
 
Javaでは変数として、メモリに書き込まれる具体的なデータのみを扱うプリミティブ型と、クラスのインスタンスや文字列などの参照型が存在する。
 
また使用されていないメモリ領域を自動で開放するガベージコレクションが導入されたため、メモリ管理の複雑さを解消している。
 
型定義と関数の在り方
 
テンプレート(ジェネリクス)と演算子オーバーロード(+関数オブジェクト)を除外した事は同時に、データ型とメソッド呼出の認識を厳格化し、利便性よりも堅牢性を重視するという方針を示す事になったが、Java5から導入されたジェネリクス構文や、Java8で導入された
 
、Java 8で導入されたラムダ式、型推論、メソッド参照、ストリームといった関数型プログラミング由来の構文が導入され、特に細部の実装に適用された事によりJavaの方向性は大きく変化したと言える。
 
オブジェクト指向の在り方
 
オブジェクト指向はC++と同様のクラスのメカニズムに基づく仕様から多重継承が取り除かれ、無名クラスの構文が追加されている。後者はプロトタイプベースオブジェクトの取り扱いに近い利便性を実現した。カプセル化はソースコード単位がデフォルトの緩やかなもので利便性が優先されている。Javaの多態性の中心は仮想関数であり、その集合体であるinterface構文が専門に用意されている。interfaceは継承と区別されて多重に実装できる。また堅牢性を重視しながらも動的な型比較と型キャストとリフレクションが備えられており、動的な多態性の実現が優先されている。上述二点の多態性の背景には分散コンピューティングの重視があり、その実現をサポートするネットワーク機能とリモートメソッドおよびCORBAのAPIも充実している。
 
スレッドの在り方
 
Javaではスレッドベースの並行コンピューティングが重視されている。全てのインスタンスに同期用のロック機能が備えられているのでイメージ的にオブジェクト単位の排他制御の実装が容易となっており、オブジェクト指向との協調が図られている。これは仮想マシン組み込みのsynchronized構文で用いられるが、その他にも様々な同期用APIが揃えられている。スレッド資源の制約を解決する為にタスクの仕組みを併せたモニタ(Executor)の技法が導入されている。ロック手法にはミューテックス、セマフォ、バリア、読み書きロック、イベント(CountDownLatch)が揃えられており排他制御手法の選択肢も広い。またアトミック操作をサポートするAPIも揃えられている。
 
堅牢性から利便性へ
 
Javaの予約語は少なくAPIは膨大であり、シンプルで応用性に富んだ言語仕様と見る事が出来る。基礎部分を簡素化して残りをアドオン的にする設計は、Javaの主眼であるマルチプラットフォーム性を実現する為でもあった。加えてJava仮想マシン上でのプログラム実行は基礎レベルからの堅牢性とセキュリティを実現した。公開初期と比べたJavaの方向性は大きく変化している。動的多態性、分散処理、並行処理、総称型構文、関数型構文の拡張ないし追加が示すものは柔軟性(flexible)と利便性(utility)の追求であり、結果的に堅牢性(robust)を旨としたJavaの哲学に優越した。
 
-->
 
== Javaの特徴 ==
129 ⟶ 92行目:
Javaのプラットフォーム非依存性は、[[サーバ]]側や[[組み込みシステム]]のアプリケーションに関しても成功を収めている。サーバ側 ([[Java Platform, Enterprise Edition|Java EE]]) では、Java の[[Java Servlet|サーブレット]]、[[Webサービス]]、[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 ([[Java Platform, Micro Edition|Java ME]]) を使った[[OSGi]]を基にした開発が広く行われている。
 
=== マルチスレッド ===
Javaではその前身であるGreenOS用言語およびOakと呼ばれていた頃にあたる、主に家電機器向け組込システムへの普及を目指していた初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシンソフトウェア上のユーザー空間で走行される純粋なユーザースレッドとして実装された。一台のJava仮想マシンの実行は一つのプロセスとなり、Javaのプロセスは始めから複数スレッド(糸)の寄り合わせとして設計されていた。この高度なネイティブスレッド・エミュレート技術は注目を集め、その開発チームの名に因んだグリーンスレッドという名称を確立し、ランタイムライブラリ及び仮想マシン上で走行されるマルチスレッドの代名詞となった。グリーンスレッドは公開初期においては、例えばLinuxのネイティブスレッドよりもやや軽量なパフォーマンスを発揮した。組み込みシステム向けのJava仮想マシンでは基本的にこのグリーンスレッドが標準仕様となり続けている。しかし、パソコンやサーバーマシン用の各OSの間で、マルチコアCPUの特性を活かして設計された更に軽量なネイティブスレッドが一般的になると、グリーンスレッドのパフォーマンスは明確に見劣りするようになった。やむなく開発チームはグリーンスレッドを順次廃止し、JavaのスレッドをOSが提供するネイティブスレッド上で走行させるように設計変更した。これはやや苦汁の決断だったようで、特に並行処理同期=排他制御を多用するJavaプログラムにおいては、この時点からプラットフォーム非依存性に対する問題が生じるようになったと言われる。
 
183 ⟶ 146行目:
 
=== 例外処理 ===
Javaは[[例外処理]]の構文を備えている。これは制御フローの一種であり、例外想定ブロック内の実行中に状態異常が発生すると例外オブジェクトが生成されて、その宛先となる例外捕捉ブロックに強制ジャンプするという仕組みを指す。これは「例外を投げる」と形容されている。例外捕捉ブロックでは、渡された例外オブジェクトの情報に基づいた任意の例外解決処理を行った後にい、例外ブロックを抜ける事になった
 
例外処理は様々なコード局面での使用が推奨されたが、例外発生後のコードが全スキップされるというフロー上の性質から例外想定ブロック内のコード行数は比較的少ないものとなり、それら例外ブロックの断続的な羅列は却ってソースコードの可読性低下にも繋がった。例外処理による堅牢性と、コーディングレベルでの利便性および実用性は様々な部分でマッチしなかったとも言える。また、実行中の多方面に影響が及ぶような致命的な例外ほど、単純な例外ブロックの記述では対応しきれず、細部の例外ブロックから更に大枠の例外ブロックへ飛ぶというような大胆なジャンプを頻発させてプログラムの把握が難しくなるという欠点もあった。結果的に例外処理は、入出力機能の呼び出しなど決まりきった状態異常の発生部分では積極的に用いられるが、それ以外ではコーディングの頻雑さに勝るだけの有用性がそれほど認められていないのが実情となっている。
580 ⟶ 543行目:
 
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いてアプリケーションソフトウェアの開発を行う。
 
# java.lang - Java言語仕様の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 配列の操作とList、Set、Mapなどのデータ集合。
# java.math - 各種計算。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
# java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
# java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
# java.applet - アプレット生成用。
# java.beans - Java版ソフトウェアコンポーネント作成用。
# java.sql - SQLを扱う。
# java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
# java.security - 様々な通信セキュリティプロトコルを扱う。
# java.nio - 連続バイトデータを扱う。
# java.lang.reflect - クラス定義を動的に操作する。
 
;統合開発環境と開発支援ツール
653 ⟶ 631行目:
1996年のJava登場初期から、ベンダー元の[[サン・マイクロシステムズ|サン社]](後に[[オラクル (企業)|オラクル社]]が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。この部分的オープンソース制度に便乗する形で2004年から、[[IBM|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社が買収)が、独自のオープンソース化を目的にしたJava関連ソフトウェア&拡張テクノロジの開発を支援するプロジェクトを立ち上げていた。その中でJava仮想マシンと標準クラスライブラリの互換製品も登場していた。
 
それらの標準化が進むにつれて中で当初のサン社は、Javaコミュニティプロセスへの影響力低下に対する懸念したサン社はからこのIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取っていたが、。しかし2006年から方針を変えて賛同し、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 Classpath]]」は、J2SE 1.4のクラスライブラリの99%以上を実装し[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk14-classpath.html]、J2SE 5.0では95%以上を実装している[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath.html]。またOpenJDKの開発にはIBM社も協力している。
 
;GNUプロジェクト
659 ⟶ 637行目:
 
;Windows / Linux用プラットフォーム
メジャーなオペレーティングシステム(OS)では、営利企業および任意団体による独自開発のJREとJDKが公開されている事が多い。[[Linux]]/[[IA-32]]プラットフォームでは、オラクル、Blackdown、IBM、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供していた。同様に[[Microsoft Windows|Windows]]/IA-32プラットフォームでもオラクル、IBMなどがJREやJDKを実装・提供していた
 
*[[Linux]] / [[IA-32]]プラットフォーム : オラクル、Blackdown、IBM、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
*[[Microsoft Windows|Windows]]/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。
 
;Excelsior JET