Javaとは何か:どこで動くのか

はじめの一歩

プログラム|Java入門

Javaとは何か:どこで動くのか

この連載は、プログラムを書いたことがない人が Java を書けるようになるまでを、1回1テーマで進めます。 第1回は、書いたものがどうやって動くのかです。

ここが分かると、あとで出るエラーの意味が取りやすくなります。

図1 書いたものは2段に分けて動きます。間にクラスファイルが挟まります

図1:書いたものは2段に分けて動きます。間にクラスファイルが挟まります。

Java には、書いた文をいきなり動かさないという一段があります。 手間が増えたように見えますが、そのおかげで動かす場所を選ばなくなります。

以下は Windows 11 に JDK 21 を入れ、javac と java がそのまま打てる状態で打った結果です。 行数が多いところは省いたと書き添えます。

まず結論:この章の用語

用語意味
ソースコード人が書いた、プログラムの文そのもの。Java では拡張子 .java のファイルに入れる
拡張子ファイル名のうしろに付く「.java」「.class」のような印。何のファイルかを表す
コンパイル人が書いた文を、機械寄りの形へ翻訳すること
コンパイラコンパイルをする道具。Java のものは javac という名前
バイトコードjavac が作る、人の言葉と機械の言葉のあいだの形
クラスファイルバイトコードが入ったファイル。拡張子は .class
CPU計算をする部品。機械の中でいちばん働いているところ
機械語CPU が直に読む番号の並び。CPU の種類ごとに違う
バイト数を入れる枠1つぶん。0 から 255 までの番号が1つ入る
16進0〜9 と a〜f の16文字で数を書く書き方。41 は10進なら 65
OSWindows や macOS のように、機械ぜんたいを動かしている土台のソフト
JVMJava 仮想マシン。クラスファイルを読んで動かす仕掛けで、OS ごとに用意されている
実行クラスファイルを JVM に読ませて動かすこと。java という道具で始める
クラスプログラムをひとまとまりに入れる箱。class と書いて始める
クラス名class のうしろに書く名前。public を付けたクラスはファイル名とそろえる
main実行がそこから始まる場所。JVM はここを探して動きだす
JDKJava を書いて動かすための道具ひとそろい。javac はここにしか入っていない
JRE動かすためだけの道具の組。Java 8 までは JDK の中に jre というフォルダで入っていた
PATH道具を名前だけで呼べるように、Windows が探しに行くフォルダの一覧
javapクラスファイルの中を読ませる道具。JDK に入っている

この章のゴール
javac と java が何をしているかを言えること。 そして打つ前に用意するものと版のそろえ方が分かることです。

1. 書いた文は、そのままでは動かない

図2 Javaはいちばん下まで翻訳せず、中間の形で止めます

図2:Javaはいちばん下まで翻訳せず、中間の形で止めます。

計算をしているのは CPU という部品です。 CPU が直に読めるのは機械語、番号の並びだけなので、人が書いた文はどこかで翻訳が要ります。

ここで Java が選んだのが、いちばん下まで翻訳しない道です。 人の言葉と機械の言葉の中間まで訳して止め、この形をバイトコードといいます。

残りの1段は動かすときに JVM がやります。 中間の形はどの CPU でも同じ並びなので、最後の1段だけその場に任せます。

2. コンパイル:javac が作るのはクラスファイル

図3 クラスファイルは読み物ではなく、JVMへの指示が並んだものです

図3:クラスファイルは読み物ではなく、JVMへの指示が並んだものです。

人が書いた文(ソースコード)を翻訳する道具をコンパイラといい、Java のものは javac です。 中の意味は第2回でやるので、ここではそのまま写す材料として読んでください。

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

これを Hello.java という名前で保存して javac に渡すと、同じ場所に Hello.class ができます。 拡張子が .class なのでクラスファイルです。

開いても、ほとんどが数の並びです。 先頭の4バイトは16進で ca fe ba be、「これはクラスファイルです」という印です。 続く4バイトが版の欄で、効くのはうしろの2バイトです。 Java 21 のものは 00 00 00 41、うしろの 00 41 は16進なので、10進なら 65 です。

画面に出す文字や名前は字のまま入っていて、Hello, Java! や println は開けば見つかります。 ただ中身は1バイトずつの番号で、人が開いて直すものではありません。

