プログラム言語と、プログラムの実行
OSの話の入り口として、プログラムの実行について説明する。 その前に、前回話のできなかった、unix,Linuxなどのサーバ系の説明も行った。 特にLinuxのオープンソースによる無料での利用と、携帯向けOSで利用されている ことなども紹介した。
プログラム言語
プログラム言語については、 最初に、機械語,アセンブリ言語の低級なプログラムから、 FORTRAN,COBOLといった最初の高級言語、 構造化プログラミングを取り入れながらC言語等が発達し、 最近ではオブジェクト指向などを取り入れた言語のC++,Javaなどの紹介をする。
このプログラムの実行の際には、あらかじめ高級言語のプログラムを機械語に直して 実行するコンパイラ方式と、必要に応じて機械語に直しながら実行する インタプリタ方式の説明を行う。 コンパイラでは実際にプログラムを動かす際に、元のソース・プログラムを 提供する必要がないことから、技術流出の心配が最小限にできることを紹介。 一方インタプリタ方式は、コンパイルの時間をかけずすぐに動作試験ができる特徴 などを紹介する。
コンピュータの主要構成とプログラム起動
コンピュータの主要な構成が、CPU,メモリ(主記憶),補助記憶(HDD),入出力装置で あることを紹介する。 特にメモリが不揮発性のROMと、揮発性のRAMの2通りがあり、 通常のメモリがRAMであることから、電源が切れてもOSが動く理由を説明する。 (1)必要最小限のROMに、BIOS(基本的な入出力装置の制御プログラム)と、 ブートローダ(OSを起動させるプログラム)が記録されている。 (2)電源が入ると、BIOSを使ってブートローダが、補助記憶装置内の OSを主記憶メモリに読み出し、OSが起動する。 (3)OSが起動すると、ユーザのアプリケーションの起動に合せ、 アプリケーション・プログラムをメモリに読み出し動作する。
この様なコンピュータの起動の説明に加え、サスペンドやレジュームなどの原理を 簡単に紹介しておく。
構造体と関数呼び出し
構造体の説明の2週目ということで、実際のプログラム作成に近いものを 説明するために、構造体の関数呼び出しについて説明する。
基本となるプログラムは、今まで文字配列と整数配列2つで書いていたものを、 構造体を使って書き換えたもの。
struct Student { char name[ 20 ] ; int kokugo ; int sansu ; } ; void main() { struct Student ei[ 50 ] ; int size ; for( size = 0 ; scanf( "%s%d%d" , ei[ size ].name , &( ei[ size ].kokugo ) , &( ei[ size ].sansu ) ) == 3 ; size++ ) { printf( "%s %d %d¥n" , ei[ size ].name , ei[ size ].kokugo , ei[ size ].sansu ) ; } }
このプログラムで、ei[] 以外の配列にも入出力が必要であれば、 入力専用関数や出力専用関数があったほうが便利。
int inputStudent( struct Student* p ) { return scanf( "%s%d%d" , (*p).name , &( (*p).kokugo ) , &( (*p).sansu ) ) == 3 ; } void printStudent( struct Student* p ) { printf( "%s %d %d¥n" , (*p).name , (*p).kokugo , (*p).sansu ) ; // 同じ処理をアロー演算子だと以下のように書ける。 // printf( "%s%d%d¥n" , p->name , p->kokugo , p->sansu ) ; } void main() { struct Student ei[ 50 ] ; for( size = 0 ; inputStudent( &( ei[ size ] ) ) ; size++ ) { printStudent( &( ei[ size ] ) ) ; } }
この様な構造体のデータを取り扱う関数を準備し、 メイン処理では、その関数を呼び出すようにすれば、 メイン処理では、データ構造の中身や、その関数の中身を知らなくても、 入力・出力処理が行われることが予想しやすい。 このため、メイン処理を記述する人と、データ構造の処理を記述する人で、 作業の分担がしやすく、かつ、データ構造の変更があった時に、 メイン処理の変更を殆ど無い状態にできる。
また、最初の説明では、既存のポインタ渡しの延長で説明を行ったが、 "(*p).member"というのは、面倒でありアロー演算子が使えることを説明する。
この後は、授業の範囲外ということで、同じプログラムをオブジェクト指向で 書いてみた例を示し、データ隠蔽・手続き隠蔽といった用語を説明する。