最新GUIツールで基礎から学べる
連載:いまから始めるJava入門(2)
Javaってどうやって動くの?
たけぞう
2000/10/10
(2) Javaプログラムが動くしくみ |
今回作ったプログラムを実行するには、前回同様、コマンドラインから次のようなコマンドを実行すればよいはずです。
|
さて…これを見て、いろいろ疑問に思われる方も多いと思います。
- 実際は「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クラスとは、次のようなメソッドを持っているクラスのことだと思ってもらって良いでしょう。
|
これを一般にmainメソッドと呼びます。CやC++のmain関数と同じ役割を持っている、と考えてもらって構いません。Javaの仮想マシンは、引数に渡されたクラスの中からこのメソッドを探し出し、実行します。
C/C++のmain関数と違うのは、mainメソッドを持ったクラスがいくつあってもよいことです。(C/C++ではエラーになります) これを試すために、さっきのエディタのプログラムに、ちょっとしたイタズラをしてみます。
まず、「EditorFrame.java」の冒頭に、
|
の一行を加えます(今回のサンプルを作る最初に、プロジェクトファイルを前回の“Hello World”プログラムと同じディレクトリにしたのは、実はこれをできるようにしたかったからです)。
次に、ツールバーの3つ目のボタン(本来はヘルプを表示するためのボタン)が押されたときのコードを、次のように記述します。
|
これで、コマンドプロンプトからエディタプログラムを実行させて、上記のボタンを押して見てください。なんと、前回作った“Hello World”プログラムが起動してしまいます。
(画面をクリックすると拡大します)
|
(注)JBuilder上で実行させようとすると、mainメソッドが2つあることをJBuilderがチェックして、「どのAppricationクラス(のmainメソッド)を実行させるのか」を聞いてきます。この場合、ちゃんと「EditorApp」を指定してやれば同様の動作をさせることができます。
パッケージはクラスを管理する単位 |
最後に、「パッケージ」とは何か、簡単に説明します。
今までのプログラムは、1つのファイルにズラズラとコードをまとめてしまってもOKでした。…しかしJavaでは、先ほども述べましたが、クラス毎に必ずファイルが分割される仕組みになっています。もし複数のプログラムを同時に作っていた場合、下手をするとファイルがまぜこぜになってしまいかねません。ファイル名=クラス名ですので、プログラム同士でクラス名が衝突した場合も困った事になります。
そこでJavaでは、アプリケーションごと、あるいはライブラリごとにディレクトリを分けて、ディレクトリ単位でクラスファイルをまとめる事にしました。これが「パッケージ」の考え方です。
クラスがどこかのパッケージに属している場合、一番最初に「package」というキーワードでパッケージ名が宣言されています。例えば、「EditorFrame.java」の冒頭には、
|
と書かれています。
そして、他のパッケージにあるクラスを呼び出したい場合に、先ほどから何度か出ている「import」というキーワードを用います。さっきのイタズラで、「EditorFrame.java」の中に「import hello.*;」と書いたのは、「HelloWorldApp」クラスが「hello」パッケージに入っているからです。
それでは、今回はこの辺にいたしましょう。「パッケージ」については、次回でもまた触れる予定です。
Index | |
第2回 Javaってどうやって動くの? | |
(1)
テキストエディタを作ろう! ウィザードで下準備 テキスト編集エリアを貼りつける メニューを追加する 「新規作成」メニューで編集エリアをクリアする ファイルを開く・保存する機能を追加する |
|
(2) Javaプログラムが動くしくみ Java Virtual Machine .java ファイルと .class ファイル Java仮想マシンが起動するのはmainメソッド パッケージはクラスを管理する単位 |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|