Java
Java(ジャバ)は、Java言語の言語仕様、Javaの実行環境であるJava仮想機械(JVM)の機械語にJava言語を翻訳するコンパイラを包括するシステム全般(JDK)の総称。
概要[編集]
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++に近いものになったとされる。「++」「--」演算子はポインタもなければ(「参照」に置きかえられている) sizeof もないJavaでは本来不要であるが、for 文で「i++」と書くことが慣例化しているために、Javaにも継承されている。「プレ・インクリメント」「ポスト・デクリメント」はアセンブラ言語におけるスタック操作においては常識であり、「ポインタ以外に++や--を使っちゃダメ」と云われていたものだが、「+=」とか「-=」とかを使いたがらない一部のプログラマがいるために、そのままレガシーになっている。
Java言語で書かれたプログラムコードをJavaコンパイラでコンパイルすると、クラスファイルが作成される。Java実行時にこのクラスファイルとともにJavaを実行すると、Javaプログラムが実行される。
特徴[編集]
WORA[編集]
Javaの設計思想の1つに、"WORA: Write once, run anywhere"、つまり作成したアプリケーションを書き直さずにそのままどのOSでも実行できるようにする、というものがあり、これをある程度のレベルで達成している。ただし、WORAを実現する仕組みを開発者が十分に理解しておく必要がある。
後方互換性[編集]
Javaは後方互換性を高い水準で維持している。
例外の一つは、バージョン5[3]でEnum型の新設によりenum
が予約語になったため、それ以前にenum
を識別子名にしていた場合には変更が必要だったりする。ただし後方互換性というのもよしあしで、LOOP UNTIL DO REPEAT 構文なんかは追加してほしい。
互換性には慎重であり、クラスライブラリーの更新だけで対応できるものはそれだけで行う傾向にある。ただし大幅な変更は何度かあり、バージョン5ではジェネリックスの型引数、バージョン8ではラムダ式の導入により、比較的大規模な構文の変更が行われた。
Java言語[編集]
ここでは説明を簡潔にすることを優先するため、内容が曖昧だったり誤っている可能性がある。厳密な言語仕様については、Java言語仕様を参照すること。
全体的な印象[編集]
「お嬢様系で高学歴の美人女優がハウスのジャワカレーの中辛(家庭用パッケージ)を食べている図」に近い印象があり、「脱いでもスゴいんだろうな」という期待感がある。C/C++などの「ハードウェアべったり」「アセンブラに毛の生えたような言語」とは異なり、厭でもモジュール化しなければならず、「それっぽく『見立て』をしてモジュール化しないといけない」といった苦労のない「お行儀のよい言語」であるため、それほど悪い言語ではない。とはいえ反面、「ファイルの数がどうしても増える」ので、Webページに貼りつけるとなんとなく鬱陶しい。
じっさい、Java には「オブジェクト指向言語」ではあるものの、言語仕様としてはアルゴルやLISPの影響を強く受けており、実装方法としては(8bit マシンの時代から使われている)仮想機械方式を採用している[4]ので、「寄せ集め」「いいとこどり」の実装である。とくに文字列などの可変長データに関しては、C 言語などに対する反省から、かなり厳重になっているので業務においても安心して使えるという利点がある。
ただし、バーモントカレー的な口のよさも受容しており、HTML(たとえば JSP)や SQLも利用しやすいように配慮されており、Tomcat や MySQLなどとの連携も簡易である。統合開発環境(IDE)であるEclipseも広く使われ、ソースコード管理システムとの連携も容易である。
一般的な説明[編集]
Javaはオブジェクト指向型の言語であり[1]。すべてのオブジェクトは Object 型を継承しているが、さすがに extend Object をいちいち書いているとウザいので、IDE が勝手に削っちゃうこともある。
オブジェクトには静的(static)なものと動的(dynamic)なものの二種類があり、スタティックは「もの」なのでそこに「いる」。これに対してダイナミックは「図面」でしかないのでオマジナイを掛けないと(new する)実体化しない。
オブジェクトの鋳型であるクラスとその振る舞いを決めるメソッドを定義することが基本となる。メソッドは、制御文、演算子による演算、他のオブジェクトのメソッド呼び出しなどを組み合わせて定義・実装する。これらの複数のオブジェクトの相互作用によって、プログラムを構成する。
Javaにはプリミティブ型というデータ型があり、オブジェクトでない数値型や真偽型などが含まれる。これらは以下の理由によりオブジェクトと同じように扱えない。
- 全てのオブジェクトの上位型としてObject型があるが、プリミティブ型には対応していない。直接キャストもできない。プリミティブ型をオブジェクトとして扱うには、ラッパークラスでラップする必要がある。
- Object型に変換できないため、Object型を引数に持つメソッドが直接利用できない。利用できているように見えるのは、オートボクシングという仕組みによるものである。オートボクシングとは、プリミティブ型とラッパークラスの相互変換を自動で行う仕組みのこと。
- プリミティブ型はメソッドとしての振る舞いを持たないし、拡張もできない。
配列型についても、プリミティブ型と少し異なった問題点がある。
- 参照型ではあるが、新たな型を定義できない。よって新しい振る舞いも定義できない。
- Object型とプリミティブ型それぞれの配列型があり、これらは型互換性がない。
大雑把な特徴としては、以下のような特徴がある。
- goto がない。
- 広域変数がない。値を渡したいときはシングルトン実装したオブジェクト経由で渡す。
- catch & throw がある。ただし、catch をサボると宝の持ち腐れになるので注意が必要。「どんな例外を投げて、どこで捕まえるか」についてはちゃんと文書化しておいたほうがいいのだが、動いただけで安心してしまって放っておいたらそのまま忘れてしまって保守担当者が泣きを見たりすることもある。
- 基本的には戻り値はプリミティブ型なので、複数の値を返したいときは適切なオブジェクトを定義しなければいけないのだが、小さなプログラムだったら大抵どこかに似たようなオブジェクトが定義されている(ピクセルマップ上の座標点とか)し、ちょっと大きなプロジェクトだと抽象オブジェクトだのなんだのといろいろやっているうちに混乱してくるため、「ちゃんとクラス図を描いて壁にでも貼っとけ!」という話になる。コミュニケーションは密に取ろう。「どうせ一人で書いてるんだから」と言いたくなる気持はわかるが、「三日前の自分は他人である」。
「言語」を付けない場合の意味[編集]
多くのプログラミング言語において、処理系とはプログラミング言語を使うためのシステムであり、プログラミング言語を使わないのに処理系を使うということは基本的にはない[5]。そのため、「言語」を付けない場合は原則として言語のことを指す。しかし、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ページ動的制御などが含まれる。
- Java Platform, Micro Edition (Java ME)
- Javaの縮小版で、小型コンピューター向けに機能を縮小した実行環境やAPIを提供している。
- 携帯電話やスマートフォンなどのモバイル端末[6]だけでなく、家電、乗り物に搭載する機器、医療機器、貴工業用機械、他にも様々な組み込み機器で使われている。
歴史[編集]
1995年に、バージョン1.0が発表された。
途中、オープンソース化し、オープンソース版は現在はOpenJDK[7]となっている。
その後、バージョン1.4でほぼ安定したため、その後のバージョンは「5」「6」「7」となっている。
サンマイクロシステムズがOracleに吸収されたため、2019年時点より、Oracle社がオープンソースでない部分の権利を所有している。
評価[編集]
言語としてのJavaは、発表当初はオブジェクト指向言語[1]を広めた功績が評価されたが、その後は関数型言語を含む先進的な言語が人気を得るようになり、反対にJavaは言語としての粗が批評されるようになった。2010年代にはJava言語は時代遅れと評価されるようになっている。
一方、JVMは、VMとしては性能が高く、Javaクラスファイルの仕様が比較的簡単であるため、多くの言語[8]がVMとして採用している。そのことから、JVM単体では人気が高いと言える。
少なくとも現在においては日本語処理向きの言語としてはダントツである。まず文字コードがUnicodeなので文字コードの差による混乱がない。Lisp文字列やC文字列やPascal 文字列のような危うさがないのでストレスが少ない。ポインタではなく参照なので多少戸惑ったが、そこをクリアする技法を身につけると気にならなくなってくる。
参考文献[編集]
脚注[編集]
- ↑ a b c 純粋なオブジェクト指向言語としては中途半端であるという批判がある。分かりやすいところでは、Java言語節に記載しているプリミティブ型とその配列の扱い。
- ↑ 囲い込みとかベンダーロックインとか、そういうのと関係ある話。
- ↑ Javaの正確なバージョン表記は非常に面倒くさいのでここでは採用しない。
- ↑ JVM は「ジャバ・バーチャル・マシン」の略である。
- ↑ プログラミング言語を理解しているかどうかは関係なく、ソースコードを直接扱うかどうかということ。
- ↑ Androidアプリ開発に使われているものはJava MEではない。
- ↑ “OpenJDK Mercurial Repositories”. 2019年12月14日確認。
- ↑ 冒頭のJVM言語を参照。
関連項目[編集]