Lecture on Programming I 6/14

Menu Menu


先先週の復習

    Perl のまとめ
    ファイルの取扱い
    モジュール


先週の復習

マルチメディア・フェアのレポート マルチメディア・フェアの写真


Typing の練習

今日も typing の練習をすること (20分)

結果をscript でメールすること。

整形した結果を、

    Subject: Report on Programming I   6/14-typist

というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。

    % rsh pw006 "Mail -s 'Report on Programming I   6/14-typist' kono@ie.u-ryukyu.ac.jp" < typescript

(ここまで書いているのに、何故、Subject を間違える?)


WWW page の作り方

WWW ページとは何か?
    nirai:~/public_html/index.html

を作る。

誰が見るのか?

どんなページが良い?

なんで見るのか?


Java に関して

Java の特徴

何故、複数のプログラミング言語を勉強するのか?

世の中のプログラミング言語
システム記述言語 C, C++, Objective-C, Mesa
アプリケーション用言語 Delphi, Visual-Basic, VC++
オブジェクト指向言語 Smalltalk, Squeak, Java, Eiffel
スクリプト言語 Perl, B-shell, C-shell, Awk, Python, Ruby, Lua
正規表現 sed, Lex
構成管理 make
マクロ処理 m4
アセンブラ (たくさん...)
コンパイラ・コンパイラ Yacc
ハードウェア記述言語 Verilog, VHDL
記号処理/AI用言語 Common-Lisp, Scheme, Prolog, OPS5
制約記述言語 CLP(FD),CLP(N),CLP(R)
Editor 用言語 Emacs-Lisp
数値計算用 Fortran IV, 77, 90
数式処理用言語 Mathematica
ビジネス記述 Cobol, 4GL, Excel Macro
データベース処理用 SQL,Datalog
HTML拡張 HTML, JavaScript, WebObjects, XML
アニメーション Maya, VRML
プリンタ用 PostScript, PDF
文書記述 TeX, LaTeX, Scribe
巨大なゴミ PL/I, Ada
忘れられた言語 Snobl, Teco, APL, fp, Telescript, Occam, Forth, GAME, PLAN, Basic, CLU, Pascal
計算理論用 ML, Haskel, Gopher
並列処理用 Star-LISP, Dataflow-C, KL/1
グラフィックス Open/GL, Direct-X
Window Tk, gTk, Qt
信号処理 Matlab
データベース dbm, MiniSQL, Postgress

プログラミング言語の使いわけは?

いったい何で Java なの?


Java の動かし方

JDK 1.2 を使います。(若干、graphics に問題があるらしい)

Java 1.1.1 Reference を参考にすること。

Sun の JavaTM 2 SDK, Standard Edition ドキュメント も便利です。

例えば、 HelloWorldApp.java というファイルを以下のように作る。

    class HelloWorldApp {
	    public static void main (String args[]) {
		    System.out.println("Hello World!");
	    }
    }

これを、

    % javac HelloWorldApp.java 
    % java HelloWorldApp
    Hello World!

というように動かすことができる。

これをHTMLから使うには、 例えば、 HelloWorld.html というファイルを以下のように作る。

    <title>Hellow World</title>
    <applet code="HelloWorld.class" width=200 height=200>
    </applet>
    end....

さらに、HelloWorld.java を作って、コンパイルする。

    import java.applet.Applet;
    import java.awt.Graphics;
    public class HelloWorld extends Applet {
	    public void paint (Graphics g) {
		    g.drawString("Hello World!",25,25);
	    }
    }

コンパイルが終わった後、 HelloWorld.html というファイルをnetscape からopen file を使ってあけると、java を使った表示を見ることができる。

また、appletviewer を使って、

    appletviewer HelloWorld.html

としても良い。

HelloWorld.html を自分の WWW page に置いて、ブラウザから実行できること。

以上を動かして、先生に動作を確認してもらうこと


英語のTutorial を読んでみよう

Java 1.1.1 tutorial 英語を怖がっているようでは、だめ。英語は量。

幸いなことにリファレンスには日本語版があります。しかし、もし日本語を使うならば、それは、必ず人の後を付いていくということになる。それでもいいのか?

Java 1.1.1 Reference


コンパイルとは何か?

Perl で生成したデータを使って、gnuplot で表示する。

Javac でコンパイルした Java VM のbyte code を Java VM で実行する。

VM とは? VM (Virtual Machine 仮想機械)とは、Java のbyte code を実行する仮想的なハードウェア。スタックマシンと呼ばれる構造になっている。


インタプリタとコンパイラの違い

インタプリタは、ソースコードを読み込んで、それを直接実行する。コンパイラは、直接実行せずに、実行するためのコードを出力する。出力するコードは、機械語(マシンコード)などと呼ばれる。コードが byte 単位で構成されている場合は byte code などと呼ぶ場合がある。

    bit     1 または 0
    byte    bit の8個集まったもの 8 bit

