Last modified: Wed Mar 30 22:21:11 JST 2005
C言語がUNIXの開発過程で、BCPLから派生したB言語をベースにDennis M. RItchieが開発したのが、現在のC言語である。B言語の仕様http://cm.bell-labs.com/cm/cs/who/dmr/bintro.htmlをみると、型の導入とプリプロセッサを除くとC言語の骨格がほぼ完成していたと言ってよいだろう。
B、C言語は共にOSを記述するために開発された言語であり、ビット操作を含む豊富なオペレーターと表現形式を持ち、柔軟な記述と簡潔な構造を特徴としている。さらに、Bですでにポインタの概念が取り入れ、コンパイルによって生成されるマシンコードをかなり意識した言語体系となっていた。
BからC言語に移行する途中にyaccと呼ばれる構文解析プログラム生成ツールがSteve Johnsonによって開発された。Cコンパイラは、このyaccを使って作られている。Cの移植性の良さは、yaccのようなツールの存在なくしては実現できなかったのではないだろうか。http://cm.bell-labs.com/cm/cs/who/dmr/chist.html
Cのコンパイルは、GNU Cコンパイラなら、gccコマンドを実行するのみで、実行可能な形式にコンパイルするが、その中では
が行われる。
インクルードファイルの展開やマクロ処理を言語処理系に入れるのではなく、プリプロセッサの形式で提供していることがC言語の特徴である。これによって言語処理系が軽くなってコンパイラの移植性もよくなった。
gccを使ってプリプロセッサがどのように処理されるか調べるには、-Eオプションを使ってコンパイルする。
#define INITIAL 10 #define PLUS1(a) (a+1) main() { int i; i = INITIAL; i = PLUS1(i); }
上記のプログラムを-Eオプションでコンパイルすると
% gcc -E s1.c # 1 "s1.c" main() { int i; i = 10 ; i = ( i +1) ; }
C言語の登場コンパイラーとは何かコンパイルされたコードの構造コードスタックヒープ言語の特徴値渡しポインタプリプロセッサ構造体、共用体ストリーミングプログラミング例題によるプログラミング入門基本形echo cat wc grep
コンパイラーの気持ちが分かるエラーメッセージを理解する正常に動作するプログラムを変えながらどんなときにどのようなメッセージが出力するか確かめるmakeコマンドデバッガーの使い方