Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
生徒
「Javaの学習を始めようと思ったのですが、JDKとかJREとか似たような言葉が多くて混乱しています。プログラムが動く仕組みもよくわからなくて…」
先生
「確かに、Javaは他の言語に比べて独特な実行の仕組みを持っていますね。まずはソースコードがどうやってコンピュータに伝わるのか、その流れを知るのが上達への近道ですよ。」
生徒
「コンパイルという作業が必要だとは聞いたことがあるのですが、具体的に何が行われているんですか?」
先生
「人間が書いた言葉をコンピュータが理解できる形に翻訳する作業のことです。それでは、Javaが動く舞台裏と、開発に欠かせない3つの用語について詳しく解説していきましょう!」
1. Javaプログラムが動く仕組みとコンパイルの流れ
Javaというプログラミング言語は、「一度書けば、どこでも動く(Write Once, Run Anywhere)」という理念のもとに設計されています。この仕組みを支えているのが、独自の実行プロセスです。私たちが普段書いているソースコードは、実はコンピュータ(CPU)が直接読み取れる形式ではありません。
まず、拡張子が「.java」というファイルを作成します。これがソースコードです。次に、このファイルを「コンパイラ」というツールを使って「バイトコード」という中間形式に変換します。この変換作業をコンパイルと呼び、生成されるファイルは拡張子が「.class」になります。
このクラスファイルを、Java仮想マシン(JVM)というソフトウェアが読み込み、それぞれのOS(Windows, Mac, Linuxなど)に適した命令にリアルタイムで翻訳しながら実行します。この二段構えのステップにより、OSの違いを意識せずにプログラムを動かすことが可能になっています。
2. 開発に必須なJDKとは?その役割を詳しく解説
Javaの開発を始める際に必ずインストールするのがJDK(Java Development Kit)です。日本語では「Java開発キット」と呼ばれます。これはその名の通り、Javaのプログラムを作成するために必要な道具箱のようなものです。
JDKには、ソースコードをバイトコードに変換する「Javaコンパイラ(javac)」や、プログラムをデバッグするためのツール、さらには標準的なライブラリ群が含まれています。最近では、後述するJREの機能もJDKに集約されているため、開発者はJDKさえインストールしておけば、プログラムの作成から実行までをすべて完結させることができます。
もしあなたがプログラミングを学びたいのであれば、「まずはJDKをダウンロードする」というのが最初の一歩になります。これがないと、どれだけコードを書いても、それを動かすための形式に変換することができません。
まずは簡単なJavaプログラムの構造を見てみましょう。以下のコードは画面に挨拶を表示する最も基本的なプログラムです。
public class HelloJava {
public static void main(String[] args) {
System.out.println("Javaの世界へようこそ!");
}
}
Javaの世界へようこそ!
3. 実行環境としてのJREの役割と重要性
次に、JRE(Java Runtime Environment)について説明します。これは「Java実行環境」と呼ばれ、Javaで作られたプログラムを動かすために必要なソフトウェアのセットです。JDKが「作るための道具」なら、JREは「動かすための環境」と言い換えることができます。
JREの中には、Javaプログラムの心臓部であるJVMと、プログラムが動作する際に必要となる標準クラスライブラリが含まれています。一般ユーザーがJavaで動くアプリを利用するだけならJREがあれば十分ですが、開発者は作成したコードを確認するためにJREの機能が必要になるため、結果としてJDKの中に含まれる形になっています。
近年では、Java 11以降からJRE単体での提供形態が変わり、JDKから特定の実行環境を切り出す「jlink」などのツールが登場していますが、基本概念として「実行に必要なパーツの集まり」であることに変わりはありません。
4. Java仮想マシンJVMの驚くべき仕組み
Javaの最大の特徴とも言えるのがJVM(Java Virtual Machine)です。これは「Java仮想マシン」と呼ばれ、Javaのバイトコードを読み込んで実行する架空のコンピュータのような役割を果たします。これが、Javaがプラットフォームに依存しない理由の正体です。
通常、C言語などの言語で作成されたプログラムは、Windows用、Mac用といった具合にOSごとに専用の実行ファイルを作る必要があります。しかし、Javaの場合は、どのOSでも「JVMという通訳者」が間に入ることで、同じクラスファイルをどこでも共通して動かすことができるのです。JVMは、メモリの管理や「ガベージコレクション」と呼ばれる不要なデータの自動削除も担当しており、プログラマーが複雑なメモリ管理に悩まされることなく開発に集中できる環境を提供しています。
5. JDK・JRE・JVMの関係性を図解のように理解する
ここで、これら3つの言葉の関係を整理しましょう。初心者の方は、これらが「入れ子構造」になっているとイメージすると非常に分かりやすくなります。
一番外側に位置するのがJDKです。その中に、実行に必要なJREが含まれています。そして、JREの中に、実際にプログラムを動かすエンジンであるJVMが存在します。つまり、以下の包含関係が成り立ちます。
JDK(開発キット) = JRE(実行環境) + 開発ツール(コンパイラ等)
JRE(実行環境) = JVM(仮想マシン) + クラスライブラリ
この関係性を理解していれば、環境構築の際に何をインストールすべきか迷うことはありません。現代のJava開発では、基本的に最新のJDKをインストールすれば、すべての環境が整うようになっています。
ここで、数値計算を行う簡単なプログラムの例を見てみましょう。開発ツールを使って計算ロジックを作成するイメージです。
public class Calculator {
public static void main(String[] args) {
int a = 15;
int b = 10;
int sum = a + b;
System.out.println("合計値は: " + sum);
}
}
合計値は: 25
6. コンパイルから実行までのコマンド操作を体験
統合開発環境(EclipseやIntelliJ IDEAなど)を使っていると意識することはありませんが、裏側ではコマンドを使ってプログラムが動いています。ここでは、基礎知識としてコマンドラインでの実行手順を紹介します。
まず、コマンドプロンプトやターミナルで、ソースコードがあるディレクトリに移動します。そこで「javac」というコマンドを使い、ソースファイルをコンパイルします。成功すると「クラスファイル」が生成されます。
javac MyProgram.java (コンパイルの実行)
次に、生成されたクラスファイルを「java」というコマンドで実行します。この際、拡張子の「.class」は含めないのがルールです。
java MyProgram (実行の開始)
この操作により、JVMが起動してプログラムが動き出します。この一連の流れがJava開発の基本サイクルとなります。
7. なぜJavaは「中間コード」という形式をとるのか
Javaがソースコードから直接実行ファイルを作らず、一度バイトコード(中間コード)にするのには深い理由があります。それは「セキュリティ」と「最適化」です。
バイトコードは、特定のコンピュータに依存しない形式であるため、JVMが実行前にコードを検証(ベリファイ)することができます。これにより、不正な操作やウイルスのような挙動を未然に防ぐことができるのです。また、JVMには「JIT(Just-In-Time)コンパイラ」という機能が搭載されており、実行中に頻繁に使われるコードを解析して、より高速な機械語へ動的に書き換えることで、パフォーマンスを劇的に向上させています。初期のJavaは遅いと言われていましたが、このJVMの進化により、現在では非常に高速な動作が可能となっています。
変数を使った少し複雑な文字列結合のプログラムを書いてみましょう。こうしたロジックも、すべてバイトコードに変換されて効率的に処理されます。
public class ProfileApp {
public static void main(String[] args) {
String name = "Java太郎";
int age = 20;
String message = name + "さんは" + age + "歳です。";
System.out.println(message);
}
}
Java太郎さんは20歳です。
8. 初心者が知っておきたいJavaのバージョンと選び方
JDKをインストールしようとすると、Java 8, Java 11, Java 17, Java 21など、多くのバージョンが存在することに驚くかもしれません。これはJavaが定期的にアップデートされ、新しい機能が追加されているためです。
初心者が選ぶべきは、LTS(Long Term Support)と呼ばれる長期サポート版です。LTS版は数年間にわたってセキュリティアップデートが提供されるため、安心して学習を進めることができます。現在はJava 17やJava 21が主流となっています。また、JDKの提供元も、Oracle社だけでなく、Amazon(Corretto)やMicrosoft、Eclipse Foundation(Temurin)など様々な団体が無料配布しており、どれを使っても基本的な学習には影響ありません。迷ったら「Eclipse Temurin」や「Amazon Corretto」を選ぶのが一般的で安心です。
9. クラスパスとパッケージの基本概念
Javaの実行を理解する上で、もう一つ重要なのが「クラスパス」と「パッケージ」です。プログラムが大規模になると、ファイルが散らばってしまいます。JVMが「どのフォルダにあるクラスを使えばいいのか」を探すための道しるべがクラスパスです。
また、パッケージはファイルを整理するための「フォルダ分け」のようなものです。同じ名前のクラスがあっても、パッケージが異なれば衝突を避けることができます。例えば、買い物システムの「User」クラスと、管理システムの「User」クラスを分けるといった使い道があります。これは実行時、JVMに対して「どのパッケージのどのクラスを動かすか」を正確に伝えるために不可欠な要素です。
最後に、条件分岐を使った少し実践的なコードを紹介します。これもJavaの基本文法として頻出のパターンです。
public class GradeChecker {
public static void main(String[] args) {
int score = 85;
if (score >= 80) {
System.out.println("判定: 合格です!素晴らしい!");
} else {
System.out.println("判定: 不合格です。次は頑張りましょう。");
}
}
}
判定: 合格です!素晴らしい!
10. Javaを学ぶ上で最も大切な開発環境の整備
ここまで、Javaの仕組みやJDK・JRE・JVMについて解説してきました。理屈を理解することは非常に大切ですが、それと同じくらい「実際にコードを書いて動かす環境」を整えることが、初心者が挫折しないためのポイントです。
最近では、インストーラーを実行するだけでJDKのパス(Path)設定を自動で行ってくれるものが増えており、昔のように環境変数の設定で何時間も悩むことは少なくなりました。まずは自分のパソコンにJDKをインストールし、簡単なコードをコンパイルして動かしてみるという「成功体験」を積み重ねてください。JVMという強力な味方が、あなたの書いたコードを世界中のコンピュータで動かしてくれるのを実感できるはずです。Javaの基礎を固めることで、他の言語を学ぶ際にも役立つ「コンピュータサイエンスの普遍的な知識」が身につきますよ。