ホーム » 2012 » 6月 » 20

日別アーカイブ: 2012年6月20日

2012年6月
« 5月   7月 »
 12
3456789
10111213141516
17181920212223
24252627282930

最近の投稿(電子情報)

アーカイブ

カテゴリー

OSの歴史と絶対PATH/相対PATH

前期中間から前期期末までは、ファイルに関する説明を行う。 これにあたり、ベースとなるOSの話が重要となるので、 簡単にOSの歴史と、PATHの概念を説明する。

OSの歴史

初期のコンピュータは、ハードウェア中心でOSという概念は無かったが、 ハードウェアの使い方を共通化しないと、プログラムを作る手間が増えるため、 プログラムの起動方法を定めた制御モニタなどが使われるようになり、 これがOSとして発達していく。 大型コンピュータでは汎用機のためのOSが発達していく。

一方、家庭用のコンピュータでは、8bitコンピュータでは機能が無かったため、 プログラム言語BASICがOSの代りとなっていた。 まともなOSは、intel系ではCP/Mぐらいしか無かった。 16bitコンピュータが出始めた頃、IBMのAT機のためのOSが必要となり、 マイクロソフト社が DR-DOS などを元に MS-DOS を開発し普及していく。

一方、Apple社は Apple-I,Apple-IIの開発の後、16bitコンピュータに GUI操作が便利な Macintosh を開発する。このGUIの操作性は広く普及していき、 マイクロソフト社は、MS-DOS上のGUI環境 MS-Windows を発表する。 この後、MS-DOS,MS-Windows を統合した Windows-95 などが発表される。 しかし、この時代のコンピュータは、シングルユーザ・シングルタスクであり、 フィアルの所有者の概念もなく、プログラムも処理の切り替えをある程度 意識して作らなければならなかった。また、複数のプログラムを動かせても、 他のプログラムのメモリ領域を触ろうとしても、OSが保護する機能は無かった。

32bitコンピュータが出た頃から、CPUがメモリ保護機能を実装したころから、 複数のプログラムの並列処理が安定してできるようになり、マルチユーザ・マルチタスク のOSが一般的になる。Windowsは、NT,2000,Xp,Vista,7と開発されていく。 一方、汎用機のOSを目指して作られた unix で、Macintosh 用のOSとして、 Mac OS X も開発される。unix は、インターネットのオープンソースの開発者 のもと、Linux や FreeBSD が開発されていった….

絶対PATH/相対PATH

コンピュータの中には沢山のファイルがあり、これらを分類して保管するための機能が、 ディレクトリ(最近のOSではフォルダと呼ばれる)である。 分類されて管理された大量なファイルを使う場合、そのファイルの場所を指し示す 必要があり、その概念がPATHである。起点となる場所から、目的のファイルにたどり つくまでのディレクトリ名を書き連ねれば良い。

ディスクの大元の根っこから、ディレクトリ名を書き連ねる方式は、 絶対PATHと呼ばれる。絶対PATHはファイルの場所を明記できるが、 ディレクトリの深い底のファイルをアクセスするには、長いPATHとなってしまう。 これに対応すべく、あらかじめ起点となるディレクトリを指定しておき、 その起点からファイルの場所を記述する方法が相対PATHと呼ばれる。

簡単な演習として、Windows のコマンドプロンプトを立ち上げ、 C言語のbin,includeなどを例としてPATHの説明を行った。 (親ディレクトリ・カレントディレクトリの説明がまだなので、来週の最初に説明しよう)

多重継承

多重継承の説明の前に、オブジェクト指向とは少し違うけど実装方法として 主流となっているテンプレート機能について説明を行う。

テンプレート機能

オブジェクト指向でよく言われる「プログラムの再利用」では、 継承を使った物が多い。 コンテナクラスでは、汎用のデータの入れ物となる純粋仮想基底クラスを宣言し、 自分で取り扱いたいデータ構造がでてくると、基底クラスから派生クラスを作り、 必要最小限の仮想関数を記述するスタイルが一般的。

しかし、純粋仮想基底クラスによるコンテナクラスでは、処理の実装の負荷が高いので、 最近ではテンプレート機能が利用されることが増えた。

template <class T>
class Data {
private:
T data ;
public:
Data( T x )
: data( x ) {}
void print() {
cout << data << endl ;
}
} ;
void main() {
Data<int> a( 123 ) ;
a.print() ;
Data<double> b( 1.23 ) ;
b.print() ;
} ;

このプログラムでは、Data<int> の型が宣言されると、型Tにintが割り当てられ、 int型のDataが宣言され、Data<double> で、double型のDataが作られる。

多重継承

課題としている、純粋基底クラス「図形」から、具体的な「四角」や「丸」の 図形表示クラスを派生させ、さらに「色付」の「四角」や「丸」の図形クラスの プログラムでは、様々な実装方法がある。 一つの方法として、多重継承がある。 複数の異なる基底クラスから派生クラスを作る方法で、課題であれば 「色クラス」と「図形クラス」から、「色付の四角」といったクラスを派生させる。

多重継承は、以下のように書けば良い。

class Figure {
public:
virtual void draw() ;
} ;
class Color {
private:
// 色情報
:
} ;
class FigureBoxColor : Figure , Color {
// FigureとColorの特徴を多重継承
} ;

ただし、多重継承は実装時の複雑さや効率の問題から、 すべてのオブジェクト指向言語で利用できる訳ではない。 Java は、様々な問題を考慮し、多重継承は実装せず、 代わりに interface 機能を用いる。

// 多重継承がややこしい例
class どうぶつ {
//
} ;
class とり : どうぶつ {
// 卵生・くちばし
} ;
class ほにゅうるい : どうぶつ {
// 胎生・4つ足
} ;
class かものはし : とり , ほにゅうるい {
//
} ;
// (a) とり,ほにゅうるいが、同名のメソッドfoo()を持っていたら、
//     かものはし.foo() は、どちらが呼び出されるのか?
// (b) どうぶつ が、要素を持っていた場合、
//     かものはしは、2つの要素を持つことにならないか?