Javaプラットフォームは、
Javaで記述されたプログラムの開発と実行を支えるソフトウェア群の総称です。このプラットフォームの核となるのは、
JavaプログラムがOSや
ハードウェアに依存せず動作するための仕組みです。
Javaプラットフォームの概要
Javaプログラムは、特定のOSや
ハードウェアに依存しない「バイトコード」と呼ばれる中間言語で表現されます。このバイトコードは、仮想マシン(VM)上で実行されることで、異なる環境でも同じように動作します。
Javaプラットフォームは、この仮想マシン、開発に必要な標準ライブラリ、
コンパイラなどを包括した環境です。
Javaプラットフォームは、
Java、
Javaアプレット、
Java Runtime Environment (JRE)、
Java仮想マシン (JVM) など、広範な技術を包含しています。
携帯電話や組み込み機器向けの
Java (
Java ME)、
Java Web Start、
Javaアプリケーションも、このプラットフォームの一部とみなされます。
Javaプラットフォームには、主に3つのエディションがあります。
Java Standard Edition (Java SE): PCのスタンドアロンアプリケーションや、他のエディションの基盤となるエディションです。
Jakarta EE: Webアプリケーションや
Webサービスなど、サーバーサイドで利用されるエディションです。
Java Micro Edition (Java ME): スマートフォンなどの携帯端末向けの軽量なエディションです。
2019年5月時点では、Javaプラットフォームのメジャーバージョンは12でしたが、バージョン番号とは別に、バージョン文字列(例:1.8.0)も存在します。
Javaプラットフォームの構成要素
Javaプラットフォームは、様々なプログラムから構成されており、それぞれが異なる役割を担っています。例えば、JavaコンパイラはJavaソースコードをバイトコードに変換し、Java Development Kit (JDK) の一部として提供されます。実行環境であるJREは、通常、JITコンパイラとして実装され、バイトコードをネイティブコードに変換します。また、Javaバイトコードにプリコンパイルされた大規模なライブラリも提供されています。
アプリケーションの配置方法も多様で、アプレットとしてWebページに埋め込むことも可能です。Java Platform Standard Edition 8 Documentationには、さらに多くのコンポーネントが記載されています。
プラットフォームの中核をなすのは、Javaコンパイラ、ライブラリ、そして仮想マシン仕様に従いバイトコードを実行する環境です。
Java仮想マシン (JVM)
Javaプラットフォームの本質は、バイトコードを実行する「仮想マシン」という概念です。この仮想マシンは、どのようなハードウェアやOS上でも同じバイトコードを実行できます。JITコンパイラは、この仮想マシン上で動作し、実行時にバイトコードをネイティブなプロセッサ命令に変換し、メモリにキャッシュします。
バイトコードを使用することで、Javaプログラムは様々なプラットフォーム上で動作できます。JITコンパイラの導入により、初回ローディング時の遅延はわずかになり、一度「ウォームアップ」すると、Javaアプリケーションはネイティブプログラムと同等の速度で動作します。JREバージョン1.1以降、SunのJava VM実装には、インタプリタだけでなく、JITコンパイラも含まれています。
クラスライブラリ
現代のOSでは、再利用可能なコードの集まりが、プログラマの作業を効率化しています。これらのコードは、動的にロードされるライブラリとして提供されます。Javaプラットフォームは、特定のOSに依存しないため、既存のライブラリに依存することはできません。そのため、Javaプラットフォームは、標準クラスライブラリの集合を提供し、多くのOSで提供される再利用可能な機能を提供します。
Javaクラスライブラリは、以下の3つの役割を果たします。
標準コードライブラリとしての機能: リストの保持や文字列解析など、一般的なタスクを容易にする機能を提供します。
ハードウェアやOSへの抽象インタフェース: ネットワーク接続やファイルアクセスなど、OSに依存するタスクの標準インタフェースを提供します。
プラットフォームの差異の吸収: 基礎となるプラットフォームが
Javaアプリケーションに必要な機能を提供しない場合、クラスライブラリは、その機能をエミュレートするか、存在をチェックする一貫した方法を提供します。
JREに含まれるクラスライブラリは、現在も私有ソフトウェアですが、Free Software Foundationが、互換性のあるフリーライブラリの集合を開発するプロジェクト(GNU Classpath)を進めています。また、2006年11月13日、Sunは
Javaソースコードを2007年3月に
GNU General Public Licenseの下でリリースすると発表しました。
Java言語とプラットフォーム
「
Java」という言葉は、通常
Javaプラットフォーム上で設計された
Javaプログラミング言語を指しますが、プログラミング言語は通常「プラットフォーム」の範囲外です。
Java言語は
Javaプラットフォームの中心的な要素と見なされており、言語と実行環境は一体として扱われることが多いです。
しかし、サードパーティによって
Javaプラットフォームを対象とした多くの
コンパイラや
インタプリタも開発されています。これらのいくつかは既存の言語であり、いくつかは
Java言語の拡張です。例として以下が挙げられます。
拡張:
AspectJ:アスペクト指向プログラミングを実現する
Java拡張。
Generic Java (GJ):Java SE 5.0でJavaに正式に取り込まれた。
言語:
Ceylon
Clojure:LISP方言の一つ。
Fortress
Groovy
JRuby:Rubyインタプリタ。
Jython:
Python-
Javaバイトコード
コンパイラ jythonc を含む
Pythonインタプリタ。
Kawa:LISP方言の一つであるSchemeのインタプリタ。
Kotlin
Processing
Rhino:
JavaScript
インタプリタ。
Scala
他のプラットフォームとの比較
Javaの成功と「write once, run anywhere」というコンセプトは、.NET Frameworkなどの他のプラットフォームにも影響を与えました。.NETは、Javaの成功要因を多く取り入れていますが、完全な実装はMicrosoft Windowsに限定されています。一方、Javaは多くのプラットフォームで完全にサポートされています。
.NETは、異なるプログラミング言語を共通中間言語にコンパイルするという点で、言語非依存性に重点を置いています。この点では、.NETはJavaよりも成功していると言えます。しかし、Javaにも、Scala、Jython、Groovy、JRubyなど、JVMをプラットフォームとする言語処理系が多数存在します。
また、.NETにはVisual J#というJava実装が存在しますが、これは本家のJavaとは互換性がなく、関連するクラスライブラリは古いJDK 1.1に基づいています。これは、Visual J#が.NETにおける主要言語としてではなく、Javaから.NETプラットフォームへの移行を支援するために用意されたものであるためです。
一方、近年ではオープンソースコミュニティによって、IKVM.NETという共通言語ランタイム上で動作するJava仮想マシンが登場し、互換性と相互利用性が向上しています。
関連項目
共通言語基盤 (CLI)
*
Dalvik仮想マシン