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 ドキュメント も便利です。
- javac Java byte code compiler
- appletviewer X window 用の appletviewer
- java Virtual Machine を動かすスクリプト
例えば、 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 英語を怖がっているようでは、だめ。英語は量。幸いなことにリファレンスには日本語版があります。しかし、もし日本語を使うならば、それは、必ず人の後を付いていくということになる。それでもいいのか?
コンパイルとは何か?
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 biti386 の機械語は、Intel Pentinum II などで直接実行できるので高速である。インタプリタは、一般的にはコンパイラよりも5-100倍程度遅い。
VM は、Java byte code を読み込んで解釈する。これは、byte code interpreter と呼ばれる。このような方法を使うと、インタプリタとコンパイラの中間的なものとなる。機械語を直接出力する方法だと Windows では動くが Mac では動かないということがおきる (互換性の問題)。仮想機械方式では、仮想機械さえあれば、どのようなコンピュータでも動作させることができるので、互換性が高いとされている。
Java は、実行時に、必要な部分だけ byte code を機械語に変換する技術 (Just in time compiler) を採用している。
分割コンパイル
プログラムを複数のファイルに分けて記述し、それぞれを別々にコンパイルすることを分割コンパイルという。
分割コンパイルには、
export | 他のファイルに何を見せるのか |
import | 自分が、他のファイルにある何を使うのか |
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 用に書き直してみよう。class Graphics
Canvas に絵を書く AWT (Abstract Window Toolkit) のクラス。極めて単純な機能しかない。Beans に移行することが望ましいらしい。
Applet と Application
このTurtle は、Applet としてもアプリケーションとしても実行できます。TurtleTest.java turtle.html 単独で動く例
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 プログラム
問題 Makefile の使い方
例題のMakefile で、make test4 が終ったあと、TurtleApp.java を編集した。この後、make test4 を実行すると make は何をするか? 順を追って説明せよ。Turtle Graphics を使う別なテストプログラムを作り、それをテストする部分を Makefile に付け加えてみよ。
Type error の確認と直し方
Java Compiler のtype errorIncompatible 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というサブジェクトで、来週までに提出すること。