Javaを使ってみよう

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

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


Java2 SDK 1.3 の使用

この講義では,OS標準のJava言語処理系である JDK 1.1.3 ではなく,新しい 処理系 Java 2 SDK 1.3 を用いる.情報基盤センターの広報ページ Unix系 Java処理系のバージョンアップにあるように,新しい処理系を使 うためには,path の先頭に /usr/java1.3/binを入れておく必要がある.

そのため,センター標準の tcsh を使っている人は ~/.cshrcの最後に

set path=(/usr/java1.3/bin $path)
を挿入すると,次回のログインから新しい処理系が使えるようになる.実行中 の kterm ウィンドウでも,
set path=(/usr/java1.3/bin $path)
を実行すると,それ以降は新しい処理系が優先される.この設定がうまく行っ た場合は,
ktanaka@ux019> java -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)
のように表示される.うまくいっていないと,
ktanaka@ux019> java -version
java version "1.1.3"
となる.

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

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社の出し ている Java 2 SDK (Standard Development Kit)である( Java2 Standard Edition ). 今回の授 業では Java 2 SDK 1.3というバージョンを用いる.

コンパイル

それでは, コンパイラを起動してみよう. ktermのウィンドウで, 次のように 入力してみる.
javac Test.java
正しくソースファイルが作られている場合は, 何もメッセージを出さずに終了 する. メッセージが出る場合は, どこかに問題がある場合である. 典型的なエ ラーメッセージとその対策を書く.
error: cannot read: Test.java
1 error
Test.java というファイルが, カレントディレクトリにない場合にこの エラーが出る. Muleで作成したファイルを保存していな い, 別の名前で保存してしまった, ファイルを作成したのとは別のディレクト リで作業しているなどの原因が考えられる.
Test.java:2:  expected
  pulbic static void main(String[] argv){
         ^
Test.java:5: ';' expected
  }
   ^
Test.java:2: cannot resolve symbol
symbol  : class pulbic  
location: class Test
  pulbic static void main(String[] argv){
  ^
3 errors
この例では文字のスペルミスだが, 括弧の対応が取れていないなどの ミスも考えられる. エラーメッセージの指摘する部分は,間違いのある場所 そのものではなくて,その直後であることが多いので注意が必要である.また, 括弧の対応のミスなどは,かなり離れたところでエラーメッセージが出ること もある.
Test.java:2: illegal character: \65371
  public static void main(String[] argv)}
^
Test.java:7: 'class' or 'interface' expected

^
Test.java:4: cannot resolve symbol
symbol  : class out  
location: class java.lang.System
    System.out.println("Hello Again");
          ^
Test.java:2: missing method body, or declare abstract
  public static void main(String[] argv)                     ^
6 errors
記号として, 全角の'{'を使っている. 全角の'{'と半角の'{'とは見 ためは同じだが意味は違う. 記号が全角かどうかは, Mule中でカーソルをそ の文字に合わせた時に正方形になるのが, 全角, 長方形になるのが半角の文字 である(「全角」, 「半角」という表現は正確ではない. 正確にはそれぞれ JIS X0208文字セット, ISO 8859中の文字セット中の文字. ネットニュース中 で「全角」, 「半角」という言葉を使うと親切に指摘してくれる人がいる).
間違いを見つけたら, Muleで修正をして, 保存してから無事コンパイルが終る までコンパイルを繰り返す.

実行

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