OSやアーキテクチャの違いを乗り越えるアプリケーションの実行環境として誕生したJavaは、いまや大規模システムから携帯電話まで、さまざまな分野でアプリケーションを開発し、実行する環境として使われています。そんな状況を反映して、書店にはたくさんの「Java入門」があふれています。
ひとくちにJavaと言っても、学ぶ範囲は非常に広く、クライアントのJavaアプリケーションから、サーバサイドアプリケーション、携帯電話をはじめとする組み込みアプリケーションまであります。本連載が対象とする読者は、これからサーバサイドJavaで開発を行うが、Java言語をまだ学んだことがないエンジニアです。Java言語の文法や、オブジェクト指向ならではのプログラム構造などを解説し、サーバサイドJavaの学習要素であるServletやJSPを学べる段階まで読者を引き上げることを目的としています。
学習の流れですが、まずはJava2 SDKを使ったスタンドアロンのJavaアプリケーションを学びながら、従来からの言語であるVisual BasicやCOBOLとは違うプログラミングの作法を習得してください。Javaの基本がしっかりしたところで、いよいいよサーバサイドJavaで開発を行うためのJ2EE(Java 2 Enterprise Edition)の入り口を説明します。そこまで来れば、本フォーラムのサーバサイドJavaの入門記事がすらすら読めるようになっているはずです。
本連載は忙しいエンジニアの皆さんが空いた時間で学習できることを目指していますので、1回の解説はできるだけシンプルにしています。今回は、学習の準備としてJavaの開発環境の構築と、コンピュータ言語学習の決まり事である「Hello World!」の実行までを説明します。
Javaに限らず、ソースファイルから実行可能なファイル形式を作成するためには、ソースファイルを編集するためのテキストエディタ、ソースファイルを変換して機械が実行できるコードに変換するコンパイラやインタプリタなどのプログラムが必要です。
ソースファイルとは、
if ( hostname.equals("localhost") ) |
のように、人間が記述して理解できるテキストファイルのことです。一方、機械が実行できるコードとは、
C0 74 0D 83 7B 04 0D 75
07 B2 01 E8 94 69 FE FF |
のように、人間には何のことだが分からないバイナリファイルのことです。実行コードはCPUが解釈して実行するためのものですので、人間が直接書くには無理があります。そこで、コンパイラやインタプリタといわれるプログラムを使って、ソースファイルを実行コードに変換するわけです。では、コンパイラとインタプリタの違いは何でしょうか?
コンパイラ(compile:辞書などを編さんする)とは、個々のソースファイルを実行可能な形式のファイルに変換するためのプログラムのことです。プログラムを実行する前にソースファイルを実行可能な形式のファイルに変換します。C/C++などのコンピュータ言語がコンパイラ方式を採用しています。ソースファイルはコンパイラによってCPUが理解できる形式のファイルに変換されるので、速度が速く、ファイル単体で実行できるのがメリットです。しかし、CPUやOSの種類が異なるマシンでは、あらためてソースファイルを実行可能な形式のファイルに変換しないと実行できません。
一方、インタプリタ(interpret:通訳する)の役割は、実行時にソースファイルを逐一解釈して、CPUに処理させることです。JavaScriptのようなスクリプト言語の多くはインタプリタ方式のコンピュータ言語です。ソースファイルは、コンパイラによって実行可能な形式のファイルに変換されるのではなく、ソースファイルのままインタプリタによって解釈されて実行されます。インタプリタが解釈する手間がかかる分、速度は遅くなりますが、インタプリタさえあればCPUやOSの種類が異なるマシンでも実行できるメリットがあります。
Javaはコンパイラ型のコンピュータ言語ですが、JavaのコンパイラはソースファイルをCPUが実行可能な形式のファイルには変換しません。Javaのコンパイラはソースファイルを「中間コード」に変換するのが仕事です。中間コードとは、ソースファイルにある文法的なエラーを取り除き、ソースファイルを機械が理解しやすいように加工したものです。例えば、上記のソースファイルを次のように変換したとします。
01 02 03 "localhost"
04 05 |
「01」は「if」、「02」は変数hostname、「03」は関数equals()、「04」は関数accept()、「05」は関数reject()を表すと決めておけば、実行時に「if」が「ig」にミスタイプしていないか、文の終わりの「;」を入力し忘れていないかといったエラーチェックを省略できます。CPUが理解できる実行形式のファイルではないけれども、ソースファイルよりは実行形式のファイルに近いので「中間コード」と呼ぶわけです。
しかし、中間コードのままではCPUが理解できません。そこでJavaは、中間コードを解釈してCPUに実行させる仕組みとして「バーチャルマシン」という方式を使っています。Javaのバーチャルマシンとは、Javaのコンパイラが生成した中間コードを理解できる仮想的なマシンのことです。インタプリタがソースファイルを解釈して実行するのに対して、Javaのバーチャルマシンは中間コードをあたかも実行コードとして理解して実行するプログラムのことです。従って、CPUやOSの種類ごとにバーチャルマシンを用意すれば、WindowsでもMacintoshでも、同じ中間コードでプログラムを実行できるわけです。
コンパイラ型 | インタプリタ型 | Java | |
---|---|---|---|
人間が記述するもの | ソースファイル | ソースファイル | ソースファイル |
機械が解釈するもの | 実行コード | ソースファイル | 中間コード |
実行までのプロセス | コンパイラがソースファイルを実行コードに変換し、CPUが実行コードを実行する | インタプリタがソースファイルを解釈し、あらかじめ用意されたどの実行コードを呼び出すのか判断してCPUに実行させる | コンパイラがソースファイルを中間コードに変換し、バーチャルマシンが実行する(バーチャルマシンがあらかじめ用意されたどの実行コードを呼び出すのか判断してCPUに実行させる) |
コンパイラ型、インタプリタ型とJavaの違い |
以上見てきたように、ソースファイルを解釈してCPUが実行するまでの方法はいろいろあります。このように、実行可能なファイルを作成するためのプログラムをまとめて「開発環境」とか「処理系」(ただし「処理系」は実行する環境という意味の方が強い)といったりします。Javaの場合、この開発環境を「Java 2 SDK」と呼びます。
Java 2 SDK
SDKとは「Software Development Kit」の略で、Java 2 SDKには、Javaのコンパイラとコンパイラが生成するコードを解釈して実行するJava VM(Virtual Machine)などが含まれます。
ちなみに、Java 2 SDKの「2」は、Javaのバージョン2という意味です。「Java Development Kit 1.2.1_004」以前の開発環境を「Java Development Kit」、「Java 2 SDK 1.2.2_004」以降の開発環境を「Java 2 SDK」と総称します。Javaの開発環境を「JDK」と呼ぶことがあるのは、古い時代の名残です。なお、現在の最新バージョンの正式名称は「Java 2 Platform, Standard Edition バージョン 1.4.1」です。
さて、実際にJavaでプログラミングを行う環境を構築してみましょう。ほとんどの読者はWindowsを使っていると思いますので、本連載ではWindowsでJavaを開発するための環境を構築する方法を説明します。
本連載で使用する環境
OS:Windows XP Professional
JDK:Java2 SDK, Standard Edition 1.4.1
Java 2 SDKのインストーラはサン・マイクロシステムズのWebサイトからダウンロードできます(http://java.sun.com/j2se/downloads.html)。原稿執筆時の最新バージョンは1.4.1で、ファイルサイズは35.9Mbytesあります。スループットが4Mbit/sだとすると、1分少々程度でダウンロードできるはずです。
1.インストーラの実行
インストーラをダウンロードしたら、ファイルを実行してください。原稿執筆時の最新バージョンのファイル名は「j2sdk-1_4_1-windows-i586.exe」です。インストーラのウィザードに従いインストールを実行してください。なお、ウィザードの指示にそのまま従うと、インストールされるディレクトリは「C:\J2sdk1.4.1」になります。筆者はルートディレクトリにたくさんのフォルダが作られるのを好まないのでインストール先を「C:\Program Files\j2sdk1.4.1」に変更しました。
2.環境変数の設定
Java 2 SDKを使ってJavaアプリケーションを開発するには、Javaのコンパイラやバーチャルマシンが存在するディレクトリのパスをWindowsが見つけられるように環境変数を設定します。[システムのプロパティ]ダイアログの[詳細設定]タブにある[環境変数]ボタンを押します。
次に、環境変数[Path]の設定[「環境変数]ダイアログの[システム環境変数]リストから[Path]の項目を選んで[編集]ボタンを押します。[システム変数の編集]ダイアログが表示されたら、変数値にインストール先として「指定したフォルダ名\bin」を指定します。
例えばインストール先を「C:\Program Files\j2sdk1.4.1」にしたら、Path変数の値は「C:\Program Files\j2sdk1.4.1\bin」を設定するという具合です。なお、Path変数がすでに設定されている場合は、「C:\; C:\Program Files\j2sdk1.4.1\bin」のように「;」で区切ることで複数のディレクトリ名を設定できます。
ここまでの作業で開発環境は整いました。初めてのJavaアプリケーションを作ってみましょう。メモ帳や秀丸エディタで以下のソースファイルを入力し、「HelloWorld.java」というファイル名で保存してください。
保存先のフォルダはどこでも構いません。ただ、それでは説明しにくい場合がありますので、この連載では以後「マイ ドキュメント」の中に「My Java Applications」というフォルダがあり、そこにJavaアプリケーションのソースファイルを保存するものとして説明します。
「Hello World!」を表示するプログラム |
public class HelloWorld
{ |
Windowsの標準設定では、「.java」という拡張子部分がエクスプローラで表示されません。これから「HelloWorld.java」をコンパイルしますが、拡張子が表示されないとコンパイルしたファイルとソースファイルの見分けがつかないことがあります。この機会に拡張子を表示するように設定を変えておくとよいでしょう。拡張子部分を常に表示させるには、コントロールパネルの[フォルダオプション]にある[表示]タブで、[登録されている拡張子は表示しない]のチェックボックスをオフにします。
いよいよコンパイルです。Javaのコンパイラはソースファイルをバーチャルマシンが解釈できる形式の中間コードに変換します。実際にアプリケーションを実行するときは、バーチャルマシンが中間コードを解釈します。この点はCやC++のコンパイラとは異なります。CやC++のコンパイラは、CPUが直接理解できる形式の機械語を生成します。中間コードを解釈する手間がない分、CやC++の方がJavaのアプリケーションよりも高速に動作します。しかし、CやC++のコンパイラが生成するコードはCPUの種類が異なると実行できません。一方、Javaのコンパイラはバーチャルマシンが理解できる中間コードを生成しますので、JavaのアプリケーションはCPUが違っても動作します。CPUの違いをバーチャルマシンが吸収してくれるからです。
Javaのコンパイラはインストール先フォルダの「bin」にある「javac.exe」というプログラムです。コンパイラはDOSプログラムですので、スタートメニューから「プログラム」→「アクセサリ」→「コマンドプロンプト」でDOS画面を表示させてから実行します。さっそく「HelloWorld.java」をコンパイルしたいのですが、「HelloWorld.java」は「C:\Documents and Settings\<ユーザー名>\My Documents\My Java Applications」というとんでもなく長い名前のフォルダにあります。コマンドプロンプトを表示させると初期フォルダが「C:\Documents and Settings\<ユーザー名>\」になりますので、
C:\Documents and Settings\user\>CD
"My Documents\My Java Applications" |
のように現在のフォルダを変更する必要があります。思い切ってソースファイルの保存場所を「C:\」にしてしまえば楽ですが、美しい方法ではありません。そこで、マイクロソフトの「PowerToys」に含まれるTweakUI(http://download.microsoft.com/download/whistler/Install/2/WXP/EN-US/TweakUiPowertoySetup.exe)や国産のWindows環境変更ソフトである「窓の手」(http://www.asahi-net.or.jp/~vr4m-ikw/)の手を借りることにしましょう。
TweakUIや窓の手を使うと、フォルダを右クリックしたときに「コマンドプロンプト」というメニューが表示されるので、コマンドプロンプトでフォルダを移動する手間が省けるのです。つまり、エクスプローラで「My Java Applications」のフォルダを右クリックして「コマンドプロンプト」を選ぶだけで、現在のフォルダが「My Java Applications」になった状態でコマンドプロンプトが使えるというわけです。
話が横道にそれてしまいました。いよいよ初めてのコンパイルです。どんな方法でもよいので、とにかくコマンドプロンプトで「HelloWorld.java」を保存したフォルダを現在のフォルダにします。コンパイラのファイル名は「javac.exe」ですので、
C:\DOCUME~1\User\MYDOCU~1\MYJAVA~1>javac
HelloWorld.java |
とします。しばらく間があって、コンパイルが終わるはずです。万が一エラーが表示された場合は、環境変数Pathにjavac.exeのあるフォルダを登録しているか、ソースファイルに打ち間違いがないかを見直してください。
コンパイルが終わると、ソースファイルの拡張子が「.class」になったファイルが同じフォルダにできているはずです。今回は「HelloWorld.java」をコンパイルしましたので、「HelloWorld.class」です。これがJavaのコンパイラが生成した中間コードのファイルです。あとはJavaのバーチャルマシンで「HelloWorld.class」を実行するように指示すれば、初めてのJavaアプリケーションを実行できます。以下のようにします(ここで、HelloWorld.classの拡張子「.class」は不要です )。
C:\DOCUME~1\User\MYDOCU~1\MYJAVA~1>java
HelloWorld |
いかがでしょうか? たかが「Hello World!」と表示させるだけでずいぶん手間がかかりました。単に「Hello World!」を表示させたいのなら、perlなどのスクリプト言語を使えばコンパイルやバーチャルマシンの手を借りなくても済みます。しかし、ちょっとしたユーティリティでもいいですし、あるいはワープロやブラウザのようにもっと大規模なアプリケーションを開発するときのことを考えてみてください。アプリケーションは、プログラムを部品化して再利用することで開発コスト(お金と手間)を抑えるのが普通です。ところがスクリプトには部品を再利用するための効率的な方法が用意されていない場合がほとんどです。スクリプトを再利用するには、チームのほかのメンバーやサードパーティが作ったコードをコピー&ペーストするしかないのです。
Javaには、アプリケーション構築に必要なプログラムの部品を、各プログラマがいちいち書いたり、誰かほかの人が書いたソースファイルからコピー&ペーストしたりしなくても済むように、「パッケージ」という仕組みが用意されています。例えば、「Hello World!」という語句を表示させるのに使った「System.out.println」の文は、パッケージとしてJavaの開発環境で用意された標準の機能を使っています。
初めてのプログラムも実行できたことですので、今回は「パッケージ」という言葉の意味をほんの少し解き明かして終わりにしましょう。
インストールフォルダ(C:\Program Files\j2sdk1.4.1)をエクスプローラで表示させると、「src.zip」というファイルがあるはずです。圧縮ファイルなので展開するとかなり大きなサイズになりますので、ここでは展開せずに右クリックメニューから「エクスプローラ」を選んでください(エクスプローラによるZIPファイルの閲覧はOSのバージョンによっては対応していません)。
たくさんのフォルダと「.java」ファイルがあります。「HelloWorld」を出力するときに使った「System.out.println」という文は、src.zip内のフォルダ「java/Lang」にある「System.java」というファイルで定義されている機能を再利用するものです。つまりJavaのコンパイラはユーザーが作った「HelloWorld.java」というソースファイルと、Java 2 SDKに含まれる「System.java」という2つのソースファイルの両方を解釈することで画面に文字を出力しているわけです。このように、ほかのソースファイルから利用して使うプログラムの部品の集まりをJavaでは「パッケージ」と呼びます。
ただ、「System.java」のようにJava 2 SDKに含まれるパッケージをいちいちコンパイルするのは効率的ではありません。それに、基本的なパッケージ(コアパッケージと呼ばれる)はユーザーが変更してはいけないことになっています。であれば、コアパッケージのソースファイル(.javaファイル)は、あらかじめすべて中間コードにしておいた方が便利です。コンパイラはユーザーが作ったソースファイルだけを中間コードに変換すればよくなります。バーチャルマシンはコンパイラが生成した中間コードと、あらかじめ用意されたコアパッケージの中間コード(.classファイル)の両方を解釈してプログラムを実行した方が、全体の作業にかかる時間を大幅に短縮できるはずです。
そこで、Java 2 SDKに含まれるコアパッケージの中間コードは、すべてrt.jar(run-timeの略と思われる)というファイルに格納されています。JARは「Java ARchive」の略で、実際にはZip形式の圧縮ファイルです。Javaのバーチャルマシンは、実行時に必要中間コードファイルをrt.jarから解凍して取り出しているわけです。
なお、「.jar」ファイルの拡張子を「.zip」に変更するとZip形式の圧縮ファイルとして扱えるようになります。rt.jarを直接いじるのは危険ですので、必ず別の場所にコピーしてから拡張子を.zipに変更し、多数の.classファイルが格納されていることを確認してみてください。
今回はここまでです。次回は、今回紹介した「Hello World!」を題材に、Java言語の本質に少しだけ迫ってみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.