Javaプログラムが動くまで:コンパイルの仕組みをやさしく解説

Java入門・実践
スポンサーリンク

Javaを勉強しはじめたばかりの頃、ソースコードは書けたのに「コンパイルしてください」と言われて急に頭が真っ白になったことがあります。

え?今のって「実行」じゃないの?「.java」は書いたんだけど、次は何をどうすれば…?

そんな当時の私のように、「コンパイルって何者?」と感じている方に向けて、この記事ではJavaプログラムが実際に動くまでの流れを、できるだけやさしく解説していきます!

スポンサーリンク
  1. はじめまして、コンパイルさん――最初の違和感を思い出してみるJavaを勉強しはじめた頃、私はこう思いました。
  2. Javaの世界へようこそ――ソースコードって何者?
    1. ソースコードは“人間が書く命令書”
    2. ファイル名とクラス名、なんで揃えないといけないの?
    3. どうしてこんな構成になっているの?
  3. コンパイルって何してるの?――見えないところで頑張る裏方たち
    1. ソースコード → バイトコードの変身ショー
    2. JVMがバイトコードを読む理由
    3. コンパイルで何が起きているの?
    4. 「コンパイルエラー」は怒られているわけじゃない
    5. .class ファイルができたら、いよいよ実行!
  4. はじめての javac――魔法のコマンドに触れてみよう
    1. Javaの準備がまだの方へ:JDKはインストール済み?
    2. コンパイルの基本手順
      1. ステップ1:ファイルを用意
      2. ステップ2:コンパイル
      3. ステップ3:実行
    3. よくあるつまずきと解説
    4. うまくいったら、ちょっとだけ自信をもってください
  5. よくあるエラーと乗り越え方
    1. エラーは敵じゃない、頼れるナビゲーターです
    2. よくあるエラーと対処法まとめ
      1. error: class HelloWorld is public, should be declared in a file named HelloWorld.java
      2. error: cannot find symbol
      3. error: incompatible types
      4. package does not exist
    3. エラーと仲良くなる小さなコツ
  6. ビルドってなに?コンパイルと何が違うのか整理します
    1. ビルドは「調理全部の流れ」、コンパイルは「材料を切る」工程
    2. 手作業が面倒になるタイミング=ビルドツールの出番
    3. 代表的なビルドツールたち
    4. 「ビルド」という言葉にビビらなくてOK
    5. いまはまだ javac だけでも全然OK
  7. 初心者だったころの「?」を振り返るQ&A
    1. Q1:.class ファイルって消してもいいんですか?
    2. Q2:毎回 javac しないといけないんですか?
    3. Q3:なぜ実行は java HelloWorld で .class は書かないの?
    4. Q4:フォルダの中に .class がいっぱいできるのが気になります…
    5. Q5:コンパイルとビルド、結局どっちを覚えればいいの?
    6. おまけ:javac にもショートカット的な使い方がある?
  8. おさらいとこれから――怖がらなくて大丈夫。プログラムって意外と人間っぽい
    1. プログラムも、ちょっとだけ人間っぽい
    2. ここまで学んだことを、もう一度やさしくおさらい
    3. これからのステップへ

はじめまして、コンパイルさん――最初の違和感を思い出してみるJavaを勉強しはじめた頃、私はこう思いました。

「ソースコードを書いたんだから、あとは“実行”ってやれば終わりなんじゃないの?」

ところが実際には、「まずはコンパイルしてください」と、さらっと言われるのです。

え?コンパイル?なにそれ、食べられるんですか?

私にとって“コンパイル”は、「いかにもエンジニアっぽい言葉ランキング第3位(※個人調べ)」にランクインしていました。

なんだか難しそうだし、そもそも“なんのためにやるのか”が分かりませんでした。

たとえばこんな経験、ありませんか?

  • HelloWorld.java を書いたのに、java HelloWorld だけじゃ動かない
  • javac ってコマンドを調べたら、とたんに黒い画面に怯えることに
  • そもそも「このファイル、誰のために書いてるの?」という疑問が湧く

