Javaを使ってみよう

プログラムというのは、計算機に作業をさせるための手順書にあたる。プロ グラムはテキストファイルの形で書くのが普通である。
プログラムの構成要 素を画面上で並べてプログラムをおこなうビジュアルプログラミングも研究は されているが, 完全にテキスト入力なしに実現しているものは少ない.

この講義では、統合環境と呼ばれるプログラムの修正や実行、デバッグなど を一体に組み込んだシステムは使わず、テキストエディタを用いてプログラム の作成, 修正をおこなう。教育用計算機システムで標準に用意されるテキスト エディタは Emacs であり, Emacs の使い方は情報処理でマスターしてあるは ずである.

教育用計算機システム中ではNC環境(Linux)とUnix環境のどちらを使ってもプ ログラミングできる。


Java2 SDK 1.4 の使用

この講義で用いる Javaのバージョンは Java 2 SDK 1.4 である.システム標 準の環境で,
ktanaka@nc01921> java -version
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)
のようにJava 2 SDK 1.4が使われる設定になっている.自宅のPC等でJava処理 系をインストールして使う場合は、なるべく同じ(あるいは更に新しい)バー ジョンにしておいた方が混乱が少ない。

個人の設定で,シェル変数pathを変更している場合は古いバージョンのJava処 理系が使われる可能性があるので,注意すること.


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

Unixではディレクトリを用いた階層なファ イル構造を取っている. 個人のホームディレクトリの下も, 作業に応じてディ レクトリを作成して整理することが望ましい. ここでは, ホームディレクトリ の下に java というディレクトリを作って, そこで作業をすることにしてみよ う. ktermのウィンドウで,
ktanaka@nc01921> cd ~
ktanaka@nc01921> mkdir java
ktanaka@nc01921> cd java
のようにして,~/java以下で作業をする.最初は混乱するかもしれないが、す べてのファイルをホームディレクトリ直下に作るようにすると、ファイル数が 多くなってしまい見つけにくくなる。
それでは, 次のサンプルプログラムを入力して, Test.java というファイル で保存してみよう.

手で一文字一文字入力するのが慣れるための早道なので, マウスを使ってのコピー & ペースト は用いないように(慣れてきたら,後の方ではコピー & ペースト しても良い).フォントの関係で見にくくなっているが [] は'[' と']' を入力する.

class Test {
  public static void main(String[] argv){
    System.out.println("Hello World");
    System.out.println("Hello Again");
  }
}
ファイルを保存したら, ktermのウィンドウでUnixコマンドの ls を実行して, ファイルができていることを確認する.

ここで、Test.javaというファイル名も重要である。「.java」の部分の拡張 子は Java言語ののソースプログラムであることを表しているし、その前の Testというのも、プログラム中の「Test」と対応させておくと都合が良い。


言語処理系の方式

テキストファイルの形式は人間には扱い易いが, 計算機には扱いにくい. プ ログラミング言語処理系(プログラミング言語を扱うためのとシステム)の実行 方式には, プログラムの実行のたびにテキストファイルを読み込んで実行する インタプリタと, テキストファイルから機械語からなるファイルに変換するコ ンパイラ方式がある.

コンパイラ方式の言語処理系では, プログラムを記述するテキストファイルの ことをソースファイル(source file)と呼び, コンパイラによって作られる機 械語のファイルのことをオブジェクトファイル(object file)と呼ぶ. コンパ イラを使ってソースファイルからオブジェクトファイルを作成することを「コ ンパイルする」と言う.

標準的な Java の処理系は Java 言語を開発した Sun MicroSystems社の出し ている Java 2 SDK (Standard Development Kit)である( Java2 Standard Edition ). 今回の授 業では Java 2 SDK 1.4というバージョンを用いる.
計算機が直接実行するのはメモリ上に2進数の形で蓄えられたコードで,機械 語と呼ばれる.機械語は機械が直接実行しやすいよう設計されたコードなので, 人間が直接書くのは難しい.機械語に一対一で対応するように,人間が書きや すくしたものが,アセンブリ言語である.

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

  • コンパイラと違い異なる機種で同じ実行コードが実行できる(NCでもUnixでもMacでも)
  • インタプリタと比較して, 実行速度が速い
  • プログラムのサイズが小さくなり, ネットワークを通じての通信が容易
という特徴がある.

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


コンパイル

それでは, コンパイラを起動してみよう. ktermのウィンドウで, 次のように 入力してみる.
javac Test.java
正しくソースファイルが作られている場合は, 何もメッセージを出さずに終了 する. メッセージが出る場合は, どこかに問題がある場合である. 典型的なエ ラーメッセージとその対策を書く.
エラー: Test.java を読み込めません。
エラー 1 個
Test.java というファイルが, カレントディレクトリにない場合にこの エラーが出る. Emacsで作成したファイルを保存していな い, 別の名前で保存してしまった, ファイルを作成したのとは別のディレクト リで作業しているなどの原因が考えられる.
Test.java:2:  がありません。
  pulbic static void main(String[] argv){
         ^
Test.java:5: ';' がありません。
  }
   ^
Test.java:2: シンボルを解釈処理できません。
シンボル: クラス pulbic  
位置    : Test の クラス
  pulbic static void main(String[] argv){
  ^
エラー 3 個
この例では文字のスペルミスだが, 括弧の対応が取れていないなどの ミスも考えられる. エラーメッセージの指摘する部分は,間違いのある場所 そのものではなくて,その直後であることが多いので注意が必要である.また, 括弧の対応のミスなどは,かなり離れたところでエラーメッセージが出ること もある.
Test.java:2: \65371 は不正な文字です。
  public static void main(String[] argv){
                                        ^
Test.java:4:  がありません。
    System.out.println("Hello Again");
                      ^
Test.java:6: 'class' または 'interface' がありません。
}
^
Test.java:7: 'class' または 'interface' がありません。

^
Test.java:4: シンボルを解釈処理できません。
シンボル: クラス out  
位置    : java.lang.System の クラス
    System.out.println("Hello Again");
          ^
Test.java:2: メソッド本体がないか、abstract として宣言されています。
  public static void main(String[] argv){
                     ^
エラー 6 個
記号として, 全角の'{'を使っている. 全角の'{'と半角の'{'とは見 ためは同じだが意味は違う. 記号が全角かどうかは, Emacs中でカーソルをそ の文字に合わせた時に正方形になるのが, 全角, 長方形になるのが半角の文字 である(「全角」, 「半角」という表現は正確ではない. 正確にはそれぞれ JIS X0208文字セット, ISO 8859中の文字セット中の文字.
間違いを見つけたら, Emacsで修正をして, 保存してから無事コンパイルが終る までコンパイルを繰り返す.

実行

実行のためのコマンドは java という名前である.
java Test
と入力すると,
Hello World
Hello Again
と出力されるはずである.

練習問題

Test.javaを少しだけ変更して、上の例で現れた以外の種類のエラーを出しなさい。
次へ進む
ktanaka at ecc.u-tokyo.ac.jp