Lecture on Programming I 6/29
Menu Menu
先先週の復習
Perl のまとめ ファイルの取扱い モジュール前回の試験の点数
WWW page の作り方
WWW ページとは何か?誰が見るのか?
どんなページが良い?
なんで見るのか?
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.1.8 を使います。(若干、graphics に問題があるらしい)Java 1.1.1 Reference を参考にすること。
- 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としても良い。
コンパイルとは何か?
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 は、ファイルの拡張子を示している。ルールは拡張子に対して記述することも出来る。
問題 Java入門
Java 入門の例題ファイルを実行する Makefile を書き、BSD/OS の JDK でどの程度動くかを確認せよ。(いくつかの例題は動かないらしい... )
例題のソースは、/usr/open/classes/kono/programming1/java においてあります。
問題 Binary Tree
Perl で作った Binary Tree を、Java のオブジェクトで記述してみよう。Binary Tree の末端は、null で表すことにしよう。Java のオブジェクトは、new Class名 で作ることができる。
データがちゃんとソートされるかどうかを確認する。
問題 Turtle Graphics
Perl で作った Turtle Graphics を、Java のappletで記述してみよう。渦巻きや、Dragon 曲線を書かせてみよう。
宿題
以上の問題を
Subject: Practice on Programming I 6/29というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。
必ず Makefile を付けること。
(*) がついている問題は option とします。