ソースコード・コンパイル・実行の全体像
Javaを動かすには、書いた文章を保存する段階、文法や型を調べる段階、命令を実行する段階を区別します。ここでは小さなプログラムを一行ずつ追い、エラーが出たときに直す場所まで判断します。例は通常のクラス起動方式を使います。
この単元で学ぶこと
- ソースファイル、classファイル、JVMの役割を説明できる
- javacとjavaに正しい引数を指定できる
- コンパイルエラーと実行時例外を区別できる
本文解説
プログラムを保存する ソースコードは人が読めるJavaの命令です。public class Mainを宣言する例ではMain.javaという名前で保存します。Javaは大文字と小文字を区別するため、Mainとmainは別の名前です。エディターで保存しただけでは実行は始まりません。
変換する道具と実行する道具 JDKには開発に使うjavacなどが含まれます。javacはソースを解析し、型や文法が正しければJVM用のclassファイルを生成します。JVMはJavaの命令を実行する仕組みで、OSに対応した実装を使用します。classファイルは人が読む元のソースそのものではありません。
最初の実行例 Main.javaに次のコードを保存します。 public class Main { public static void main(String[] args) { int total = 2; total = total + 3; System.out.println(total); } } 同じディレクトリでjavac Main.javaを実行し、成功後にjava -cp . Mainを実行します。画面には5と改行が出ます。-cp .は現在のディレクトリをクラスの検索場所にする指定です。
値を追う int total = 2で整数の変数totalに2を入れます。次の代入は右辺を先に計算するので2 + 3が5になり、その結果でtotalを更新します。printlnは現在の値5を出力します。コンパイル時点でこのprintlnが実行されるわけではありません。
起動の入口 この通常起動方式ではpublic static void main(String[] args)が入口です。publicは外から利用できること、staticはインスタンス生成なしで呼べること、voidは戻り値がないこと、String[]は文字列配列の引数を表します。argsという変数名自体は別名でも構いません。
コンパイル時に止まる例 int count = "3";は整数変数に文字列を直接代入しているので型が合わず、javacで失敗します。int count = 3;へ直して再コンパイルします。以前成功した古いMain.classが残ることがあるため、コンパイル失敗後にjavaだけ実行して表示が出ても、修正したソースが正しい証拠にはなりません。
実行してから止まる例 main内をint n = 0; System.out.println(10 / n);にすると、文法と型は正しいのでコンパイル可能ですが、整数のゼロ除算でArithmeticExceptionが発生します。10 / nの計算が完了しないため、そのprintlnの数値は出ません。コンパイル成功はすべての入力で正常終了する保証ではありません。
引数と検証 System.out.println(args[0]);に変更し、再コンパイル後にjava -cp . Main blueを実行するとblueです。引数なしなら長さ0の配列の要素0を読もうとして例外になります。args.lengthを調べてから読む修正が必要です。例題の動作確認にはJDKのjavacとjavaを使い、エラーの発生段階と出力を別々に記録します。
移植性と起動方式の注意 対応するJavaバージョンのJVMがあればclassファイルを別OSで実行できることがありますが、OS固有のパスや外部ライブラリまで自動修正されるわけではありません。通常のclass起動はjava Mainでありjava Main.classではありません。Java 11以降にはjava Main.javaというソースファイル起動もありますが、これは別の起動方式です。
図解
重要ポイント
- javacは変換、javaは起動。
- 通常起動ではファイル名ではなくクラス名を渡す。
- 型の不一致と実行時のゼロ除算は発生段階が異なる。
- ソースを変えたら再コンパイルし、成功を確かめる。
間違えやすい点
- コンパイル成功を正常終了の保証としない。
- 古いclassファイルの実行を修正成功としない。
- mainの引数名と必要な型・修飾子を混同しない。
用語解説
- ソースコード
- Javaの規則で書いたプログラムの文章。通常.javaへ保存する。
- コンパイル
- ソースを検査し、実行環境用の形式へ変換する処理。
- バイトコード
- JVMが扱う命令形式。classファイルに格納される。
- JVM
- Javaのバイトコードを実行する仮想マシン。
- 実行時例外
- プログラムを実行している間に発生する例外。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。