最新GUIツールで基礎から学べる
連載:いまから始めるJava入門(2)

Javaってどうやって動くの?

たけぞう
2000/10/10

 

 (2) Javaプログラムが動くしくみ

 今回作ったプログラムを実行するには、前回同様、コマンドラインから次のようなコマンドを実行すればよいはずです。

java -classpath classes editor.EditorApp

 さて…これを見て、いろいろ疑問に思われる方も多いと思います。

  • 実際は「EditorFrame.java」ばかりいじっていたはずなのに、どうして「EditorApp」クラスを使うのか? そもそも、「Applicationクラス」って何なのか?
  • クラス名の前に、なぜパッケージ名「editor」をくっつけるのか? そもそも「パッケージ」とは何なのか?

 この疑問に答える前に、まずJavaプログラムがどのようにして動くのか、説明しなければなりません。少しのあいだ、お付き合い下さい。

   Java Virtual Machine

  普通のプログラミング言語、例えばCやC++で書いたプログラムは、コンパイラによって、コンピュータが直接理解できる命令(マシン語、などと呼ばれます)に変換され、OSによって直接実行されます。

 これに対して、Javaは、プログラムとコンピュータ・OSとの間にJava Virtual Machine(JVM)という、仮想のコンピュータをシミュレートする、特別なプログラム(仮想マシン)を仲介させます。Javaプログラムのコンパイルは、普通のプログラムと違い、この仮想マシンが理解できるマシン語(純粋なマシン語ではないので、普通はJavaバイナリコード、あるいは単純にバイナリコード、と呼びます)に変換されます。

 仮想マシンはバイナリコードを読み込み、実際のマシン語(バイナリコードに対してネイティブコードとも呼びます)に変換させてやることで、Javaプログラムを動かします。ちょうど、下の図のような感じになります。

 プログラムを実行させるのにいちいち仮想マシンが仲介するので、当然ながら実行速度は遅くなってしまいます。しかし、メリットも当然あるのです。

 1つ目は、プログラムをOS非依存にできることです。仮想マシンが動く環境なら、WindowsだろうがLinuxだろうが、同じプログラムをそのまま動かすことができます。移植するために、いちいちソースコードを書き直す必要がありません。

(注)ちなみに、Javaアプレットを動かすために、Internet ExplorerやNetscape Navigatorなどのブラウザの中には独自の仮想マシンが入っています。将来iモード(NTTドコモ)上でJavaプログラムが動作するようになるそうですが、これもつまり、iモードの中に仮想マシンが組み込まれる事を意味しています。

 2つ目は、プログラムが直接OSを操作しないので、プログラムが変な動作を起こしても、OSや他のプログラムの動作に影響が及ばないことです。特にJavaの仮想マシンは、プログラムの動作をチェックする強力な機構を備えていますので、そう簡単にプログラムが悪さをすることができないようになっています。

 インターネット・イントラネット向けの分散アプリケーションを開発するのに、Javaが注目されている理由が、ここからも分かりますね。

   .javaファイルと.classファイル

 はてさて。ここまでのリクツが、実際にどう実現されているのか、見てみましょう。
 前回作った“Hello World”プログラム(アーカイブはこちら)を見てください。「src」ディレクトリと「classes」ディレクトリがある事、それぞれにソースファイルと、コンパイル後にできるクラスファイルがある事は、すでに前回説明しました。

 もう少し詳しく見てみましょう。「src」「classes」の各ディレクトリ内は、次のような構成になっているはずです。

 

 これを見れば分かっていただけるでしょう。「(クラス名).java」というファイルがソースコードであり、「(クラス名).class」がクラスファイルになります。Javaのコンパイラは、「〜.java」と言うファイルを「〜.class」に変換します。この際、ファイル名の拡張子を除いた部分はクラス名と必ず等しくなります。

