共用体と列挙型
構造体のビットフィールドの説明の次として、共用体・列挙型・typedefなどの説明を行う。
共用体
共用体は、複数のデータの中でどれか1つを保存するような処理で使われる。 基本的に構造体の宣言とほぼ同じだけれど、 各要素のメモリ領域を個別に確保するのが構造体。 共用体は各要素の領域は1つで記憶領域が共用される。
union Data { char string[ 10 ] ; int number ; double real ; } ; union Data x ; strcpy( x.string , "hoge" ) ; x.number = 123 ; x.real = 2.3456 ; // 記憶場所は1つだけ
今回は実用っぽいネタということで、以下の処理を示す。 共用体だけでは、中身が解らないので一緒にデータを区別する情報を保存することで、 配列に違うデータを保存する方法。
struct Data { int type ; union { // さりげなく無名共用体... char string[ 10 ] ; int number ; double real ; } ; } ; void setString( struct Data* p , char s[] ) { p->type = 1 ; strcpy( p->string , s ) ; } ; void setInteger( struct Data* p , int x ) { p->type = 2 ; p->number = x ; } ; void setReal( struct Data* p , double x ) { p->type = 2 ; p->real = x ; } ; void print( struct Data* p ) { switch( p->type ) { case 1 : printf( "%s" , p->string ) ; break ; case 2 : printf( "%d" , p->number ) ; break ; case 3 : printf( "%f" , p->real ) ; break ; } } void main() { struct Data table[ 3 ] ; setString( &table[ 0 ] , "abc" ) ; setInteger( &table[ 1 ] , 1234 ) ; setReal( &table[ 2 ] , 23.45 ) ; for( int i = 0 ; i < 3 ; i++ ) print( &table[ i ] ) ; }
列挙型
プログラムで、例えば1週間の情報の日月火という曜日を扱う場合、 以下のような記述となることも多い。
#define SUN 0 #define MON 1 : #define SAT 6 int week ; for(...) { if ( week == MON ) { //月曜日の処理... } }
この時、#defineの羅列で数字を規則的に連番を振るのは面倒となる。 これをやってくれるのが列挙型。
enum WEEK { SUN , MON , TUE , ... , SAT } ; enum WEEK week ; for( ... ) { if ( week == MON ) { // 月曜日の処理... } }
列挙型変数には、列挙型の要素名の定数以外は代入できないし、 コンパイラによってはswitch文で対応要素の処理が未記載だったら 警告してくれるなど、間違った記載をできないようなチェックが便利。
typedef…
typedefは、自分で定義した型に新しい名前をつける機能。 通常は以下のように使う。
typedef unsigned int uint_t ; uint_t x ; // xは符号なしint型となる。 typedef struct DATA { char name[ 10 ] ; int age ; } Data ; Data saitoh ; strcpy( saitoh.name , "saitoh" ) ; saitoh.age = 47 ; typedef enum WEEK { SUN , MON , ... SAT } Week ; Week wday ; wday = MON ;
OSの基本と資源管理
先週で説明の終えていなかった、機械語の生成の話の説明の後、OSについての具体的な説明を行う。
機械語の生成
先週末にコンパイラ方式とインタプリタ方式の話の次段階として、 機械語などはCPUやOSに依存する補足をして、 Javaにおける仮想マシンを用いたバイトコードインタプリタなどの説明を行う。
プログラムの機械語の実行の説明として、コンパイラによる中間コードの生成や、 リンカによる中間コードとライブラリの結合の話を行う。 また、リンクにも静的リンクと動的リンクがあり、 通常はプログラムの中にライブラリが埋め込まれる静的リンクがとられる。 しかしマルチタスクでは、メモリ中にライブラリの機械語が複数でてくると、 メモリのムダになるので、OSにライブラリを展開してもらう動的リンク方式があることを説明。動的リンクを使えば、ライブラリの修正アップデートも簡単といった利点を説明。
OSとは、
OSとは、基本ソフトウェアとよばれ、 (a)制御プログラム(狭義のOS,カーネル)と、(b)開発環境(言語プロセッサ等)、(c)ユーティリティ(CUI/GUI等)から成ることを説明する。
OSの機能として、周辺装置とのデータのやり取り・制御方法を共通化することで、 プログラム作成の労力削減が可能となる。 もう一つの重要な機能は、不用意なことをできなくすることによるデータの保護であり、 ハードを壊すような制御などを実行させない。 他のプロセスの動きを阻害するようなメモリアクセスをさせない。 他人のファイルを権限もないのに読めるようなことをさせない。…といった保護が重要。
これらの共通化や保護の対象となるものを資源(resource)と呼ぶ。 たとえば、キーボードやハードディスクといった周辺機器(物理的なリソース)、 計算に必要となる主記憶(メモリ)、CPUを利用する時間(抽象的なリソース)などがある。
プログラムの動く単位として、利用者視点でトータルの1つのサービスを提供する処理は、 ジョブと呼ばれる。これに対し、CPUが他の処理から保護する仕事の単位はプロセスと呼ばれ、ジョブは複数のプロセスで実現される場合もある。 一方、並行処理では複数のプロセスで実行するのが普通だが、共通のメモリ情報を使いながら動く処理は記述が面倒となる。 これに対しスレッドは、並列する複数の処理で同一メモリを利用できるものを指す。 複数のスレッドで1つのプロセスを構成する。
個人的なのもあるとはい…(10/26)
- 10/26 個人的なのもあるとはいえ、LinuxサーバUpdateするのに、10台も触らないといけないって、なぜぇ〜 #fnct
- 10/26 iPadで使える電子回路シミュレータを試す(3) http://tinyurl.com/3jh4e8e #fnct
- 10/25 以前の卒研で使っていた、USB-IOの改良版 USB-IO2.0 なんて商品が出ている。 http://tinyurl.com/3w9h5lo #fnct だけど、ArduinoのUSBシリアル経由で ポート触るほうが、自由度高いかな…
- 10/24 Bluetooth内蔵 Arduino。USBコネクタ無しだけど、BTシリアルで… http://tinyurl.com/3pqk95n #fnct
この記事は、 の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。
パソコンでのOSの発達と言語プロセッサ
前回のコンピュータの歴史の続きということで、 パソコン周りのOSの発達の歴史を説明。
パソコンのOSの発達
16bitパソコンが出始めた頃は、Intel&MicrosoftによるMS-DOSと、 Apple社によるMacintoshが主流であった。 この時代では、シングルユーザ・シングルタスクが普通であった。 MacのGUI技術をMicrosoftがWindowsで発表したころから、 処理性能への要求から32bitコンピュータへと変化していく。
32bitコンピュータが出始めたあたりから、パソコンでも汎用機の影響や 複数のウィンドウ操作などの一般化で、マルチユーザ・マルチタスクが 取り入れられていく。 しかし、これまでのコンピュータは、メモリ保護機能が無かったので、 他の怪しいプロセスの影響をうけて動かなくなるトラブルがあたりまえであった。 しかし、Intel 80386で、保護機能がついた頃からマルチユーザ・マルチタスク化が 広がっていく。 Windows でも、Windows/NT,2000と発達していく。
同じ頃、汎用機での巨大なOS(例えばMultics)をミニコンで動かしたいという 要求から、unixがC言語と共に開発される。unixは、サーバ側で普及していく。 この中で、Linuxは無料で使えるOSとして、普及が始まりだす。 オープンソースの世界では、Internetからダウンロードしたソフトに改良を 施して良い物ができたら、そのソフトはインターネットに公開するという 原則から、世界中のハッカーにより改良・開発されたものが広まっていく。
言語プロセッサ
コンピュータは、CPU・メモリ・I/O・周辺装置から作られており、 ノイマン型コンピュータでは、Fetch/Decode/Read/Execute/Write/次の命令…の 繰り返しによって動く。 また、メモリは不揮発性のROMと、揮発性のRAMからできている。 コンピュータは電源が入ると、ROMに書かれているブートローダが、BIOSを 使ってHDDなどからOSの基本機能を、RAM上に読みだして動き出す。 ユーザがアプリケーションを起動すると、RAM上に読み込んで起動する。
アプリケーションなどのプログラムは、高級言語などで記述されるが、 プログラムの動かし方には、コンパイラ方式とインタプリタ方式がある。 コンパイラは、ソースプログラムをあらかじめすべて機械語に直して実行する。 このため機械語に治すのは時間がかかるけど、実行時は効率よく速く動く。 一方、インタプリタ方式は、ソースを必要に応じて解析して実行する。 このため繰り返しなどでは、命令解析がその都度行われるため遅い。
しかしながら、インタプリタ方式はすぐに動かすことができるため、 テスト開発では便利である。一方コンパイラ方式は、実行時にソースプログラム が不要であることから、アプリケーション配布時にソースコードの流出の 心配がないため、企業にとっては有利である。
ITフォーラムの加速度セ…(10/21)
この記事は、 の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。
SQLのSELECT文の説明
データベース授業で、先週はデータ定義言語中心だったので、データ制御言語として、 SELECT文を説明。
SELECT文の説明として、教科書記載の納品業者テーブル、納品物品テーブルと、 それぞれの業者ID,物品IDを外部キーとして持つ、納品数テーブルを例として、説明を 行う。それぞれのテーブルの宣言と、3件程度の挿入命令を例として示す。
この後、SELECT文が、射影・結合・選択によって記載され、
SELECT 射影 FROM 結合 WHERE 選択 ;
のように記載し、射影で取り出す要素を指定、結合で対象となるテーブルを指定し、 選択で抜き出すデータの条件を示す。 結合では、対象テーブルの直積を作り出し(テーブル要素の全組み合わせ)、その中から 対象データの抜出が行われる。 条件の説明として、条件式やBETWEEN,LIKEなどの演算子を紹介する。
これに加え、副問い合わせ・相関副問い合わせなどを紹介する。
来週は、集約関数やGROUP,HAVINGなどを説明し、その後演習などに進む予定。