file-scope(static)とextern文
プロコンの競技部門の学生さんたちが、最後の追い込み。 各パーツに分かれて動作確認が取れてきたし、 1つのプログラムに合成する最後の段階になっている様子。 しかしながら、合成した後プログラムが動かないとの相談。 1度目の処理は動くけど、2回目で動かないという状態なので、 不完全な初期化データを使って動かなくなっているのではと想像する。 といっても、そう簡単に間違いが見つかる訳もないけど、 ひとまずコードを見せてもらう。 すると、覚えたての分割コンパイルで、ヘッダファイルの中に、 static int array[…] ; といった記載が見つかる。
このままでは、array[] が、各C言語ファイル毎に、file-scope の別な実体を持つため、 大域変数渡しの副作用が伝わらなかったり、その結果として未初期化が発生したり。
ファイルスコープ
C言語では、静的変数の局所変数を作りたい場合、関数ブロック内で "static"キーワードを指定すればよい。 しかしながら、関数ブロック外で static キーワードをつけると、 分割コンパイルした場合、file-scope を持つようにコンパイルされる。 つまり、各ファイル毎の大域変数は、たとえ同じ名前の大域変数が別ファイルに あったとしても、別な記憶領域を確保してくれる。
(( aaa.c )) int x1 ; // 静的変数・大域変数 static int x2 ; // 静的変数・大域変数・ファイルスコープを持つ void foo() { static int x3 ; // 静的変数で局所変数 : } (( bbb.c )) extern int x1 ; // aaa.c の x1と同じ実体を参照できる。 static int x2 ; // aaa.cのx2とは大域変数だけど別の実体をもつ
分割コンパイルして、各ファイルで共通の変数や関数を定義する場合は、 以下のように行う。 ポイントは、extern によって宣言すると、実体は別のところにある変数となる。
(( common.h )) int foo() ; // プロトタイプ宣言 extern int bar ; // 実体はどこかで確保される変数として宣言 (( aaa.c )) #include "common.h" int bar = 123 ; // 変数barの実体 int foo() { // 関数foo()の実体 } (( bbb.c )) #include "common.h" void main() { bar = 234 ; // aaa.c の大域変数barに代入 printf( "%d" , foo() ) ; // aaa.c の関数foo()を呼び出し }
関係データベースとSQL
データベースの基礎の説明が終わったので、 データベースの実際のデータベース操作言語SQLの詳細を説明する。
関係データベースの用語
関係データベースでは、表構成のデータで表現され、 集合であらわされる項目の複数の組み合わせで表現される。 1つの項目フィールドの取り得る値の集合をAとした場合、 直積とは、 で表現される。A,Bの間の関係とは、直積の一部 であらわされる。
SQLの基本
SQLの基本として、データのテーブルを作る "CREATE TABLE" 文の説明として、 数値型・文字型・日付型などの型の名前や説明を交えながら説明。 参考にしている教科書では、CREATE VIEWの説明がある割に、CREATE TABLEの説明が無い… この他に、INSERT文の説明を行う。
データを探す場合は、SELECT文を使うが、 選択とは、特定条件のレコードを探す処理、射影でそのレコードの中の特定のカラムを取り出す。 結合とは、カラムの組み合わせを記述すものである。
SELECT [射影] FROM [結合] WHERE [選択] ; 例: SELECT S.名前 FROM S,P WHERE P.点数>80 AND S.学科='電子情報' ;
教科書で説明の無い部分として、WHERE節の中のBETWEEN,LIKE,IS NULLなどを紹介。
来週は副問い合わせ文などの説明の後、Web上のSQL演習環境を説明した後、練習課題とする。
計算機システム:OSの歴史と機能概要
コンピュータの歴史の説明の後の、8bit,16bitのパソコンの発達をうけ、 32bitパソコンの発達やOSの発達について説明する。
16bitパソコンの登場とともに、マイクロソフト社のMS-DOSや、GUIを取り入れたApple社の Macintoshの発達したころ、16bitコンピュータはシングルタスク・シングルユーザであった。 この頃の汎用機では、その計算機パワーを活用すべくマルチユーザ・マルチタスクで 処理が行われていた。 この便利な機能を、ミニコンやパソコンで使いたいという要求がでてきた。 この中で、C言語を開発したカーニハンやリッチーは、Multicsをミニコンで動かすために、 unixを開発した。 unixでは、複数ユーザが同時に複数の処理をこなすために、プログラムが並行動作している 別プログラムに悪影響を及ぼさないようにするなどの保護機能・セキュリティ機能が 重要になってきた。 32bitコンピュータが出てきたころになり、パソコンでもようやくマルチタスク・マルチユーザを 実現するための保護機能を実装できるようになってきた。 パソコンOSでは、Windows 95/98/Me/Home等ではシングルタスク・シングルユーザ がベースであった。しかし、OS/2やWindows/NT/2000/Xp/Vista/7とマルチタスク・マルチユーザ の機能が発達していった。 一方、unixでは、BSD/SysVの2系統に分かれて発達する中、 インターネットを利用したオープンソースのOSのLinuxが発達していく。
コンピュータの基本構成
計算の手順はプログラムであり、計算に必要なデータと共に使われることで、 ソフトウェアと呼ばれる。プログラムの計算手順の考え方はアルゴリズムと呼ばれる。 コンピュータは、CPU,メモリ(主記憶),補助記憶装置,周辺装置から成り立っている。 ほとんどのコンピュータは、ノイマン型と呼ばれる構成で、 (1)メモリから命令を読む,(2)命令を解読,(3)データをメモリから読む,(4)計算,(5)結果をメモリに書き込むの処理を繰り返して行われる。
主記憶のメモリには、不揮発性のROMと揮発性のRAMがあり、 最近のOSでは、処理に応じてプログラムの中身を変える必要から、 RAMがほとんどとなっている。 しかし、このままでは電源を入れた直後のコンピュータは動けない。 このためメモリの一部はROMがあり、この中には、 周辺装置の使い方のBIOSと、電源投入直後の処理のブートローダのプログラムが 書き込まれている。 コンピュータは、ブートローダがBIOSを使って、補助記憶装置内のOSを主記憶に呼び出して OSが動き始める。利用者が、アプリケーションを起動すると、 OSが補助記憶装置内のプログラムをRAMに呼び出して処理が行われる。
プログラムを動かすにあたって、CPUでは機械語で処理が行われる。 昔はプログラムはアセンブリ言語を使って記述していた。 しかし高級言語の登場によって、プログラムが書きやすくなった。 高級言語で書かれたプログラムが動くにあたって、実行方式にはコンパイラ方式と インタプリタ方式がある。 コンパイラ方式は、処理前に機械語をすべて生成してあるため、実行速度が速い。 しかしテストプログラムを動かすような場合、全命令を機械語に直す時間がかかるので、 インタプリタ方式が多用される。コンパイラ方式は実行時に高級言語で書かれた ソースプログラムが不要のため、プログラムの考え方が盗まれることがない。