プログラミング言語II page1(update:2009/09/30 )


1.Java言語の特徴 


[ prev | next | index ]

目次

[目次]


1.1 オブジェクト指向言語の必要性

複雑化大規模化するプログラム

ソフトウエアの行数が数十行程度のうちは計算機への命令を順番に書いただけのプログラム で十分です。従って、Basic言語のような命令を順番に書けばプログラムになる言語が便利です。  しかし、ソフトウエアの規模が大きくなると幾つかに分けて作らないと複雑で解らない物になって きます。そこで、Basic言語でもサブルーチンと呼ばれる数十行のプログラムをメインプログラムから呼び出して使える仕組を用意しています。BASIC言語でもプログラムをサブルーチンに分けて作ることで 少し大きなプログラ ムを書くことができます。

構造化プログラミング

プログラムを複数のサブプログラムに切り分けて作る事は構造化プログラミングと呼ばれる手法の要点の1つです。例えば構造化プログラミングで使わないことが推奨されているgoto命令を使うと、1つのサブプログラムから自由に他のサブプログラムの途中に実行を移すようなことが可能なので、サブプログラムに分かれているように見えて、実は複雑に絡んでいるといったことが起こり構造化 を保障できなくなります。

BASIC言語でも構造化されたプログラムを書くことは可能ですが、プログラマに対してそれを仕向ける強制力に欠けています。さらに名前の衝突など複数のプログラマが共同してプログラムを作成する 体制へのサポートが不十分です。現実問題として人間がBASIC言語で大きなプログラムを作る事は難しいと言えるでしょう。

構造化言語

C言語はサブルーチンを標準化した関数を言語の 基本構造として取り入れ、構造化プログラムを書くための言語として作られました。Cは構造化言語の代表的例です。 C言語には複数のプログラマが分担して開発するための分割コンパイルとリンクの仕組みが用意されています。 これを使って、複数のソースに分けてプログラムを作成し個々にコンパイルした後で結合して一つのプログラムにまとめることが可能です。OSの様な大規模プログラムの開発も 容易になりました。

構造化プログラミングではデータフロー図(DFD)がよく使われます。DFDは処理を表す円と、入出力データを表す線で構成される図です。 大きな処理はその内部を複数の処理に分けて詳細なDFDとしていくことで単純な処理にまで分解 します。
※参考文献 「構造化分析とシステム仕様」トム・デマルコ著 高梨智弘/黒田純一監訳 日経BP社

C言語なら分解された単純な処理を関数で、複雑な処理はこの関数を順番に呼び出す関数で実現します。 入出力されるデータは構造体でフォーマットを定義されたデータ型の値で、関数の引数や戻り値となります。

(※ここでデータと処理が異なる扱いをされていることが、さらに大規模なプログラム開発では問題になってきます)

C言語は関数を分割の単位とし個々に作成して後で組み立てます。しかしプログラムへの要求が複雑になるに連れて、関連の強い関数とデータをまとめて1つの役割 (あるいは責務)をになうまとまりに分けることが行われるようになりました。C言語ではこの様な役割をになうプログラムはモジュールやライブラリとして提供されます。例えば、GUI(グラフィカル・ユーザ・インターフェイス)等のライブラリ です。

オブジェクト指向プログラミング

GUIのライブラリは関数の呼び出し順番などで多くの約束事を守らないと旨く動きません。C言語は関数の呼び出しや変数の参照を制限する機能が弱いので、プログラマが間違った使い方をしてしまうのを防げない問題点 もあります。 間違った関数呼び出しや変数への参照を防ぐために外部との間に垣根を作る仕組みが必要です。ただし、垣根を作ると外からは触れない部分ができますから、その部分については内部で自動的に管理する必要が出てきます。

この様なものとしてオブジェクトと呼ばれるまとまりを作る考え方があります。オブジェクトは変数と関数をまとめ外部からの参照に対しては参照制限を行います。この参照制限をカプセル化と呼びます。 カプセル化により、オブジェクトを利用する側はその 参照許可の部分にしか触れられません。 参照できない部分はカプセル内で適切に利用され、外からは知る必要のない部分となります。

例えば、ウインドウのオブジェクトでは大きさを設定する関数を外部から呼び出して大きさを変える時、ウインドウの大きさが変わることに対応したウインドウ内のボタンや文字枠等の再配置と画面の再描画の関数は自動的に適切な順番で呼び出す様に作ります。カプセル化された内部の処理手順 はオブジェクトが自動的に進めるので外部の利用者が手順を意識する必要はありません。
※ ここで、自動的な処理に時間がかかる再描画のような部分は、並列処理で行われます。

プログラムをオブジェクトに分割し、オブジェクトが互いに相手オブジェクトの機能を呼び合う形にプログラムを作る手法をオブジェクト指向プログラミングと呼びます。C言語でオブジェクト指向プログラミングを行うことは原理的には可能です 。しかし、オブジェクトを作る標準的な仕組みが用意されていない点やカプセル化の機能が弱いなどで現実的ではありません。

オブジェクト指向言語

