この節では、Java と JRE (Java Runtime Environment) の基礎を紹介します。
Java は、クラスを基本単位とするオブジェクト指向の、新しく開発された並列型のプログラミング環境および実行環境です。Java は、次の要素から構成されています。
プログラミング言語
API 仕様
仮想マシン仕様
Java には、次の特徴があります。
オブジェクト指向 - Java は、C++ の基本オブジェクト技術に多少の変更 (機能の拡張および削除) を加えたオブジェクト技術を提供します。
アーキテクチャに依存しない - Java ソースコードをコンパイルすると、アーキテクチャに依存しないオブジェクトコードが生成されます。このオブジェクトコードは、ターゲットアーキテクチャ上の Java Virtual Machine (JVM) によって解釈されます。
移植性 - Java では、移植性の面での規格が強化されています。たとえば、int は常に 2 の補数の 32 ビット整数です。ユーザーインタフェースは、Solaris および他のオペレーティングシステムですぐに実装可能な抽象ウィンドウシステム (AWT、Abstruct Window Toolkit) を使用して構築されます。
分散型 - Java には、包括的な TCP/IP ネットワーク機能が実装されています。ライブラリルーチンは、HTTP (ハイパーテキスト転送プロトコル、HyperText Transfer Protocol) や FTP (ファイル転送プロトコル、File Transfer Protocol) などのプロトコルをサポートしています。
厳密な検査 - Java コンパイラおよび Java インタプリタは、包括的なエラー検査機能を提供します。すべての動的メモリーを管理し、配列境界などの例外を検査します。
安全性 - Java 言語には、C や C++ でしばしば見られるような不正なメモリーアクセスを引き起こす機能は実装されていません。Java インタプリタは、コンパイル後のコードをテストして、不正なコードがないかどうかを検査します。これらのテストによって、コンパイル後のコードがオペランドスタックのオーバーフローやアンダーフローを起こしたり、不正なデータ変換を行なったり、無効なオブジェクトフィールドにアクセスしたりすることがなくなり、すべての opcode のパラメータタイプが有効であることが検証されます。
高いパフォーマンス - アーキテクチャに依存しない、機械語に似た言語にプログラムをコンパイルするため、インタプリタでの処理サイズが小さく、効率的に実行されます。また、Java 環境において Java バイトコードは実行時にネイティブのマシンコードにコンパイルされます。
マルチスレッド化 - Java 言語には、マルチスレッド機能が組み込まれています。マルチスレッド処理では、ユーザー操作の処理を継続しながら、イメージの読み込みなどの処理を行うことができるので、対話式処理のパフォーマンスを向上させることができます。
動的 - Java は、呼び出されたモジュールを実行時までリンクしません。
簡潔 - Java は C++ に似ていますが、C あるいは C++ の複雑な機能は取り除かれています。
Java には、以下の機能は提供されていません。
プログラミングで制御する動的メモリー
ポインタ演算
struct (構造体)
typedef
#define
JRE (Java Runtime Environment) は、一般的な JVM 実装用にコンパイルされたプログラムを実行できるソフトウェア環境です。実行時システムは、次のものから構成されます。
Java プログラムの実行、ネイティブメソッドの動的リンク、メモリーの管理、例外処理に必要なコード
JVM 実装
次の図は、JRE 全体と、一般的な JVM 実装の各種モジュールから構成される JRE の各要素とクラスライブラリとの関係を表しています。
JVM (Java Virtual Machine) は、1 つの命令セットを持ち、メモリーを使用する抽象的な演算マシンです。仮想マシンは、しばしばプログラミング言語の実装に使用されます。JVM は、Java プログラミング言語の基礎となるものです。異なるプラットフォーム間で Java プログラムの移植が可能なこと、 コンパイル後のコードサイズが小さいということは、JVM によって実現されます。
Solaris JVM は、Java アプリケーションの実行に使用されます。Java コンパイラ javac はバイトコードを生成し、そのコードを .class ファイルに書き込みます。JVM はこれらのバイトコードを解釈し、そのバイトコードはどの JVM 実装でも実行することができます。このようにして、異なるプラットフォーム間での Java の移植性が実現されます。図 1-2 および図 1-3 はそれぞれ、従来のコンパイル時環境と、Java が提供する移植可能な新しいコンパイル時環境を表しています。
Java プログラミング言語では、マルチスレッドプログラムがサポートされる必要があります (第 2 章「マルチスレッド 」 を参照)。Java インタプリタはすべてマルチスレッドプログラミング環境を提供しますが、Java インタプリタの多くは、シングルプロセッサによるマルチスレッド処理しかサポートしないため、一度に実行される Java プログラムスレッド数は 1 つだけです。
Solaris JVM インタプリタは、Solaris のマルチスレッド機能を使用することによって、マルチプロセッサシステムを最大限に活用します。マルチプロセッサシステムでは、1 つのプロセスの複数のスレッドが複数の CPU で同時に実行されるようにスケジューリングできます。Solaris の JVM 上でマルチスレッド Java プログラムを実行すると、他のプラットフォームの JVM で同じプログラムを実行したときに比べて、大幅に並列性が向上します。
Solaris JVM に組み込まれている Sun の Java JIT (Just-In-Time) コンパイラは、従来より大幅に高速に動作し、特に長時間連続して演算中心の処理を実行するプログラムでは、大幅にパフォーマンスが向上します。
JIT コンパイラ環境変数が有効になっている (デフォルト) の場合、JVM は .class ファイルを読み取って解釈し、JIT コンパイラに渡します。JIT コンパイラは、バイトコードを、ターゲットのプラットフォーム (プログラムを実行するプラットフォーム) にネイティブなコードにコンパイルします。次の図は、JIT コンパイラのコンパイルプロセスを表しています。
次の図は、JIT コンパイラと Solaris JVM および JRE との機能関係を表しています。