Java
読み:ジャバ
外語:Java

 Sun Microsystems(後のOracle)の開発したプログラミング言語およびその実行環境。言語は、C++に良く似たオブジェクト指向プログラミング言語である。
目次

情報

概要

設計者
 言語の設計は、元祖Emacsの開発や、KISSの原則などで知られるカナダ出身のプログラマーJames Goslingである。
 EmacsではRichard M. Stallmanに大敗したが、Javaはそこそこ成功をおさめ、出身国カナダからカナダ勲章が贈られた。これはカナダにおいては、民間人が得られる勲章として最高位のものとされる。

登場から普及まで
 Javaは、1995(平成7)年5月23日に発表された。
 言語仕様としての「Java言語」と、その実行環境である仮想計算機「JVM」などが仕様として定義されている。
 JVMさえ用意すればどのようなオペレーティングシステムでも利用可能であり、登場した当初は、実行環境を問わないところが好まれWebサイトのアプレット作成用に使われたが、Java言語は汎用言語なので、用途はそれに限定されたものではない。
 後にFlashが多機能化するとJavaアプレットから置き換わりJava需要は激減した。Flashのクライアントはほぼ全てのWebブラウザーにインストールされているのに比べ、JREはそうではないことも弱点となり、Javaは下火となった。
 Javaは、銀行システム用としてCOBOLを置き換える形で細々と使われるようになっていたが、Javaが表舞台への復活を果たしたのはアプリケーションをJavaで記述するAndroidが登場してからである。ただしAndroidが利用するのはJava言語のみで、仮想計算機「JVM」は使用していない。

末期
 当初標榜したWeb用需要としては、最初からAdobe Flashには勝ち目なく、後にHTML5が登場するに至り、Adobe Flashと共に現役を退くこととなった。結果として、Webの世界ではJavaは単なるセキュリティリスクでしかなく、「邪魔者」として以外の評価は殆どなかったものと思われる。
 アプリケーション記述用言語としても奮わず、Windows用としてもUNIX用としても、主流になることはなかった。
 かくして一度は実質的に滅んだJavaだったが、Androidが普及して以降は、JavaはAndroid用プログラミング言語として一定の需要を維持するに至った。現在は、Oracleがどう考えようとも、Androidの処理を記述するためのマクロ言語として以外の用途は殆どない。

名称の由来
 Javaは開発コードネームを「Oak」と言うが、これは開発プロジェクト中に窓から樫の木(Oak)が見えたことからこの名が付けられたとされている。
 後に商標の関係で名前をJavaに変更した。

特徴

エディション

実行環境
 Javaという表現は、単なるプログラミング言語だけではなく、実行環境も含められている。このため、言語のみを特に示す場合は「Java言語」、実行環境は「JVM」や「JavaOS」のように表現され、逆に広義のJavaを「Javaプラットフォーム」という。
 Java言語で書かれたプログラムをコンパイルすると、中間言語と呼ばれるバイナリが生成される。類似言語のCやC++は原則として特定CPU用のバイナリであるが、この点がJavaの最大の特徴である。
 このバイナリは、Javaチップ(マイクロプロセッサー)用の機械語コードとして規定された架空の機械語である。他のプロセッサーでも、Javaチップの動作をJVM(Java仮想計算機)としてソフトウェアで実装し、エミュレートによって実行することが可能である。
 このJVMは、一種のオペレーティングシステムとして機能する。

純正環境
 純正のJava実行・開発環境をJDK、ここからJava実行環境のみを抜き出したサブセットをJREという。
 これは単に純正というだけではなく、Javaの規格を規定するものでもある。

互換性
 Javaは仮想CPUと共通ライブラリの互換性を保証しているので、一度書いたプログラムが全ての環境で動作することを実現する。これを「100% Pure Java」という。
 現実には実装上の問題などもあり、必ずしも100%の互換性は無い。それでもJavaのもつ移植性の高さ(ポータビリティ)はメリットが大きく、さらにスケーラビリティもあるため、この分野では普及した。
 100%ポータブルは今後の業界の努力で改善されるものと見られている。100% Pure Javaを妨害するMicrosoftのJava実装が無くなったため、この点については大幅に改善された。

特定環境
 もちろんJavaも一つのプログラミング言語である以上、特定のOS専用の実行バイナリを作ることも、JVM以外の仮想計算機向けのバイナリを出力することも可能で、実際にWindows用の実行ファイルを出力するような製品や、独自の仮想計算機Dalvikを使うOSのAndroidも市販されている。
 Sun Microsystemsがそのような製品をどう思っていたかは定かではないが、Oracleはそれを許さなかった。