i386 の機械語は、Intel Pentinum II などで直接実行できるので高速である。インタプリタは、一般的にはコンパイラよりも5-100倍程度遅い。

VM は、Java byte code を読み込んで解釈する。これは、byte code interpreter と呼ばれる。このような方法を使うと、インタプリタとコンパイラの中間的なものとなる。機械語を直接出力する方法だと Windows では動くが Mac では動かないということがおきる (互換性の問題)。仮想機械方式では、仮想機械さえあれば、どのようなコンピュータでも動作させることができるので、互換性が高いとされている。

Java は、実行時に、必要な部分だけ byte code を機械語に変換する技術 (Just in time compiler) を採用している。


分割コンパイル

プログラムを複数のファイルに分けて記述し、それぞれを別々にコンパイルすることを分割コンパイルという。

分割コンパイルには、
export 他のファイルに何を見せるのか
import 自分が、他のファイルにある何を使うのか
を示す方法があるのが普通である。(Perl の module では、これらはどのようになっているのか調べよう)


Java のバージョン

バージョン(version)って何? プログラムの仕様や、実装に、いくつかの種類があること。

Java には、以下のversionがあることが知られている。

1.0 Netscape 3.0 に付属
1.1 広まっている JDK
1.2 or Java2 これからの標準

Internet 上で使うのならば、事実上、1.0を使わざるを得ない。しかし、ライブラリなどが充実しているのは Java2 からであり、Java2 を使わなければ、プログラミング言語としてのメリットは少ない。


Class Loader とは?

Java が自分のクラスを必要なときにロードする方法を指示するオブジェクト。ユーザが定義することができる。

CLASSPATH を使って、どのディレクトリから Java のクラスをロードするかを指示することができる。


型とは何か?

Perl と異なり、Java には、型(type)が存在する。型とは、変数に、何が格納されるかを限定する機能である。

型があっているからといって正しいプログラムとは限らないし、型が合わないからといって間違ったプログラムとは言えない。しかし、型の整合性は、プログラミングの指針となる場合がある。また、単純な間違いを型の違いによって気付くことができる。


Class とは何か?

オブジェクトの型。Java では、基本的には、型=Class であるが、若干例外もある。例えば、整数はClass ではない。


オブジェクトとは何か?

状態を持つデータ構造に、メソッドと呼ばれる操作が付いているプログラム単位。


make の使い方

make は Unix のプログラムの構成管理ツールの一つである。いちいち、手で、
    javac xxxx.java

などと打つのは止めよう。どのファイルがコンパイルが必要なのかは、make が考えてくれる。


Makefile の書き方

Makefile は、変数の定義と、プログラムで使われるファイルの間の関係を定義するルールからできている。

    JAVAC =    javac
    JAVA =    java
    APPLETVIEWER = appletviewer
    JFLAGS = 
    .SUFFIXES:   .java .class .test
    .java.class:
	    ${JAVAC} ${JFLAGS} ${.IMPSRC}
    .class.test:
	    ${JAVA} ${JFLAGS} ${.PREFIX}
    ALL = HelloWorld.class HelloWorldApp.class
    all: ${ALL}
    test1: HelloWorld.class
	    ${APPLETVIEWER} hello.html

= が変数の定義になっている。: が、ルールの定義になっている。

	変数名 = 変数の値

$ で変数が表されるところは Perl と似ている。

	生成ファイル : 元のファイル
		作り方

というのがルールである。作り方の前は「タブ」でなくてはならないので気を付けよう。

.SUFFXIES は、ファイルの拡張子を示している。ルールは拡張子に対して記述することも出来る。


オブジェクトってなんだっけ?

データとメソッドの組。オブジェクトの状態はインスタンス変数に格納されます。

    class Btree {
	public int value;
	public Btree right;
	public Btree left;
    }


Java のオブジェクトの作り方

Constructor を使います。

    class Btree {
	public int value;
	public Btree right;
	public Btree left;
	public Btree (int v,Btree l, Btree r) {
	    value = v;
	    right = r;
	    left = l;
	}
    }

これを、
    new Btree(0,t,null);

というような形で使います。

Java API のクラスは、どれを使うかを自分で宣言する必要があります。そのために import というのがあります。* を使って全部呼んでも良いが、必要なものだけを使うほうが良いかも。


error command

コンパイラエラーをerror コマンドに通すことにより、エラーをソースファイルにいれてくれます。cut & paste でも良いが...

    javac file.java |& error

のように使います。これは、パイプと呼ばれる機能です。& を付けると、エラーも一緒にパイプに通します。

    ls | wc