オブジェクト指向プログラミングを想定した言語が幾つか有りますが、オブジェクトの作り方は1つではありません。オブジェクトを直接プログラムとして記述する言語、例えば、初めから基本的なオブジェクトが用意されていて、プログラムでは既存オブジェクトの複製をつくり、中身の追加を行って目的のオブジェクトを作り出すタイプの言語 もあります。あるいは、作りたいオブジェクトを生成する雛形オブジェクト(クラス)を記述し、実行時に、この雛形から目的のオブジェクトを生成をするタイプの言語(javaなど) もあります。ここでは後者のjava言語を学ぶことにします

※java言語を使えばオブジェクト指向のプログラミングが容易になるだけで、java言語を使ったからといってオブジェクト志向プログラムになるわけではありません。

クラスとインスタンス

雛形を使う言語では雛形に製品オブジェクトの設計図(オブジェクトの要素となる変数や関数の種類)を記述しておきます。設計図から作られた製品オブジェクトをインスタンスオブジェクトと呼びます。「インスタンス」とは設計図を具体化した1事例の意味で付けられた呼び名です。一方で、同じ設計図で作られたインスタンスは全て同じ構造になり後で変更することはできません。インスタンスを構造に注目して分類すれば、設計図ごとにクラス分けできます。このため、設計図を持つ雛形のオブジェクトをクラスオブジェクトと呼んで区別しています。

まとめ

GUIの様な複雑な機能を持つプログラム部品群もオブジェクト指向言語を用いてクラスライブラリとして用意される事で、理解しやす く使いやすいものになりました。この他にも通信、マルチメディア、データベー スなどさまざまなクラスライブラリが提供されています。
 他人の作った大規模なプログラムを自分のプログラムの中で部品として使うことが、オブジェクト指向プログラミングによってようやく現実的に可能となりました。この講義ではオブジェクト指向プログラミングをjava言語を通して具体的に学んでもらうことにします。

プログラミング言語の分類を表にしておきます。

言語 構造化 オブジェクト指向
初期の言語
FORTRAN
BASIC
gotoで自由な実行制御が可能
サブルーチンや関数を作れる
近年は構造化も取り入れている
(近年、オブジェクト指向を取り入れきている)
構造化言語
C
pascal
whileなど制御構造を標準化
関数としてサブルーチンを標準化
構造体としてデータを階層化
オブジェクト的なものを書くことは可能
しかし、書き方は色々で標準化されていない
カプセル化の機能が不足
オブジェクト指向言語
Smaltalk
C++、C#
java
javascript
構造化言語の機能を含む
構造体はクラスに拡張
関数とデータをまとめたオブジェクが基本構造、
オブジェク内容への参照制限でカプセル化
雛形としてのクラス、1例としてのインスタンス

[目次]


1.2 Java言語発表からの経緯

Java言語は計算機ネットワーク社会で使うことを考慮して Sun Microsystems, Inc で作られたオブジェクト指向言語で1995年に発表されました。

注:jdk(Java Development Kit

現在javaは利用目的に応じて3つの edition で提供されている

[目次]


1.3 WRITE ONCE, RUN ANYWHERE

一度コードを書けばどこでも動くということです。ネットワーク上には様々なハードやOSの計算機が繋がれています。そこでネットワークで利用するプ ログラムは機種やOSに依存しないで同じように動くことが望まれます。

C言語のプログラムを作ったとしましょう。ソースコードをWindows上のコンパイラで翻訳し機械語の実行可能コードを作れば Windowsでプログラムが実行できます。このプログラムの開発環境はWindows上と言うわけです。ここで実行可能コードをそのまま 色々な計算機に持っていき動かせるでしょうか?使っているCPUなどハードウエアが異なり機械語が違う と動かないのは確実です。インターネットには様々な計算機がつながっているのでこれでは困ります。

では、ソースコードを持って行き、目的の計算機のCコンパイラで翻訳し実行可能コードを作れば動くでしょうか?HelloWorldと打ち出すだけのプログラムなら問題なく動くでしょう。しかし、ウインドウやボタンなどを使うプログラムではコンパイルやリンクで失敗するでしょう。GUIを使うようなプログラムでは多くの場合、実行環境に合わせてソースコー ドを書き直す必要が在ります。

1)中間言語方式

インタープリタ interpreter

LISPやBASICの様にソースコードを1文づつ解釈し実行するシステムをインタープリタと言います。プログラムを 一文づつ実行できるために、プログラムの動作を確認しながら実行できる利点があります。
しかしこの手法は文の解釈に多くの処理時間がかかるためにプログラムの実行が遅いという欠点があります。そこで最近はLISPやBASIC等の言語も下記 コンパイラや中間言語方式が使われる様になっています

コンパイラ Compiler

C言語の様にソースコードをまとめて機械語に翻訳し実行ファイルとして保存するシステムをコンパイラと呼びます。実行ファ イルはコンパイラ無しで単独で実行可能です、さらに機械語に翻訳済なので、実行は高速です。  しかし、この実行ファ イルは違う機械語の計算機では動きません。

中間言語(interlanguage)方式