この記事では、そんな初心者のころの「???」を整理するために、Javaプログラムがどうやって動くのかをやさしく解きほぐしていきます。

特に、「コンパイルってなんとなく聞いたことあるけど、仕組みはよく分からない」という方が、「あ、そういうことだったのか!」と思えるような内容を目指しています。

たとえエラーでつまずいたとしても、「それってつまり、プログラムが“ここが変だよ”って教えてくれてるんだな」と少しだけ前向きに思えるようになったら嬉しいです。

次章では、Javaのプログラムがどんな構成になっているのか、そもそも .java ファイルとは何なのかを、一緒に見ていきましょう!

Javaの世界へようこそ――ソースコードって何者?

プログラミング学習のはじめに出てくる定番中の定番、それが HelloWorld.java です。

こんなふうに書きますよね:

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

はじめてこのコードを見たとき、正直ちょっと驚きませんでしたか?

「Helloって言うだけなのに、なんでこんなに文字が多いの?」って。

私も最初は、「もっとシンプルでいいじゃん…」と心の中でつぶやいてました。

ソースコードは“人間が書く命令書”

この .java ファイルがいわゆるソースコードと呼ばれるもので、Javaのプログラムを書くときの“原稿”みたいなものです。

中身は、人間が書けるように工夫された命令文の集まりです。

といっても、Javaのソースコードはとても几帳面です。

たとえば:

  • public class の中に
  • main という特別なメソッドがあり
  • System.out.println() で文字を表示する

……といったように、“お作法”がきっちり決まっています。

「ちょっと堅物なプログラミング言語なんだな」と思ったのが私の第一印象です。

ファイル名とクラス名、なんで揃えないといけないの?

HelloWorld.java というファイルの中には、public class HelloWorld というクラスが定義されています。

ここ、ファイル名とクラス名が同じじゃないとエラーになるって知ってましたか?

これはJavaの「クラスは名前が命」みたいなルールのせいで、 public class TaroDesu にしてしまうと、TaroDesu.java という名前にしないと怒られます。

初心者のころの私は、「それくらいJavaの方で気づいてくれません?」と内心ツッコミを入れていました。

どうしてこんな構成になっているの?

Javaは“オブジェクト指向”という考え方をベースにした言語で、「クラス」という単位がすごく重要です。

そしてこの .java ファイルは、1つのクラスに対応しています。

ちょっと雑な例えをすると、「1つのクラス=1つのレゴブロック」みたいなもの。

いくつかのクラスを組み合わせることで、1つのプログラムが完成します。

このあたりはまだピンとこなくても大丈夫です。

大切なのは、「.java ファイルは人間が書く読みやすい命令書で、Javaプログラムの設計図みたいなものなんだな〜」とざっくりイメージしておくことです。

次の章では、この .java ファイルがどうやって実際に動くのか、つまりコンパイルされて .class になる仕組みについて見ていきましょう。

舞台裏の“変身プロセス”がちょっと楽しくなるかもしれません。

コンパイルって何してるの?――見えないところで頑張る裏方たち

ソースコード(.java)を書いたあとは「はい、実行!」といきたいところですが――

実はその前に、裏でとっても大事な“変身タイム”があるんです。

その名も「コンパイル」。

そう、プログラムがそのままでは動かないのは、まだ人間語で書かれているからなんですね。

ソースコード → バイトコードの変身ショー

Javaのプログラムは、一度「バイトコード」という中間形式に変換されてから実行されます。

この変換をしてくれるのが、javac コマンドでおなじみの Javaコンパイラ です。

たとえるなら、 .java ファイルは「手書きの設計図」、 .class ファイルは「現場の人が読める図面」に変換された状態です。

JVMがバイトコードを読む理由

Javaが面白いのは、“一度バイトコードにしておくことで、どんなコンピューターでも同じように動かせる”という点です。