ここで同じ名前が4か所に出ます。 Hello.java、class Hello、Hello.class、java に渡す Hello。 javac にはファイル名、java にはクラス名です。

3. 実行:java が JVM を起こして main から動かす

図4 javaはJVMを起こし、クラスファイルを読んで main から動かします

図4:javaはJVMを起こし、クラスファイルを読んで main から動かします。

できたクラスファイルを動かす道具が java です。 打つと、まず JVM が起きます。 Java 仮想マシンの略で、「仮想」はソフトで作った機械のことです。

起きた JVM はいまいるフォルダから Hello.class を探して読みます。 そして main を見つけ、指示を1つずつ動かします。 println(1行を書き出す命令)まで来ると画面に文字が出ます。

4. 何を入れるか:JDKとJRE

図5 動かすための部分はJDKの中に入っています。迷ったらJDKを入れます

図5:動かすための部分はJDKの中に入っています。迷ったらJDKを入れます。

JDK は、Java を書いて動かすための道具ひとそろいです。 javac は JDK にしか入っていません。 手を動かす人は JDK を入れてください。

動かすための部分(java と JVM、出来合いの部品)も JDK の中です。 Java 8 までは、それが jre という別のフォルダとして見えていて、JRE 単体でも配られていました。 Java 9 以降は分かれていないので、JDK 21 に jre というフォルダはありません。

5. 打つ場所を作る:ファイルと黒い画面

図6 JDKを入れて、.javaのファイルを作り、そのフォルダで黒い画面を開きます

図6:JDKを入れて、.javaのファイルを作り、そのフォルダで黒い画面を開きます。

① JDK 21 を入れる。 Eclipse Adoptium が配る Temurin 21 の Windows 用インストーラを使い、途中の「PATH に加える」は入にします。 ② Hello.java を作る。 文字が打てる道具で先ほどの5行を書き、名前を Hello.java にします。 ③ そのフォルダで黒い画面を開く。 Hello.java を置いたフォルダのアドレス欄に cmd と打って Enter を押すと、そこで始まる黒い画面(コマンドプロンプト)が出ます。

つまずきやすいのは拡張子です。 メモ帳の保存画面は[ファイルの種類]が「テキスト文書」なので、そのまま保存すると Hello.java.txt になります。 [すべてのファイル]に変えてから保存してください。 Windows は拡張子を隠す設定が既定なので、付いても画面には出ません。 エクスプローラーの[表示]→[表示]→[ファイル名拡張子]にチェックを入れておきます。

写しの先頭の > は「ここから打つ」という印で、> そのものは打ちません。

6. 版をそろえる:打つ前に両方を見る

図7 クラスファイルには版があり、古いJVMは新しい版を読めません

図7:クラスファイルには版があり、古いJVMは新しい版を読めません。

1台に新旧の Java があると、javac は新しく java は古いという組み合わせが起こります。 打つ前に両方の版を見てください。 java -version は3行出るので、1行目だけ載せます。

> javac -version
javac 21.0.12
> java -version
openjdk version "21.0.12" 2026-07-21 LTS

どちらも 21 なら、そのまま進めます。 合っていないときは、PATH の先にあるほうが効いています。 Windows の[環境変数]で Path を開き、JDK 21 の bin(道具が入っているフォルダ)をほかの Java より上へ動かしてください。 直したら黒い画面を閉じて、開き直します。

版を合わせないまま打つと、こうなります。 下に13行の内訳が続きますが、この1行だけで足ります。

Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 52.0

大事なのは数字2つだけ。 class file version 65.0 が作った側の版、up to 52.0 が動かす側の上限で、65 のほうが大きいから読めません。 止まるのはクラスファイルを読むところで、中の処理は1つも動きません。

版の番号は Java の番号に 44 を足した数です。 Java 8 なら 52、Java 21 なら 65。 困ったら、まず両方の番号をくらべます。

7. 実際に打ってみる

図8 コンパイルが通ると何も出ません。そのかわりフォルダにファイルが増えます

図8:コンパイルが通ると何も出ません。そのかわりフォルダにファイルが増えます。

両方 21 になったら、Hello.java を置いたフォルダで2回打ちます。

> javac Hello.java
> java Hello
Hello, Java!