(注)C++など、他のオブジェクト指向言語を扱った事のある方は、もう1つの点に着目されるでしょう。Javaでは、原則として1つのクラスにつき1ファイルです。

 そして、Javaプログラムを実行させる際に用いる「java」というコマンドは、まさしくJavaの仮想マシンを起動させるコマンドだったのです。コマンドライン引数には、実行させたいクラス(この場合は「HelloWorldApp」クラス)を指定します。すると、起動した仮想マシンはそのまま「HelloWorldApp」クラスを起動する仕組みになっています。

   Javaの仮想マシンが起動するのはmainメソッド

 しかし、仮想マシンがどんなクラスでも実行させられるわけではなく、「Applicationクラス」でなくてはなりません。では、「Applicationクラス」とは一体何なのでしょうか?厳密な定義ではありませんが(注:「Applicationクラス」という呼び名はJBuilder特有のものです)、Applicationクラスとは、次のようなメソッドを持っているクラスのことだと思ってもらって良いでしょう。

public static void main(String args[]);

 これを一般にmainメソッドと呼びます。CやC++のmain関数と同じ役割を持っている、と考えてもらって構いません。Javaの仮想マシンは、引数に渡されたクラスの中からこのメソッドを探し出し、実行します。

 C/C++のmain関数と違うのは、mainメソッドを持ったクラスがいくつあってもよいことです。(C/C++ではエラーになります) これを試すために、さっきのエディタのプログラムに、ちょっとしたイタズラをしてみます。

 まず、「EditorFrame.java」の冒頭に、

import hello.*;

の一行を加えます(今回のサンプルを作る最初に、プロジェクトファイルを前回の“Hello World”プログラムと同じディレクトリにしたのは、実はこれをできるようにしたかったからです)。

 次に、ツールバーの3つ目のボタン(本来はヘルプを表示するためのボタン)が押されたときのコードを、次のように記述します。

void jButton3_actionPerformed(ActionEvent e) {
 HelloWorldApp.main(null);
}

 これで、コマンドプロンプトからエディタプログラムを実行させて、上記のボタンを押して見てください。なんと、前回作った“Hello World”プログラムが起動してしまいます。

(画面をクリックすると拡大します)

(注)JBuilder上で実行させようとすると、mainメソッドが2つあることをJBuilderがチェックして、「どのAppricationクラス(のmainメソッド)を実行させるのか」を聞いてきます。この場合、ちゃんと「EditorApp」を指定してやれば同様の動作をさせることができます。

 

 パッケージはクラスを管理する単位

 最後に、「パッケージ」とは何か、簡単に説明します。

 今までのプログラムは、1つのファイルにズラズラとコードをまとめてしまってもOKでした。…しかしJavaでは、先ほども述べましたが、クラス毎に必ずファイルが分割される仕組みになっています。もし複数のプログラムを同時に作っていた場合、下手をするとファイルがまぜこぜになってしまいかねません。ファイル名=クラス名ですので、プログラム同士でクラス名が衝突した場合も困った事になります。

 そこでJavaでは、アプリケーションごと、あるいはライブラリごとにディレクトリを分けて、ディレクトリ単位でクラスファイルをまとめる事にしました。これが「パッケージ」の考え方です。

 クラスがどこかのパッケージに属している場合、一番最初に「package」というキーワードでパッケージ名が宣言されています。例えば、「EditorFrame.java」の冒頭には、

package editor;

と書かれています。

 そして、他のパッケージにあるクラスを呼び出したい場合に、先ほどから何度か出ている「import」というキーワードを用います。さっきのイタズラで、「EditorFrame.java」の中に「import hello.*;」と書いたのは、「HelloWorldApp」クラスが「hello」パッケージに入っているからです。

 それでは、今回はこの辺にいたしましょう。「パッケージ」については、次回でもまた触れる予定です。

 

Index
第2回 Javaってどうやって動くの?
  (1) テキストエディタを作ろう!
 ウィザードで下準備
 テキスト編集エリアを貼りつける
 メニューを追加する
 「新規作成」メニューで編集エリアをクリアする
 ファイルを開く・保存する機能を追加する
(2) Javaプログラムが動くしくみ
 Java Virtual Machine
 .java ファイルと .class ファイル
 Java仮想マシンが起動するのはmainメソッド
 パッケージはクラスを管理する単位
 


連載記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間