これは JVM(Java Virtual Machine) という仮想マシンが、.class ファイルを読んで実行してくれるおかげなんですね。

つまり:

ソースコード(.java)→ [コンパイル] → バイトコード(.class)→ [JVMが実行] → 結果が表示される

この「1回変換してから実行」という手順が、ちょっとややこしくもあり、Javaの強みでもあります。

コンパイルで何が起きているの?

javac HelloWorld.java を実行したとき、実はプログラムはこんなことをやってくれています:

  • 文法チェック:「カンマ忘れてない?」「波かっこちゃんと閉じてる?」などを確認
  • 構文解析:コードの意味や構造を読み取る
  • 型チェック:「これは本当にint型?」「呼び出せないメソッドを使ってない?」など
  • バイトコードに変換:.class ファイルを生成

これらすべてが一瞬で行われるのだから、コンパイラさん、実はなかなかの仕事人なんです。

「コンパイルエラー」は怒られているわけじゃない

初心者のころ、javac を使ってエラーが出ると「私、そんなにダメだったの……」としょんぼりしていました。

でも、実はコンパイルエラーは“アドバイス”みたいなものなんです。

「変数の名前がちょっと違うよ」

「メソッドの使い方、ここちょっとおかしくない?」

……といった具合に、プログラムを実行する前に気づかせてくれる親切なメッセージだったんですね。

.class ファイルができたら、いよいよ実行!

無事にコンパイルが終わって .class ファイルができたら、次は java HelloWorld の出番です。

ここでやっと、JVMが登場してプログラムが動きます。

つまり、コンパイルは「プログラムを動かす前の下準備」みたいなイメージ。

ちょっと面倒に見えて、実はすごく大事な工程なんです。

次の章では、いよいよ javac を実際に使ってコンパイルしてみます。

エラーに出会っても怖がらなくて大丈夫。

一緒にひとつひとつ、読み解いていきましょう!

はじめての javac――魔法のコマンドに触れてみよう

さて、ソースコードの役割がだんだん見えてきたところで、いよいよコンパイルの実践編に入っていきましょう。

その主役となるのが、謎に満ちたコマンド――

そう、javac(ジャバック)です。

「Javaをやるなら javac を使う」って聞いたけど、そもそもどこで?どうやって?何を?という状態からのスタートでした、私も。

Javaの準備がまだの方へ:JDKはインストール済み?

まず最初にチェックしたいのが、Javaを動かすための環境、つまり JDK(Java Development Kit) がパソコンに入っているかどうかです。

チェック方法(ターミナルやコマンドプロンプトで)

Bash
javac -version

このようにバージョンが表示されればOKです:

javac 21.0.1

もし「そんなコマンドは知らん」と怒られたら、まだJDKが入っていないか、環境変数が通っていない可能性があります。(それも初心者あるあるです!)

コンパイルの基本手順

では、シンプルな HelloWorld.java を例に、実際にコンパイルしてみましょう。

ステップ1:ファイルを用意

たとえばこんな内容のファイルを作成します:

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

これを HelloWorld.java という名前で保存しましょう。

ファイル名とクラス名(HelloWorld)が同じなのがポイントです。

ステップ2:コンパイル

保存したファイルがある場所で、以下のコマンドを入力します:

Bash
javac HelloWorld.java

エラーがなければ、同じフォルダに HelloWorld.class というファイルが生まれます。

これがバイトコード、つまりJVMが読める形式です。

ステップ3:実行

そして、いよいよ実行コマンドです:

Bash
java HelloWorld

画面に Hello, World! と表示されれば、大成功です!

※拡張子(.class)は実行時には書かないのがJavaの特徴です。間違えて java HelloWorld.class と打つと「それ違うよ」と怒られます。←私はやりました。

よくあるつまずきと解説

  • HelloWorld.java:1: error: class HelloWorld is public, should be declared in a file named HelloWorld.java → ファイル名とクラス名が一致していない場合の定番エラー。落ち着いて見直しましょう。
  • error: cannot find symbol → スペルミス、変数やメソッドの宣言ミス。読み間違いで私もよくやります…。
  • フォルダが深い or パッケージを使っている場合の混乱 → この段階ではまだパッケージを使わず、1ファイルで試すのがおすすめです!