ソース コードを中間言語コード(仮想の機械語)に翻訳するコンパイラと中間言語コードを実行するインタープリタ(仮想機械)を組み合わせた方式です。Javaの システムでは以下の順番に処理と実行が行われます。

Bytecode Compilerでソースコードをバイトコード(Bytecode)と呼ばれる中間言語コードにコンパイル する

JavaVM(Java Virtual Machine)と言われるインタープリタでこのバイトコードを実行する

インタプリタは遅いと言われますが、Javaのバイトコードは仮想の機械語で、ソースコードを直接インタプリタで実行するよりは高速に解釈と実行が行えます。さ らにJavaVMではバイトコードを実行環境の機械語にまとめてコンパイルしてから実行するJITや実行速度向上に重要な部分を選んでコンパイルし実行する HotSpotなどの手法が使われることで、実行速度は改善されています。

計算機の機種やOSごとにBytecode CompilerやjavaVMを用意することで、ソースコードとバイトコードは同じも のが機種やOSによらず使えます。Java言語は広く普及し、利用者も多いことから主要な機種とOSに対してコンパイラとjavaVMが用意されていま す。

この他、バイトコードはソースコードに比べてデータサイズが小さくネットワークによる転送やメモリの少ない環境での利用に適しています。

2)データ型の規格統一

/*C言語の例*/
int i;
for(i=0;i<100000;i++){....}

C言語の様に基本データ型さえも計算機環境に依存する言語では、このfor文のプログラムもint型が4バイトなら正常に実行されますが、 2バイトの場合は無限ループになってしまいます。従って、同じPC用の場合でもWin32では動くが昔々のWin16では無限ループになります。

Java言語ではこの様なことが無いように基本データ型は規格統一されて実行環境には依存しません。

3)標準ライブラリ

これまでの開発環境ではGUI(グラフィカル・ユ-ザ・インタ-フェ-ス)を利用するプログラムの場合はソースコードさえも 機種やOSが違うと同じものは使えませんでした。 たとえ同じWindows上のプログラムでも、開発環境ごとにGUIのライブラリーが異なり使い方も違うため、同じソースコードが使えないのが当たり前でした。UNIXやMacOSでもそれぞれに個性的なGUIの枠組み を採用していますから、WindowsのプログラムをMacOSに移植する作業は大変です。

この問題を解決するには共通仕様のGUIライブラリを用意し、プログラムからはこのライブラリーを呼び出してGUI部分を作るしかありませ ん。当然ですがライブラリは機種やOSごとに用意しておく必要があります。Java言語ではGUIや通信、マルチメディア等のライブラリを標準で用意することでこれを実現しています。

4)誰でも何処でも

java言語は現在、http://java.sun.com/  から実行環境(JavaVMとライブラリ)や開発環境(javaコンパイラなど)が無償でDownloadできます。さらにライブラリのソースコードなど も公開され、誰もが使いやすい条件が整っています。WebブラウザからJavaVMを利用することが可能で、javaで作られたappletプログラムを実行 できます。これほど何処でも実行できるプログラム言語は他にありません。さらに多くの人が利用することを考慮して 国際化 (internationalization) も実現しています

Unicodeの採用と各種文字コードとの変換機能
変数や関数の名前に日本語名が使えます

5)堅牢性とセキュリティ−

javaではネットワーク上のプログラムを自分の計算機で安全に実行できるような考慮がされています。プログラムのミスを少なくするため に、javaではC/C++言語の便利ではあるが危険な機能:ポインタを制限し参照型としてのみ使えるようにし、メモリー開放の自動化も行ってプログラム が暴走する危険性を減らしています。Javaプログラムが使える資源についても認証機能を用いて設定が行えます。例えばWebブラウザ上でのJavaプロ グラムの実行ではプログラムのハードディスクへのアクセスを禁止するなど悪意のあるプログラムの実行を困難にしています。

  

[目次]


1.4 Javaプログラムの実行形式

javaプログラムは通常のApplicationプログラムの他にWWWブラウザの上で実行されるAppletプログラムやWWWサーバ(HTTPサーバ)の上で実 行されるServletプログラムの3種類の実行形式が用意されています。

  1. Application
    JavaVMによりWindowsや UNIXなどのOS上で実行されます。特にセキュリティー等の制限は無く、通常のプログラムと同じです。 
  2. Applet
    WWWのページの中にHTMLのタグでAppletプログラムを挿入できます。WWWブラウザはタグに指定されたURLからクラスファイルをダウンロード し実行します。クライアントのHDDを読み書きできない、クラスファイルを提供したWWWサーバとしか通信できない等のセキュリティー上の制限があります。
  3. Servlet
    Tomcat等のServletをサポートするWWWサーバ上にクラスファイルを置き、サーバからの呼び出しに応じてサーバ側で実行されます。一度呼び出さ れるとWWWサーバに常駐してクライアントの要求に応じてHTMLページを作成し、CGIに似た機能を実現するのに使えます。WWWとデータベースを連携したサービ スの実装などに利用され、Servletを作りやすくするJSP等の仕組みとともにサーバーサイドアプリケーションに使われています。

 

[目次]


[ prev | next | index ]