フリーの度合い
 Javaは他の一般的な言語と違ってISOなどで標準化されていない。かつてはSun Microsystems、現在はOracleが独占的に仕様を策定するものである。したがって仕様策定については完全にクローズドである。
 それでも、コンパイラーはGCJ(GNU Compiler for Java)などがGPLであり、またSun謹製のOpenJDKもGPLでライセンスされている。JVMを実装するメーカーはライセンス料が要求されるが、Javaプログラマーは費用無くプログラミングが出来、一般のユーザーも実行環境は無料で入手できるので、実質的にフリーに近いものであった。
 このため、Javaはオープンな印象があり普及したが、Oracleに買収された後は一社独占的なイメージが強まり、今後の壁になる恐れが出てきた。
 従来のSunのように、広く薄く金を徴収するようなビジネスモデルが存続できれば理想的だが、望みは薄いようである。かつてはMicrosoftのJ#がJavaのモビリティーを毀損するとして嫌われ、代わりにJavaとは違うものとして.NET FrameworkC#が登場するといったような事態もあったが、更なる問題として、Java言語を使いながら成果物(バイトコード)がJavaではないGoogleのDalvikのようなものも登場してきている。さらに、Javaに代わるプログラミング言語としてRed HatはCeylonを開発中である。世界は混乱する方向にしか向かっていないようである。

技術

変数

変数型
 Javaの変数は、次の二種類である。
 プリミティブ型として用意される基本データ型の変数型は次の通り。
 整数型は全て符号ありで、符号なし(C/C++でいうところのunsigned)の変数はない。

複合型変数またはクラス
 プリミティブ型以外で、変数のようにして提供されるものは、Javaでは全てクラスである。
 以下は一例

即値
 Javaでは、イミディエイト(即値)で数値を記述する場合、整数はintとして、実数はdoubleとして扱われる。
 intで扱えない大きな整数を記述する場合、または実数でfloat形を記述する場合、数値の型を明示的に表わすためにサフィックスを記述する必要がある。long型はLを、float型はFを記述する。
 long l = 12345678901L;
 float f = 3.14F;

配列型
 Javaでも配列が扱えるが、Javaの配列型は、類似言語のC/C++とは趣が大きく異なる。
 宣言は次のようにする。書き方は二通り。
 配列型[] 配列名;
 配列型 配列名[];
 通常は前者が使われる。後者はC風であるが、Cのように[]内に要素数を書くことはできない。この[]記号は、C/C++の * や、C++の & などに相当するものである。
 使用例は次の通りである。
 int[] intArray;
 String[] stringArray;
 配列型変数は、そのままではメモリーが割り当てられていないため使用できない。使用するためには、newを使って配列を生成する必要がある。
 配列名 = new 配列型[サイズ];
 10個のint型配列を作るなら、次の通り。
 intArray = new int[10];
 宣言と生成を同時にすることも可能で、このようにすることが多い。
 int[] intArray = new int[10];
 引数として与えられるサイズは、定数の他、整数型の変数でもよい。その時々で必要となる大きさを確保して使用することができる。
 int size = 10;
 byte[] buf = new byte[size];
 Javaでは、配列は初期値として、その変数型に応じた0相当(論理型ならfalse、参照型ならNULL)が設定される。

沿革

JDK 1.0
 最初のバージョン。このバージョンは国際化対応していない。

JDK 1.1
 国際化対応した最初のバージョン。
 次のような機能に対応した。
 次のようなバージョンがある。()で併記したものはコードネーム。

J2SE 1.2
 このバージョンから、JDKからJ2SE(Java2 Platform, Standard Edition)に名称が変更された。この版がStandard Editionで、関連して、J2EE(Enterprise Edition)やJ2ME(Micro Edition)が定義されるようになった。
 次のような機能に対応した。
 次のようなバージョンがある。()で併記したものはコードネーム。

J2SE 1.3
 次のような機能に対応した。
 次のようなバージョンがある。()で併記したものはコードネーム。
 サポート終了済

J2SE 1.4
 次のような機能に対応した。
 次のようなバージョンがある。()で併記したものはコードネーム。[]で併記したものが内部バージョンで、bはビルドを表わす。
 サポート終了済

J2SE 5.0
 言語としてのJavaに大幅な仕様変更や拡張が加えられたバージョン。コードネームは「Tiger」。
 次のようなバージョンがある。[]で併記したものが内部バージョンで、bはビルドを表わす。
 サポート終了済

J2SE 5.1
 バージョン1.5.1、コードネームは「Dragonfly」であったが、リリースされなかった。
 従ってこのバージョンは存在しない。

Java SE 6
 このバージョンから、Java2とした命名方針を変更し、J2SEよりJava SEに名称が変更された。また小数点のバージョン番号を表に出さなくなった。コードネームは「Mustang」。
 Java SE 6の仕様はJSR-270で定義されており、主な新機能は、次の通り。
 次のようなバージョンがある。[]で併記したものが内部バージョンで、bはビルドを表わす。