うまくいったら、ちょっとだけ自信をもってください

プログラムが動いたときの、「おぉ!自分で動かせた!」という感覚。

あれは、まさしく魔法を1つ習得したときの気分です。

javac は、一見地味だけど、プログラミングの世界ではとっても頼りになる相棒です。

これから一緒にたくさんの冒険をすることになるでしょう!

次の章では、そんな javac にありがちな「気まぐれ」――つまりエラーやトラブルとの付き合い方について解説していきます。

よくあるエラーと乗り越え方

javac コマンドでいざコンパイル!…

と思いきや、「えっ、動かない」

「赤い文字がたくさん…」という場面に出くわすこと、ありますよね。

私も最初のころ、エラーが出るたびに「もう無理だ…」とメモ帳を閉じて現実逃避していました。

でも大丈夫。コンパイルエラーは“あなたを助けるメッセージ”なんです。

エラーは敵じゃない、頼れるナビゲーターです

まず、エラーとは何かを整理してみましょう。

プログラムを書くとき、人間の書いたコードをコンパイラ(javac)が読み取って、「このままじゃ実行できないよ〜」と教えてくれる。

それがコンパイルエラーです。

つまり、“走る前に靴ひも結び直しておこう”と教えてくれる親切な注意喚起なんですね。

よくあるエラーと対処法まとめ

ここでは初心者の方が特によく遭遇するエラーを、実際のメッセージと一緒に紹介します。

error: class HelloWorld is public, should be declared in a file named HelloWorld.java

原因: クラス名とファイル名が一致していない

どうすれば? Javaでは、public class クラス名 の場合、ファイル名もそのクラス名と同じにする必要があります。

たとえば:

Java
public class HelloWorld { ... }

というコードは、HelloWorld.java というファイル名で保存しないとエラーになります。

error: cannot find symbol

原因: 変数名やメソッド名のスペルミス、定義のし忘れ

よくあるパターン:

Java
System.out.printlnl("Hello"); // ← printlnのlが多い

どうすれば?

  • スペルを見直す(大文字・小文字も!)
  • 宣言した変数が存在しているか確認する

「エラー文の行番号と、そのすぐ上の行もチェックする」のがコツです。

エラーは案外“手前のミス”が原因だったりします。

error: incompatible types

原因: 型が合わない(例:int に String を代入しようとしている)

Java
int number = "abc"; // ← 文字列を数字に代入しようとしている

どうすれば?

  • Javaは型にうるさい言語なので、「数値か?文字列か?」を意識して使い分ける
  • 場合によっては型変換(キャスト)が必要なことも

package does not exist

原因: import 文で書いたパッケージが見つからない

どうすれば?

  • ライブラリが正しくインストールされているか確認
  • .java ファイルの配置が正しいか、クラスパスが通っているか見直す

このへんから「ビルドツール(MavenやGradle)があるとラクになるよ」って話につながっていくのですが、それは次の章でゆっくりお話しします!

エラーと仲良くなる小さなコツ

  • コピペして検索する勇気をもつ  → 公式サイトやStack Overflowで答えが見つかることがよくあります!
  • 英語は“ヒントの宝庫”  → 難しく見えるけれど、“cannot find symbol” は「その記号(変数やメソッド)が見つからない」って言ってるだけです。
  • “あのとき自分がミスした例”をメモする  → 後々「これやったな〜」って振り返れる“成長の記録”になります。

次の章では、そんな「javacの相棒」みたいな存在、ビルドツールとの出会いをお届けします。

「コンパイル」と「ビルド」の違いって?というモヤモヤも、整理していきますね。

ビルドってなに?コンパイルと何が違うのか整理します

「javac でコンパイルして、java で実行する」

……そろそろ慣れてきた頃でしょうか?

