「第2回エンペディア大賞」が2月いっぱい開催中です。2024年に作成された記事の中から、お気に入りの記事に投票しましょう!
Java
Java(ジャバ)は、Java言語、Java開発環境、Java実行環境のそれぞれの仕様とシステム全般の総称。
概要[編集]
Javaは、Javaアプリケーションを開発・実行するための仕様とシステムの集合から成っている。主な構成要素は下記の通り。
- Java言語
- Javaプログラム開発の標準言語。オブジェクト指向言語である[1]。標準でない言語(JVM言語)は多数あり、その言語をコンパイルして正しいJavaクラスファイルを生成できればJavaプログラムとして実行できるが、Javaには含まれない。言語仕様(JLS: Java Language Specification)が定められており、Java開発環境はこの仕様に準拠する必要がある。
- Java開発環境(JDK)
- Javaコンパイラーを含む、Java開発で必要なツールやライブラリーのセット。Java実行環境に含まれない開発時にのみ必要なクラスライブラリーが含まれる。Java実行環境を包含する。
- Java実行環境(JRE)
- Java仮想マシン(JVM)を含む、Java実行ツールのセット。クラスライブラリーが含まれる。
当時のサンマイクロシステムズ所属のジェームス・ゴスリングが開発したシステムである。 開発目標のひとつに、C言語・C++の複雑で煩雑な開発の問題を解消して、それを置き換えるというものがあった。それを達成しやすくするため[2]、表記スタイルはC言語・C++に近いものになったとされる。
Java言語で書かれたプログラムコードをJavaコンパイラーでコンパイルすると、クラスファイルが作成される。Java実行時にこのクラスファイルとともにJavaを実行すると、Javaプログラムが実行される。
特徴[編集]
WORA[編集]
Javaの設計思想の1つに、"WORA: Write once, run anywhere"、つまり作成したアプリケーションを書き直さずにそのままどのOSでも実行できるようにする、というものがあり、これをある程度のレベルで達成している。ただし、WORAを実現する仕組みを開発者が十分に理解しておく必要がある。
後方互換性[編集]
Javaは後方互換性を高い水準で維持している。例外の一つは、バージョン5[3]でEnum型の新設によりenum
が予約語になったため、それ以前にenum
を識別子名にしていた場合には変更が必要だったりする。
互換性には慎重であり、クラスライブラリーの更新だけで対応できるものはそれだけで行う傾向にある。ただし大幅な変更は何度かあり、バージョン5ではジェネリックスの型引数、バージョン8ではラムダ式の導入により、比較的大規模な構文の変更が行われた。
Java言語[編集]
ここでは説明を簡潔にすることを優先するため、内容が曖昧だったり誤っている可能性がある。厳密な言語仕様については、Java言語仕様を参照すること。
Javaはオブジェクト指向言語であり[1]、オブジェクトの鋳型であるクラスとその振る舞いを決めるメソッドを定義することが基本となる。メソッドは、制御文、演算子による演算、他のオブジェクトのメソッド呼び出しなどを組み合わせて定義・実装する。これらの複数のオブジェクトの相互作用によって、プログラムを構成する。
Javaにはプリミティブ型というデータ型があり、オブジェクトでない数値型や真偽型などが含まれる。これらは以下の理由によりオブジェクトと同じように扱えない。
- 全てのオブジェクトの上位型としてObject型があるが、プリミティブ型には対応していない。直接キャストもできない。プリミティブ型をオブジェクトとして扱うには、ラッパークラスでラップする必要がある。
- Object型に変換できないため、Object型を引数に持つメソッドが直接利用できない。利用できているように見えるのは、オートボクシングという仕組みによるものである。オートボクシングとは、プリミティブ型とラッパークラスの相互変換を自動で行う仕組みのこと。
- プリミティブ型はメソッドとしての振る舞いを持たないし、拡張もできない。
配列型についても、プリミティブ型と少し異なった問題点がある。
- 参照型ではあるが、新たな型を定義できない。よって新しい振る舞いも定義できない。
- Object型とプリミティブ型それぞれの配列型があり、これらは型互換性がない。
これは1編集者の私見。(編集者:早朝の掃除屋)
すべてのオブジェクトは Object 型を継承しているが、さすがに extend Object をいちいち書いているとウザいので、IDE が勝手に削っちゃうこともある。
オブジェクトには静的(static)なものと動的(dynamic)なものの二種類があり、スタティックは「もの」なのでそこに「いる」。これに対してダイナミックは「図面」でしかないのでオマジナイを掛けないと(new する)実体化しない。
オブジェクトの鋳型であるクラスとその振る舞いを決めるメソッドを定義することが基本となる。メソッドは、制御文、演算子による演算、他のオブジェクトのメソッド呼び出しなどを組み合わせて定義・実装する。これらの複数のオブジェクトの相互作用によって、プログラムを構成する。
大雑把な特徴としては、以下のような特徴がある。
- goto がない。
- 広域変数がない。値を渡したいときはシングルトン実装したオブジェクト経由で渡す。
- catch & throw がある。ただし、catch をサボると宝の持ち腐れになるので注意が必要。「どんな例外を投げて、どこで捕まえるか」についてはちゃんと文書化しておいたほうがいいのだが、動いただけで安心してしまって放っておいたらそのまま忘れてしまって保守担当者が泣きを見たりすることもある。
- 基本的には戻り値はプリミティブ型なので、複数の値を返したいときは適切なオブジェクトを定義しなければいけないのだが、小さなプログラムだったら大抵どこかに似たようなオブジェクトが定義されている(ピクセルマップ上の座標点とか)し、ちょっと大きなプロジェクトだと抽象オブジェクトだのなんだのといろいろやっているうちに混乱してくるため、「ちゃんとクラス図を描いて壁にでも貼っとけ!」という話になる。コミュニケーションは密に取ろう。「どうせ一人で書いてるんだから」と言いたくなる気持はわかるが、「三日前の自分は他人である」。
「言語」を付けない場合の意味[編集]
多くのプログラミング言語において、処理系とはプログラミング言語を使うためのシステムであり、プログラミング言語を使わないのに処理系を使うということは基本的にはない[4]。そのため、「言語」を付けない場合は原則として言語のことを指す。しかし、Javaの場合はいくつかの理由でそうならないケースがある。
- 処理系のうち、開発環境と実行環境が分離されている。実行環境は、プログラミングとは関係のない一般ユーザーにも提供される。一般ユーザーに提供される「Java」は実行環境を指す。
- Java以外のJVMを使用するプログラミング言語(JVM言語)について書かれた文章の中に「Java」と表記されていた場合、プログラミング言語を指すのか処理系を指すのかがはっきりしない。そのため、言語と処理系の対比を示す際に、あえて「Java言語」と表記する場合がある。
以上のように、Javaにおいては「言語」を付けない場合の意味が他の言語と異なる。
Javaプラットフォーム[編集]
Javaプラットフォームとは、JREより広義のJavaを実行する実行基盤と規格の総称で、標準のものと拡張されたものがある。
- Java Platform, Standard Edition (Java SE)
- 標準のJavaプラットフォーム。概要節に記載した要素が含まれる。
- Java Platform, Enterprise Edition (Java EE)
- Java用アプリケーションサーバー向けの拡張規格。比較的大規模なシステム向けの機能が提供されている。例えば、分散処理、データベース永続化、Webページ動的制御などが含まれる。
- Oracle社が収益低下などを理由に、Java EE 8を最後にJava EEを手放すことになった。Java EE 9に相当するものは、Eclipseなどのオープンソースプロジェクトを運営するEclipse財団にJakarta EEとして引き継がれている。
- Java Platform, Micro Edition (Java ME)
- Javaの縮小版で、小型コンピューター向けに機能を縮小した実行環境やAPIを提供している。
- 携帯電話やスマートフォンなどのモバイル端末[5]だけでなく、家電、乗り物に搭載する機器、医療機器、貴工業用機械、他にも様々な組み込み機器で使われている。
歴史[編集]
1995年に、バージョン1.0が発表された。
途中、オープンソース化し、オープンソース版は現在はOpenJDK[6]となっている。
サンマイクロシステムズがOracleに吸収されたため、2019年現在では、Oracle社がオープンソースでない部分の権利を所有している。
評価[編集]
言語としてのJavaは、発表当初はオブジェクト指向言語[1]を広めた功績が評価されたが、その後は関数型言語を含む先進的な言語が人気を得るようになり、反対にJavaは言語としての粗が批評されるようになった。2010年代にはJava言語は時代遅れと評価されるようになっている。
一方、JVMは、VMとしては性能が高く、Javaクラスファイルの仕様が比較的簡単であるため、多くの言語[7]がVMとして採用している。そのことから、JVM単体では人気が高いと言える。
余談[編集]
- 「Java」は海外でのインターネットスラングで、一般的にコーヒーを指すものであり、Javaの名前の由来もそれである。もっと言うと、Javaのスラングがコーヒーを指すものなのはジャワコーヒーがあるからである。
これは1編集者の私見。(編集者:早朝の掃除屋)
少なくとも現在においては日本語処理向きの言語としてはダントツである。まず文字コードがUnicodeなので文字コードの差による混乱がない。Lisp文字列やC文字列やPascal 文字列のような危うさがないのでストレスが少ない。ポインタではなく参照なので多少戸惑ったが、そこをクリアする技法を身につけると気にならなくなってくる。
脚注[編集]
- ↑ a b c 純粋なオブジェクト指向言語としては中途半端であるという批判がある。分かりやすいところでは、Java言語節に記載しているプリミティブ型とその配列の扱い。
- ↑ 囲い込みとかベンダーロックインとか、そういうのと関係ある話。
- ↑ Javaの正確なバージョン表記は非常に面倒くさいのでここでは採用しない。
- ↑ プログラミング言語を理解しているかどうかは関係なく、ソースコードを直接扱うかどうかということ。
- ↑ Androidアプリ開発に使われているものはJava MEではない。
- ↑ “OpenJDK Mercurial Repositories”. 2019年12月14日確認。
- ↑ 冒頭のJVM言語を参照。