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 を参考にすること。

例えば、 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 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 は、ファイルの拡張子を示している。ルールは拡張子に対して記述することも出来る。


問題 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 とします。


Shinji KONO / Mon Dec 16 16:46:03 2019