でも開発系のブログや記事を読んでいると、急に出てきませんか?

「ビルドしてください」「Gradleビルドで通ればOKです」

……ちょっと待ってください。

“コンパイル”は分かるようになったけど、ビルドってまた別の話?

はい、ここからが第2の壁:ビルドの登場です。

でも大丈夫。そんなに難しい話ではありません。

ビルドは「調理全部の流れ」、コンパイルは「材料を切る」工程

まずざっくり言うと:

用語 何をするかたとえで言うと
コンパイル .java → .class に変換材料を切って下ごしらえ
ビルドコンパイル+実行ファイル作成+依存関係の整理など料理全体を仕上げる

つまり、コンパイルはビルドの一部なんです。

ビルドには他にも以下のような作業が含まれます:

  • 複数の .java ファイルをまとめてコンパイル
  • 外部ライブラリ(jarなど)をダウンロードして準備
  • .jar(Javaアーカイブ)という実行可能ファイルを生成
  • テストコードの自動実行
  • 不要なファイルの削除や圧縮など

手作業が面倒になるタイミング=ビルドツールの出番

最初のうちは1つの .java ファイルを手作業で javac していれば済みます。

でも、クラスが10個、20個と増え、外部ライブラリを使い始めたあたりでこうなります:

「javac の引数長すぎて指つるんですけど…」

「どの順番でコンパイルすれば依存関係うまくいくの…?」

そんなときに登場するのが、ビルドツールです。

代表的なビルドツールたち

ツール名特徴学習しやすさ
Ant古株。手順をXMLで細かく記述中〜上級者向け
Maven設定ファイル(pom.xml)で管理が簡単比較的やさしい
Gradle柔軟・高速。設定はKotlinやGroovyで書ける学ぶ価値あり!



比較的やさしい
Gradle 柔軟・高速。設定はKotlinやGroovyで書ける 学ぶ価値あり!
最近のプロジェクトでは、Gradleが使われることが多いです。Android開発などでは特に定番ですね。

「ビルド」という言葉にビビらなくてOK

「ビルド」と聞くと、急に大規模プロジェクトっぽく聞こえるかもしれませんが、やってることは「準備した素材をきちんと整えて、ひとつの形にまとめること」です。

たとえるなら、 コンパイルが「野菜を切って炒める」、ビルドは「前菜からデザートまで一皿に盛りつけて出す」ような感じです。

いまはまだ javac だけでも全然OK

もちろん最初は javac だけで十分です。むしろ、「手作業でコンパイルする流れ」を知っておくと、後々ビルドツールのありがたみが倍増します。

「今は面倒だけど、将来もっとラクにできる方法がある」という安心感だけ、ポケットに入れておきましょう。

さて、次の章では、そんな「初心者の頃に疑問だったこと」を振り返るQ&Aをまとめてみます。

「.classって消しても大丈夫?」「javac毎回必要?」といった素朴な疑問も、今ならちゃんと答えられるかも。

初心者だったころの「?」を振り返るQ&A

Javaの勉強をはじめたばかりのころ、検索してもなかなかピンとこなかったことや、「今さら聞けない…」と思っていた疑問がいくつもありました。

ここでは、そんな“初学者あるある”なQ&Aを一緒に見ていきましょう!

Q1:.class ファイルって消してもいいんですか?

はい、消しても大丈夫です!

というのも、.class ファイルは .java から作られる“変換後のファイル”なので、また javac で生成できます。

ただし、ビルド済みのファイルをそのまま配布したいときには必要になるので、プロジェクトによってはうっかり消さないように注意しましょう。

Q2:毎回 javac しないといけないんですか?

コードを変更したときは、毎回 javac が必要です。

たとえば .java を修正したのに .class を再生成しないと、古い内容で実行されてしまいます。

「コード直したのに直ってない…!」となるときは、たいてい .class が古いままだったりします。

Q3:なぜ実行は java HelloWorld で .class は書かないの?

良いところに気がつきました!

