Powered by SmartDoc

C言語の登場

竹本 浩
take@pwave.sig.or.jp

目次

Last modified: Wed Mar 30 22:21:11 JST 2005

1 C言語誕生

1.1 Cの歴史

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

1.2 コンパイラーとは何か

1.2.1 コンパイルの手順

Cのコンパイルは、GNU Cコンパイラなら、gccコマンドを実行するのみで、実行可能な形式にコンパイルするが、その中では

  1. プリプロセッサ処理
  2. Cからアセンブラへのコンパイル
  3. アセンブラから再配置可能なオブジェクトファイルへの変換
  4. 再配置可能なオブジェクトとライブラリを結合するリンカ処理

が行われる。

1.2.1.1 プリプロセッサ処理

インクルードファイルの展開やマクロ処理を言語処理系に入れるのではなく、プリプロセッサの形式で提供していることが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) ;
}

1.2.2 コンパイルされたコードの構造

1.2.3 Cの記憶クラスとメモリ構造

1.2.4 C言語の特徴

2 ストリーミングプログラミング--例題によるプログラミング入門--

C言語の登場コンパイラーとは何かコンパイルされたコードの構造コードスタックヒープ言語の特徴値渡しポインタプリプロセッサ構造体、共用体ストリーミングプログラミング例題によるプログラミング入門基本形echo cat wc grep

コンパイラーの気持ちが分かるエラーメッセージを理解する正常に動作するプログラムを変えながらどんなときにどのようなメッセージが出力するか確かめるmakeコマンドデバッガーの使い方