ホーム » 2012 » 10月 » 03

日別アーカイブ: 2012年10月3日

2012年10月
« 9月   11月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

プログラム言語と、プログラムの実行

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が起動すると、ユーザのアプリケーションの起動に合せ、 アプリケーション・プログラムをメモリに読み出し動作する。

この様なコンピュータの起動の説明に加え、サスペンドやレジュームなどの原理を 簡単に紹介しておく。

防災訓練

毎年恒例の防災訓練が開催されました。 学生さんも全員無事に避難となりました。

1210031533_640x480.jpg

構造体と関数呼び出し

構造体の説明の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"というのは、面倒でありアロー演算子が使えることを説明する。

この後は、授業の範囲外ということで、同じプログラムをオブジェクト指向で 書いてみた例を示し、データ隠蔽・手続き隠蔽といった用語を説明する。