Javaの実行コマンド java は、クラス名(中のmain()メソッドがあるクラス)だけを指定すればOKなんです。

拡張子 .class はJavaの裏側で補完されるので書かなくて大丈夫。

つまり、

Bash
java HelloWorld    正しい
java HelloWorld.class   エラーになります!

Q4:フォルダの中に .class がいっぱいできるのが気になります…

分かります。

なんだか机の上が散らかっていく感覚になりますよね。

そういうときは、javac -d out のように出力先フォルダを分けるとスッキリします。

Bash
javac -d out HelloWorld.java

こうすると、out フォルダに .class ファイルをまとめて置けるので、気分的にも整頓された感じになります。

Q5:コンパイルとビルド、結局どっちを覚えればいいの?

今はまだ、「javac でコンパイルして java で実行」の流れが分かれば十分です!

プロジェクトが大きくなったり、複数の .java ファイルやライブラリを使い出したころに、「ビルド」という言葉がしっくりくるようになります。

いわば「時間がきたら自然に手を伸ばす」知識なので、今は焦らず、目の前の一歩一歩を大切にしていきましょう。

おまけ:javac にもショートカット的な使い方がある?

はい、たとえばパッケージ構成や複数ファイルのときは、こんな書き方もできます:

Bash
javac -d out src/**/*.java

とくに自動化したいときや、大量ファイルをまとめてコンパイルしたいときに便利です。

でも最初は1ファイルずつ、丁寧に動かしてみるのが一番の学びになります。

おさらいとこれから――怖がらなくて大丈夫。プログラムって意外と人間っぽい

ここまで、Javaのプログラムが「動く」までの裏側を見てきました。

  • .java ファイルという設計図を用意して、
  • javac でコンパイルして .class に変身させて、
  • java コマンドでJVMに読ませる。

この流れを知ったいま、ほんの少しだけ「仕組みがわかるって楽しいかも」と思えてきたのではないでしょうか?

プログラムも、ちょっとだけ人間っぽい

エラーが出たり、型が合わなかったり。

最初の頃は「なんでこんなに厳しいの…」とすねたくもなりましたが、今思えばプログラムって結構“人間っぽい”ところがあります。

  • 「名前が合ってないとダメ」とか
  • 「筋が通っていないと納得しない」とか
  • 「ちょっとした間違いに敏感」とか…

まるで几帳面な友達みたいに、先に問題を教えてくれる頼もしい存在なのかもしれません。

ここまで学んだことを、もう一度やさしくおさらい

  • ソースコード(.java)は人間が読むための命令書
  • コンパイル(javac)はそれを機械が読める形(.class)に変える工程
  • JVMが .class を読んでプログラムを実行
  • エラーは「おかしい部分」を教えてくれるアドバイザー
  • ビルドはもっと複雑な開発をラクにする“まとめ役”

こうしてみると、ちょっとずつパズルのピースがはまってきたような感じがしますよね。

これからのステップへ

もし今、「javac って何してるんだっけ?」と不安になっても、思い出してみてください。

あなたはもう、一度“動かすまでの流れ”を知った人です。

そして、この記事の内容が、未来のあなたが「誰かに教えるとき」や「エラーでつまずいたとき」、そっと背中を押せるお守りのような存在になれたらうれしいです。

decopon
decopon

Javaを学びはじめたころ、「コンパイルって?」「javac って?」と頭に「?」が浮かんでいたあのときの自分に、そっと手を差し伸べるような気持ちでこの記事を書きました。

もしあなたが今、同じようなつまずきに出会っていたとしたら―― この記事が少しでもヒントになったり、「そういうことだったのか!」と安心できる瞬間を届けられていたら、こんなにうれしいことはありません。

プログラミングの学びは、迷って悩んで、時には手を止めたくなることもあるけれど、それを乗り越えるたびに、確実に前に進んでいます。 そして何より、そうした経験のひとつひとつが、未来の誰かを助ける知識になると私は信じています。

コメント

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