プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也
プリプロセッサ プリプロセッサ; コンパイルに先立って行われるソースコードの 書き換え. ディレクティブ: ソースコードの書き換え命令.Cでは,# で始まる.
マクロ定義 マクロ定義: #define A B A を B と定義する. (プログラム中の A を B と置き換える.) 例: #define TRUE (1) #define FALSE (0) #define PI 3.1415926536 # square(x) (x * x) // 引数を持つマクロ 注意: square(a++) は,(a++ * a++) と置き換えられる.
ファイルインクルード ファイルインクルード: ヘッダファイル(.h)をソースファイル(.c)の先頭に読み込むことができる. #include <パス名> // 標準ディレクトリ#include “パス名” // カレントディレクトリ ヘッダファイルに含まれるもの #define 文 構造体の宣言 プロトタイプ宣言 外部変数(他のファイルにある大域変数)の参照
条件コンパイル 条件コンパイル: 条件部が真のときのみコンパイルする. #if #else #endif #ifdef #ifndef : テスト用のコードや古いコードを残しておきたい場合など. #define DEBUG (1) : #if DEBUG [テスト用のコード] #endif (0) //#define DEBUG (1) #define DEBUG (1) : #ifdef DEBUG [テスト用のコード] #endif
分割コンパイル(1) プログラムの作成は分業で行われる.
分割コンパイル(2) プログラムは複数のソースファイル(モジュール)に分割される.
分割コンパイル(3) 各ソースファイルは別々にコンパイルされる コンパイル リンク コンパイル
分割コンパイル(4) 他の人のヘッダファイルを利用する場合もある コンパイル インクルード コンパイル
ヘッダファイルの役割 他のファイルが宣言を参照する場合. <item.h> <class.c> #define ARRAY_MAX (1000) struct List { int items[ARRAY_MAX]; int num; }; void init_list(struct List *l); : <class.c> #include “item.h” #include “class.h” : int create_class( … struct List l; init_list(&l); <item.c> #include “item.h” void init_list(struct List *l) { :
ライブラリ ライブラリ: あらかじめコンパイルされているオブジェクトファイル. 一般にソースコードは存在しない. 他の言語(アセンブラなど)でコンパイルされている場合も. 利用するにはヘッダファイルが必要. コンパイル リンク インクルード
標準ライブラリ(1) 標準ライブラリ: コンパイラと一緒に提供されているライブラリ. コンパイラメーカが作成し,コンパイルしたもの. 基本的な関数(特に入出力関数)が含まれている. printf scanf strlen strcpy malloc free : stdio.h string.h stdlib.h
標準ライブラリ(2) 標準ライブラリの内容はコンパイラによって異なる MSVC GCC
C言語の設計 なぜC言語なのか? 設計がシンプルであること 高級言語であること 高速であること メモリ操作ができること 関数を記述単位とする 式の評価の一貫性 入出力関数を言語仕様に含んでいない 高級言語であること 構造化プログラミング 構造体などのサポート モジュール指向プログラミング 高速であること コンパイラ,ポインタの使用 メモリ操作ができること ポインタ,配列
そしてオブジェクト指向へ… より高級化を目指す言語発展の歴史. 高級化には「思想」が必要. 高級化の失敗例? 失敗の理由: 人工知能 関数型 形式的仕様記述 失敗の理由: コストに見合わない 難しすぎる 現実のソフトウェアに合わない 社会のニーズに 答えていない!!