Javaを使ってみよう

プログラムというのは、計算機に作業をさせるための手順書にあたる。プロ グラムはテキストファイルの形で書くのが普通である。
プログラムの構成要素を画面上で並べてプログラムをおこなうビジュアルプロ グラミングも研究はされているが, 完全にテキスト入力なしに実現しているも のは少ない.応用範囲の限られている例としては,LegoMindStormのの 構成要素のブロックをつなげる形で動作を規定する がある. また,ビ ジュアルプログラム言語Viscuit のように見て面白いものもある.

この講義では、統合環境と呼ばれるプログラムの修正や実行、デバッグなど を一体に組み込んだシステムは使わず(紹介だけはする予定)、テキストエディタを用いてプログラム の作成, 修正をおこなう。教育用計算機システムで標準に用意されるテキスト エディタとしてはTextEditと Emacs があるが,日本語ファイルのコードの自動判別の 精度を考えると,Emacsの方をお勧めしたい.Emacsの使い方が分からない人は, はいぱーワークブック「15.3 Emacs編」を読んで勉強して欲しい.


Java2 SDK 1.4.2 の使用

この講義で用いる Javaのバージョンは Java 2 SDK 1.4.2 である.システム標 準の環境で,
java -version
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-117.1)
Java HotSpot(TM) Client VM (build 1.4.2-34, mixed mode)
のようにJava 2 SDK 1.4.2が使われる設定になっている.自宅のPC等でJava処理 系をインストールして使う場合は、なるべく同じ(あるいは更に新しい)バー ジョンにしておいた方が混乱が少ない。
9/30に新バージョンJ2SE 5.0がSunから発表されたが,Appleから提供されていない.

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

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

なお,「~」はホームディレクトリの意味である.このあたりが分からない人は, はいぱーワークブック「13.4.5 ホームディレクトリ」で復習して欲しい.


プログラムの入力

それでは, 次のサンプルプログラムを入力して, Hello.java というファイル で保存してみよう.

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

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

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


言語処理系の方式

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

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

Java言語はコンパイラ方式の処理系で実行することを前提に設計されている.

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

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

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

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


コンパイル

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

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

実行

実行のためのコマンドは java という名前である.
java Hello
と入力すると,
Hello World
Hello Again
と出力されるはずである.
java Hello
のHelloの部分は,ファイル名の「Hello.java」に由来するのではなくて, プログラム中の
class Hello {
の部分に由来する.したがって,ファイル「Hello.java」中で
class Hello1 {
と書いた場合は,
java Hello1
と実行する必要がある.

練習問題

Hello.javaを少しだけ変更して、上の例で現れた以外の種類のエラーを出しなさい。
次へ進む