Java SE 7
 内部バージョンは1.7.0で、開発コードネームは「Dolphin」。
 延期が繰り返されたが、これ以上の延期を避けるため、言語仕様の改訂などはJava SE 8にまわされ、Java SE 7のリリースが急がれることになった。
 次のような機能に対応した。
 次のようなバージョンがある。[]で併記したものが内部バージョンで、bはビルドを表わす。
 Java 7は2015(平成27)年4月30日にサポート(パブリック・アップデート)が終了となった。

Java SE 8
 大幅な言語仕様変更がなされた。当初、仕様変更はJava SE 7から導入される予定だったが、なかなか仕様がまとまらなかったため、Java SE 8から導入された。2014(平成26)年3月18日(米国現地時間)にリリースされた。
 次のようなバージョンがある。

今後

開発者の離脱
 OracleはSun Microsystems買収でJava利権を得たが、これも安泰とは言い難いものがある。
 SunがOracleに買収されて以降、元SunのプロジェクトはOracleへの嫌悪感を主たる理由として続々と離脱することになった。Javaも例外でなく、まずJava開発者のJames Goslingが離脱した。
 追ってJava技術および仕様の標準化プロセスを決定する組織JCP(Java Community Process)執行委員会のメンバーDoug Leaも離脱、以降はOpenJDKに注力すると表明した。
 Doug LeaはJDK5.0で追加されたjava.util.concurrentパッケージでの仕事が知られているが、氏の離脱理由は、JCPがOracleの提案仕様を承認するだけの組織になり、今後JCPを通じての革新的な取り組みに期待できないため、としている。

Android

裁判
 GoogleAndroidオペレーティングシステムは、「Java言語」を使う。しかしJVMではない独自の仮想計算機Dalvik」が使われる。
 これは、Googleは事前にSun Microsystems(後のOracle)とライセンス交渉をしたが決裂したことと、情報開示拒否や余計な口出しを嫌った結果である。
 こうなるとSun MicrosystemsはGoogleからライセンス料と取ることが出来なくなる。いずれJavaの主要な実装がAndroidのDalvikになるだろうことは疑いようがなく、そうなると誰も使わなくなるだろうJava Micro Editionと共に流れから取り残されたSun Microsystemsには、もはや未来は無い。
 その後、SunはOracleに買収された。そして2010(平成22)年8月12日(米国時間)、OracleはAndroidオペレーティングシステムをめぐってGoogleを提訴した。訴状によれば、7つの米国特許のうちの一つ以上を侵害しているとし、Androidの配布や広告の中止を要求した。

第一審
 Googleは翌日、「Oracleが、根拠のない訴訟でGoogleとオープンソースのJavaコミュニティの両方への攻撃を選択したことは残念である」という趣旨の声明を発表した。また2010(平成22)年10月には、同様の趣旨で訴訟に対する応答と反訴が裁判所に提出されたと報じられており、この中に、この訴訟の完全な却下を求める裁定申請が含まれているとされた。
 訴訟では和解案も出され、中には「GoogleがOracleに一定期間のAndroid売上高の0.5%を支払う」があったが、そもそもAndroidはAppleやMicrosoftなどライバルへの牽制を目的に無料で提供する戦略であるため、理論上はOracleに支払う額は0ドルということになる。この和解案は、当然だがOracleが拒否したらしい。
 そして一審判決では、APIは著作権保護の対象ではない、としてOracleの訴えを退けた。

控訴裁
 Oracleは不服として控訴。
 米連邦巡回控訴裁判所は2014(平成26)年5月9日(現地時間)、一審の判断を覆し、APIは著作権保護の対象であるという判決を下した。GoogleとオープンソースのJavaコミュニティは逆転敗訴という結果となった。

最高裁
 Googleは不服として上告。
 2015(平成27)年6月29日(現地時間)、米連邦最高裁判所は著作権訴訟に関するGoogleの上告を棄却したとReutersが報じた。
 これによって、GoogleはOracleに対してJavaプログラミング言語を使用するためのライセンス料を支払う義務が生じる可能性があるのみならず、当初の要求どおり、Androidの配布や広告の中止も要求されるおそれがある。ただ2016(平成28)年2月現在、とくに目立った動きはない。Googleが何らかのライセンス料の支払いに応じた可能性がある。

OS X
 Appleは2010(平成22)年10月20日、OS Xに組み込まれているJavaを更新する「Java for Mac OS X 10.6 Update 3」において、Mac OS XのJavaは近い将来サポートが終了する可能性を示唆した。
 その後も、Java 6については細々とAppleからのセキュリティ差分が提供されているが、Java 7以降はOracleからの提供となっている。

再検索