トップ / カリキュラム / 第2章

CHAPTER 02

Javaが動く仕組み

人が書いたJavaのプログラムは、どうやってパソコンやサーバーで動くのか。「コンパイル」「JVM」「JDK」といった言葉を、1本の流れとして理解します。

読む目安:約20分JVM・JDK・「一度書けばどこでも動く」

この章でわかること

  1. ソースコード → コンパイル → JVMで実行、という流れを図で説明できる
  2. 「一度書けば、どこでも動く」が成り立つ理由を言える
  3. JDK・JRE・JVMの違いと、「Javaをインストールする」の意味がわかる

プログラムが「動く」とはどういうことか

コンピューターは、人間の言葉はもちろん、Javaのような「人間寄りの言語」もそのままでは理解できません。コンピューターが直接理解できるのは、0と1の並びで表される機械語だけです。

そこで、人が書いたプログラムを機械語に「翻訳」する工程が必要になります。この翻訳のやり方が言語によって異なり、Javaの大きな特徴はまさにこの翻訳の仕組みにあります。

Javaプログラムが動くまでの3ステップ

① ソースコード人が書いたファイル
Hello.java
→
② コンパイル「バイトコード」に翻訳
Hello.class
→
③ JVMが実行各OS向けの機械語に
その場で変換して動かす
ポイント:Javaは「いきなり機械語」にはしません。いったんバイトコードという中間の形に翻訳し、それをJVMという通訳役が、動かす環境に合わせて最終的な機械語に変換します。この「二段構え」がJavaの肝です。

① ソースコード:人が書いた設計図

エンジニアがテキストエディタやIDE(開発ツール)で書く、人間が読めるプログラムの文章です。ファイル名の末尾は .java になります。第3章以降で実際に読んでいくのは、このソースコードです。

② コンパイル:中間言語への翻訳

コンパイルとは、ソースコードを機械寄りの形に翻訳する作業で、これを行うソフトをコンパイラと呼びます。Javaのコンパイラ(javac という名前です)は、ソースコードをバイトコードという形式に変換し、.class という末尾のファイルを作ります。

このときコンパイラは、文法の間違いや「存在しない部品を呼んでいる」といったミスを見つけてエラーを出します。つまりコンパイルは翻訳であると同時に、最初の検査でもあります。「コンパイルエラーが出ている」とエンジニアが言ったら、「書き方に不備があって翻訳が通らない状態」という意味です。

③ JVM:どこでも動かす通訳役

JVM(Java Virtual Machine、Java仮想マシン)は、バイトコードを受け取って実際に動かすソフトウェアです。Windows用のJVM、Mac用のJVM、Linux用のJVMがそれぞれ用意されていて、どのJVMも同じバイトコードを受け付けます。

だから、エンジニアがMacで作ったプログラムを、そのままLinuxのサーバーに置いて動かせるのです。これがJavaの有名なキャッチフレーズ「Write once, run anywhere(一度書けば、どこでも動く)」の正体です。

同じバイトコード(.class ファイル)
Windows用JVM社員のPCで動く
Mac用JVM開発者のMacで動く
Linux用JVM本番サーバーで動く
たとえ:日本語の文書(バイトコード)を、英語圏・フランス語圏・中国語圏に送るとき、現地にそれぞれ通訳(JVM)がいれば文書は1種類で済みます。通訳がOSごとに用意されているので、文書を書く側は相手の言語を気にしなくてよいのです。

「仮想マシン」という言葉について

JVMの「仮想マシン」は、「ソフトウェアで作られた、架空のコンピューター」という意味です。バイトコードは、この架空のコンピューター向けに書かれています。実在のコンピューターの違いは、この架空コンピューターの中で吸収されます。クラウドの「仮想サーバー」とは別の話なので、混同しないようにしましょう。

JDK・JRE・JVM:似た言葉の整理

Javaの話題では、JVMのほかに「JDK」「JRE」という言葉も出てきます。入れ子の関係になっていると考えると整理しやすいです。