とするとディレクトリ中のファイルの数がわかります。


インスタンス変数とメソッド変数の違い

メソッド変数は、オブジェクトの状態ではないが、メソッドの中でのみ有効になります。


Turtle Graphics を作る

Turtle.pm を Java 用に書き直してみよう。

Turtle.java


class Graphics

Canvas に絵を書く AWT (Abstract Window Toolkit) のクラス。極めて単純な機能しかない。Beans に移行することが望ましいらしい。


Applet と Application

このTurtle は、Applet としてもアプリケーションとしても実行できます。

TurtleTest.java turtle.html 単独で動く例

Turtle.java


Compoments

アプリケーションでは、class Components を使っています。


継承

基本的なオブジェクトに、より詳しい機能を付ける時に使います。

一種のパッチ。


オブジェクトが死ぬとき

誰からも参照されなくなったときにオブジェクトは死にます。

finalize で明示的に殺すほうが早く死んでくれます。


Thread を作る

RunningOval.java RunningOval.html

ランダムな配列を作る

        public static int [] random_array (int n) {
            int i,j;
            list = new int [n];
            for(i=0;i<n;i++)  list[i] = -1;
            for(i=0;i<n;i++)  {
                j = (int)(java.lang.Math.random()*n);
                while (list[j] != -1) {
                    j = (++j<n)?j:0;
                }
                list[j]=i;
            }
            return list;
        }

ランダムな配列からBtree を作ってみる

Btree.java Test プログラム

BtreeTest.java


問題 Makefile の使い方

例題のMakefile で、make test4 が終ったあと、TurtleApp.java を編集した。この後、make test4 を実行すると make は何をするか? 順を追って説明せよ。

Turtle Graphics を使う別なテストプログラムを作り、それをテストする部分を Makefile に付け加えてみよ。


Type error の確認と直し方

Java Compiler のtype error
	Incompatible type for =. Can't convert int to Btree.

というエラーメッセージを生成するプログラムの例を示せ。


Turtle Graphics

四角い渦を書くプログラム、二重の四角い渦を書くプログラム、曲線の渦を書くApplet を作成せよ。


Tutorial を読んで理解する

Java Tutorial の
	Learning the Java Language 

の中の
    Object-Oriented Programming Concepts 

の中の
    What Is Inheritance? 

を読んで、abstract class とは何かを説明せよ。


Object の作り方

走る車を表すオブジェクトを作ることを考えよう。ここでは、
    車の速度 v 
    車のハンドルの方向 direction

を考えることにする。これらをオブジェクトの状態として持つclass Car を作成せよ。

これらの代わりに、

    アクセスの位置 pedal
    エンジンの力 power
    車の重さ weight
    車の加速 accelaration

などを使うオブジェクトclass DetailedCar を作成せよ。


Runnable

例題RunningOval を参考にして、線を書く代わりに、自走する Car を作ってみよ。

Applet を Runnable にして、Car に forward() のようなメッセージを送るようにすると良いかも知れない。

四角いコースを走るCar、丸いコースを走るCarのプログラムを作成せよ。

速度も時間で変化するように作ってみよう。


Manual の見方

三角形を描くために必要なclass とmethod のマニュアルを探す手順を記述せよ。


基本的な制御

class Car, class DetailedCar で、単位時間(1sec)あたりの車の位置を計算するメソッドを、これらのclass に付け加えたい。必要なインスタンス変数を付け加えて、このメソッドを完成しせよ。このクラスを使って、車の10秒間の動きをシミュレーションするプログラムを作成せよ。

for, while, do-while の三種類のループを使う版を作成せよ。


継承の使い方

Detailed Car を Car を継承する形で作成してみよ。

Car に運転者の名前と、持ち主の名前という属性を付け加える。

Car に、持ち主以外が運転すると文句を言う機能を付けてみよう。

持ち主を class で定義する必要がある。


文字と数字の変換

Applet のGraphics を使って、この車の運転手の名前、スピード、位置などを表示する方法を示せ。


解の性質を調べる

random_array は、本当にランダムか? これをグラフィカルに表示する方法を考え実装せよ。

また、ランダムでない場合は、その理由について考察し、その解決方法を示せ。


Vector の使い方

Vector には整数は格納できないらしい。それを示すエラーメッセージを出すプログラムを示せ。それを乗り越える方法にはどんな方法があるか。(ヒント class Integerを使う)


宿題

以上の問題を

  Subject: Practice on Programming I   6/14

というサブジェクトで、18:30 までに、kono@ie.u-ryukyu.ac.jp までメールを出すこと。

残りは、

  Subject: Report on Programming I   6/14

というサブジェクトで、来週までに提出すること。


Shinji KONO / Thu Jun 14 15:08:03 2001