1行目のあとに何も出ていないのが分かるでしょうか。 javac が文を返すのは、直すところがあるときと、気をつけることがあるときだけです。 静かなのはうまくいった合図です。

変わったのはフォルダの中身です。 Hello.java だけだったところに Hello.class が増えています。

写したときは3つだけたしかめます。 字下げが全角スペースになっていないか。 ‘\u3000’は不正な文字です と出たらこれです。 行末のセミコロンが落ちていないか。 そして Hello の大文字小文字。 java hello と打つと (wrong name: Hello) と返ります。

8. つまずきどころ:道具と、渡すもの

図9 打った文字と、出てくる文に出ている名前を見比べます

図9:打った文字と、出てくる文に出ている名前を見比べます。

よく出る4つを、わざと出しました。 1つ目は出た2行をそのまま並べます。 java の2つはうしろの1行だけ、最後の javac は1行目だけを並べます。

> javac Hello.java
'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> java Hello
原因: java.lang.ClassNotFoundException: Hello
> java Hello.class
原因: java.lang.ClassNotFoundException: Hello.class
> javac Hello
エラー: クラス名'Hello'が受け入れられるのは、注釈処理が明示的にリクエストされた場合のみです

1つ目は PATH が通っていないときで、javac そのものが見つかっていません。 2つ目は読むものがまだ無い場合、3つ目と4つ目は渡すものを取りちがえた場合です。 「注釈処理」は、いまは気にしなくてよい言葉です。

javac にはファイル名、java にはクラス名。 入れ替わっているだけのことが多いので、まず打った文字を見直してください。

9. なぜ動かす場所を選ばないのか

図10 同じクラスファイルを、OSごとに用意されたJVMが動かします

図10:同じクラスファイルを、OSごとに用意されたJVMが動かします。

私たちが作るのはクラスファイル1つ。 読んで動かす JVM のほうが、Windows 用・macOS 用・Linux 用と用意されています。 たいていの違いは JVM が引き受けてくれます。

図11 機械の言葉まで翻訳すると、OSの数だけ作り直すことになります

図11:機械の言葉まで翻訳すると、OSの数だけ作り直すことになります。

世の中には機械の言葉まで翻訳してしまう言語もあります。 C言語などがそうで、3つの環境で動かすなら作る側が3回翻訳します。 枝分かれが作るときに来ます。

Java では枝分かれが動かすときに来ます。 JVM は動かす側にすでにあるもので、私たちが作るものではありません。

確認問題

問1 Hello.java を javac に渡したときにできるファイルはどれか。
ア Hello.java
イ Hello.class
ウ Hello.exe
エ Hello.txt

答え:イ
javac が作るのはクラスファイルで、拡張子は .class です。 アは javac に渡したほうのファイル、ウはその場で動かせる形、エはただの文書です。

問2 javac Hello.java を通したあと、画面へ文字を出すために打つものはどれか。
ア java Hello.class
イ java Hello
ウ java hello
エ javac Hello

答え:イ
java に渡すのはクラス名だけで、.class は付けません。 アは付けた場合、ウは大文字小文字の間違い、エは javac 側の間違いです。

問3 javac 21 で作ったクラスファイルを Java 8 で動かした。 出てきた文に含まれる2つの数の組はどれか。
ア 版は52で、上限は65
イ 版は65で、上限は52
ウ 版は21で、上限は8
エ 版は65で、上限は65

答え:イ
版の番号は Java の番号に 44 を足した数なので、21 は 65、8 は 52 です。 アは2つが逆、ウは足していない数、エは動く組です。

まとめ

図12 作るのはjavac、読んで動かすのはJVM。名前をそろえるのは私たちです

図12:作るのはjavac、読んで動かすのはJVM。名前をそろえるのは私たちです。

道のりは7つの手順でした。 止まったらいまどの手順かを先に決めます。

持って帰るのは3つ。 javac で作り、java で動かす。 javac にはファイル名、java にはクラス名。 そして JVM が間に入るから、動かす場所を選ばない。

ここまでは、写した5行を動かしてみただけです。 次回は「最初のプログラム:画面に文字を出す」。 同じ5行を、1行ずつ意味を付けながら自分で組み立て直します。

タイトルとURLをコピーしました