JDK(Java Development Kit)=開発一式プログラムを「作る」人が入れる。コンパイラ(javac)など開発用の道具 + 下のJREを含む
JRE(Java Runtime Environment)=実行環境プログラムを「動かす」だけなら本来これで足りる。標準の部品(ライブラリ) + 下のJVMを含む
JVM(Java Virtual Machine)=実行エンジンバイトコードを実際に動かす中核
実務での使われ方:「サーバーにJavaを入れる」「JDK 21を入れる」と言ったら、この一式をインストールすることを指します。近年は「JREだけ」を単体で配ることが減り、動かすだけのサーバーにもJDKを入れることが一般的です。会話では JDK ≒ 「Java本体」 と思って差し支えありません。

「標準ライブラリ」という大きな財産

JDKには、JVMのほかに標準ライブラリと呼ばれる部品集が最初から入っています。ライブラリとは「よく使う機能をあらかじめ作っておいたもの」で、たとえば次のようなものです。

  • 文字列の加工(大文字にする、区切る、置き換える)
  • 日付と時刻の計算(月末を求める、営業日を数える)
  • ファイルの読み書き、ネットワーク通信
  • 並べ替え、集計、重複の除去などのデータ操作
  • 精密な金額計算(BigDecimal、第4章で登場)

第3章で見る System.out.println(画面に文字を出す命令)も、この標準ライブラリの一部です。エンジニアはこれらを組み合わせて業務の処理を組み立てます。

速いのか、遅いのか

「通訳が間にいるなら遅いのでは?」と思うかもしれません。たしかにJavaが登場した1990年代はそう言われていました。しかし現在のJVMにはJITコンパイラ(Just-In-Time、実行時コンパイラ)という仕組みがあり、何度も実行される部分を見つけてはその場で機械語に変換し、覚えておきます。その結果、長時間動き続けるサーバーのプログラムでは、他の言語と比べても遜色のない速度が出ます。

一方で、起動した直後はまだ「学習」が済んでいないため、立ち上がりに少し時間がかかります。「Javaのアプリは起動が遅い」と言われるのはこのためで、長く動かすサーバー用途では問題になりにくく、頻繁に起動・終了する用途では気になる、という性質があります。

メモリとガベージコレクション

JVMには、使い終わったメモリを自動で片付けるガベージコレクション(GC)という仕組みがあります。他のいくつかの言語ではプログラマーが手作業でメモリを片付ける必要があり、それを忘れるとメモリ不足で停止する事故が起きがちでした。Javaではこれが自動化されているため、業務システムの安定性に貢献しています。運用の場で「GCで一瞬止まる」「ヒープ(メモリ領域)を増やす」といった言葉が出てきたら、この仕組みの話です。

この章のまとめ

  • Javaのプログラムは「ソースコード → コンパイル(バイトコードに翻訳) → JVMが実行」の3ステップで動く
  • バイトコードはOSに依存せず、OSごとのJVMが通訳するので「一度書けば、どこでも動く」
  • JDK(開発一式)⊃ JRE(実行環境)⊃ JVM(実行エンジン)。「Javaを入れる」はふつうJDKを入れること
  • 標準ライブラリ、JITコンパイラ、ガベージコレクションが、Javaの生産性・速度・安定性を支えている

確認クイズ

この章の内容を3問で確かめましょう。選ぶとすぐに解説が表示されます。

Q1. Javaのプログラムが「一度書けば、どこでも動く」と言われる直接の理由はどれですか?

中間形式のバイトコードと、OSごとに用意されたJVMの組み合わせがポイントです。ソースコードそのものをOSが直接読むわけではありません。

Q2. エンジニアが「コンパイルエラーが出ています」と言いました。どういう状態ですか?

コンパイルは翻訳と同時に最初の検査でもあります。文法の誤りや存在しない部品の参照などがあると、ここで止まります。

Q3. JDK・JRE・JVMの関係として正しいものはどれですか?

入れ子の関係です。開発者はJDKを、動かすだけなら本来JREで足りますが、現在は動かすだけのサーバーにもJDKを入れるのが一般的です。

読み終えたら、読了にしておきましょう。トップページのカリキュラムに記録が付きます(このブラウザ内だけに保存されます)。