このように表示される部分は、発展的な内容なので最初に読むときは読み飛ばしてかまいません。
ux103$ echo 'このように表示される部分は、サンプルプログラムあるいはターミナルでの入力の例を表します'
プログラムの構成要素を画面上で並べてプログラムをおこなうビジュアルプロ グラミングも研究はされているが, 完全にテキスト入力なしに実現しているも のは少ない.応用範囲の限られている例としては,LegoMindStormの 構成要素のブロックをつなげる形で動作を規定する例 がある. また,ビ ジュアルプログラム言語Viscuit のように見て面白いものもある.この講義では、統合環境と呼ばれるプログラムの修正や実行、デバッグなど を一体に組み込んだシステムは使わず(紹介だけはする予定)、テキストエディタを用いてプログラム の作成, 修正をおこなう。教育用計算機システムで標準に用意されるテキスト エディタとしてはTextEditと Emacs があるが,日本語ファイルのコードの自動判別の 精度を考えると,Emacsの方をお勧めしたい.Emacsの使い方が分からない人は, はいぱーワークブック「15.3 Emacs編」を読んで勉強して欲しい.
教育用計算機システムに含まれている統合開発環境としては、以下のものがあります。
- Xcode
- /Developer/Applications/Xcode.app にあります。MacOSX標準の開発環境ですが、Objective-CだけでなくJava言語の開発にも対応しています。
- Eclipse
- /Applications/eclipse3.0/Eclipse.app にあります。様々なオペレーティングシステムに対応した開発環境です。
java -version java version "1.4.2_05" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-141.3) Java HotSpot(TM) Client VM (build 1.4.2-38, mixed mode)のようにJava 2 SDK 1.4.2が使われる設定になっている.自宅のPC等でJava処理 系をインストールして使う場合は、なるべく同じ(あるいは更に新しい)バー ジョンにしておいた方が混乱が少ない。
MacOS 10.4用のJ2SE 5.0はAppleから提供されているが,教育用計算機システムのMacOS 10.3用のものは提供されていない.
cd ~ mkdir java cd javaのようにして,~/java以下で作業をする.最初は混乱するかもしれないが、す べてのファイルをホームディレクトリ直下に作るようにすると、ファイル数が 多くなってしまい見つけにくくなる。
Finderの中で「.java」という拡張子を持ったファイルをダブルクリックすると,Xcodeという統合開発環境が立ち上がってしまうので,注意が必要である.右クリックで,「情報を見る」を選んで,「このアプリケーションで開く」でEmacs.appを選択して,「すべてを変更」を実行すると,Emacsが立ち上がるようになるはずだが,教育用計算機システムではうまくいかないようだ.
なお,「~」はホームディレクトリの意味である.このあたりが分からない人は, はいぱーワークブック「13.4.5 ホームディレクトリ」で復習して欲しい.
手で一文字一文字入力するのが慣れるための早道なので, 最初はマウスを使ってのコピー & ペースト は用いないように(慣れてきたら,コピー & ペースト しても良い).フォントの関係で見にくくなっているが [] は'[' と']' を入力する.
class Hello { public static void main(String[] args){ 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:2:がありません。 pulbic static void main(String[] args){ ^ Hello.java:5: ';' がありません。 } ^ Hello.java:2: シンボルを解釈処理できません。 シンボル: クラス pulbic 位置 : Hello の クラス pulbic static void main(String[] args){ ^ エラー 3 個
Hello.java:2: \65371 は不正な文字です。 public static void main(String[] args){ ^ 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[] args){ ^ エラー 6 個
コンパイルすると,Hello.classという名前のファイルが作られる(Hello.javaをコンパイルしたからHello.classなのではなくて,class Helloと書かれていたからHello.classになるので注意して欲しい).この「.class」という拡張子を持ったクラスファイルは,テキストファイルで はないので,テキストエディタで中身をみることはできない.そこで,hexdump (はいぱーワークブック「19.5.2.1 ASCIIファイルの中身」参照)を使って見てみると,
ux103$ hexdump Hello.class 0000000 cafe babe 0000 002e 001f 0a00 0700 1009 0000010 0011 0012 0800 130a 0014 0015 0800 1607 0000020 0017 0700 1801 0006 3c69 6e69 743e 0100 0000030 0328 2956 0100 0443 6f64 6501 000f 4c69 0000040 6e65 4e75 6d62 6572 5461 626c 6501 0004 ....のようにファイルの最初の4バイトの16進表記が「cafebabe」になっていることが わかる.インドネシアのジャワ(Java)島が有名なコーヒーの産地であることにち なんで,開発者が遊び心で決めたということのようだ.なお,classファイル中の命令列(仮想機械の機械語)を見るには,javapコマンド を使って,以下のように実行する.
ux103$ javap -c Hello Compiled from "Hello.java" class Hello extends java.lang.Object{ Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello World 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 11: ldc #5; //String Hello Again 13: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 16: return }
java Helloと入力すると,
Hello World Hello Againと出力されるはずである.
java HelloのHelloの部分は,ファイル名の「Hello.java」に由来するのではなくて, プログラム中のclass Hello {の部分に由来する.したがって,ファイル「Hello.java」中でclass Hello1 {と書いた場合は,java Hello1と実行する必要がある.