Javaを使ってみよう

プログラミングをおこなうというのはどういうことかを体験してみよう. プ ログラムは多くの場合テキストファイルの形で書かれる. プログラムの構成要 素を画面上で並べてプログラムをおこなうビジュアルプログラミングも研究は されているが, 実用になっているとは言い難い.

昔からプログラムの修正なども一体に組み込んだ言語処理系はあるが, 普通 はテキストファイルは, テキストエディタを用いて作成, 修正する. 教育用計 算機センターのシステムで標準に用意されるテキストエディタは Mule であり, Mule の使い方は前回までの自習でマスターしてあるはずである.


作業用ディレクトリの作成

Unixではディレクトリを用いた階層なファ イル構造を取っている. 個人のホームディレクトリの下も, 作業に応じてディ レクトリを作成して整理することが望ましい. ここでは, ホームディレクトリ の下に java というディレクトリを作って, そこで作業をすることにしてみよ う. ktermのウィンドウで,
cd ~
mkdir java
cd java
のようにして,~/java以下で作業をする.
それでは, 次のサンプルプログラムを入力して, Test.java というファイル で保存してみよう. 手で一文字一文字入力するのが慣れるための早道なので, X-Windowの Cut & Paste は用いないように.フォントの 関係で見にくくなっているが [] は'[' と']'を入力する.
class Test {
  public static void main(String[] argv){
    System.out.println("Hello World");
    System.out.println("Hello Again");
  }
}
ファイルを保存したら, ktermのウィンドウでUnixコマンドの ls を実行して, ファイルができていることを確認する.

言語処理系の方式

テキストファイルの形式は人間には扱い易いが, 計算機には扱いにくい. プ ログラム言語処理系は, 大きく分けると, プログラムの実行のたびにテキスト ファイルを読み込んで実行するインタプリタと, テキストファイルから機械語 からなるファイルに変換するコンパイラがある. この時, プログラムを記述す るテキストファイルのことをソースファイル(source file)と呼び, コンパイ ラによって作られる機械語のファイルのことをオブジェクトファイル(object file)と呼ぶ. コンパイラを使ってソースファイルからオブジェクトファイルを 作成することを「コンパイルする」と言う. 計算機が直接実行するのはメモリ上に2進数の形で蓄えられたコードで,機械 語と呼ばれる.機械語は機械が直接実行しやすいよう設計されたコードなので, 人間が直接書くのは難しい.機械語に一対一で対応するように,人間が書きや すくしたものが,アセンブリ言語である.

言語の仕様と, 言語処理系は一対一対応ではないが, Java言語の場合は言語 の仕様の一部として, 仮想的な計算機(Virtual machine, 仮想機械)を定め, コンパイラはバイトコード(bytecode, 仮想機械の機械語にあたる)を生成する 仕組みを取っている. この方式は,

という特徴がある.

オブジェクトファイルの実行には, バイトコードインタプリタという仮想的 な機械をシミュレートするプログラムが使われることが多い. しかし, この方 式は直接, 対象とするマシンの機械語を生成する場合と比較して遅い(数10倍 程度)ので, JIT(Just-In-Time) コンパイラといって, 実行時にバイトコードから実行するマシンの機械語に変 換する方式もある.


標準的な Java の処理系は Java 言語を開発した Sun MicroSystems社の出し ている JDK (Java Development Kit)である( JDK のページ ). 今回の授 業では JDK 1.1.3というバージョンを用いる.

コンパイル

それでは, コンパイラを起動してみよう. ktermのウィンドウで, 次のように 入力してみる.
javac Test.java
正しくソースファイルが作られている場合は, 何もメッセージを出さずに終了 する. メッセージが出る場合は, どこかに問題がある場合である. 典型的なエ ラーメッセージとその対策を書く.
error: Test.java が読めません。
Test.java というファイルが, カレントディレクトリにない場合にこの エラーが出る. Muleで作成したファイルを保存していな い, 別の名前で保存してしまった, ファイルを作成したのとは別のディレクト リで作業しているなどの原因が考えられる.
Test.java:2: 識別子がありません。
  pulbic static void main(String[] argv){
        ^
この例では文字のスペルミスだが, 括弧の対応が取れていないなどの ミスも考えられる.
Test.java:2: 無効な入力文字です。
  public static void main(String[] argv){
                                        ^
Test.java:2: '{' がありません。
  public static void main(String[] argv){
                                        ^
記号として, 全角の'{'を使っている. 全角の'{'と半角の'{'とは見 ためは同じだが意味は違う. 記号が全角かどうかは, Mule中でカーソルをそ の文字に合わせた時に正方形になるのが, 全角, 長方形になるのが半角の文字 である(「全角」, 「半角」という表現は正確ではない. 正確にはそれぞれ JIS X0208文字セット, ISO 8859中の文字セット中の文字. ネットニュース中 で「全角」, 「半角」という言葉を使うと親切に指摘してくれる人がいる).
間違いを見つけたら, Muleで修正をして, 保存してから無事コンパイルが終る までコンパイルを繰り返す.

実行

実行のためのコマンドは java という名前である.
java Test
と入力すると,
Hello World
Hello Again
と出力されるはずである.
次へ進む
ktanaka at ecc.u-tokyo.ac.jp