C言語とは何か

一、Cとは

C言語は汎用プログラミング言語で、1972年にUNIXオペレーティングシステム向けに開発されました。OS本体や付属ソフトウェアのほとんどがCで記述されています。ただしUNIX専用の言語ではなく、どのコンピュータ・OS上でも利用可能です。「システムプログラミング言語」と呼ばれることが多く、OSやコンパイラの開発はもちろん、各種一般ソフトの作成にも活用できます。

Cの前身はB言語(BCPLが元)です。BとBCPLは型のない言語だったのに対し、Cは完全なデータ型体系を新たに搭載しています。

二、核心的な特徴

1)豊富なデータ型

前身のB言語と比較すると、Cには多種多様なデータ型が用意されています。

基本型:文字、複数のサイズの整数、小数(浮動小数点数)

派生型:ポインタ、配列、構造体、共用体。ポインタを活用することでハードウェアに依存せずメモリアドレスを直接操作できます。

ルール:演算子を組み合わせることで式が作成でき、代入や関数呼び出しといった式は単独で1行の命令文として扱えます。

2)完全なプログラムフロー制御

条件分岐(if-else)、複数分岐(switch)、2種類のループ(先に条件判定するwhile/for、実行後に判定するdo)、ループから早期脱出するbreakなどに対応しています。これらのフロー制御文により、プログラムの論理を多彩に記述できます。

3)関数

関数とは一連の固定された処理をひとまとめにしたもので、名前を付けておけば、必要な時に名前を呼ぶだけで一連の処理が自動実行されます。

日常の例で説明します:

「パンを焼く」を一つの関数と仮定します。

パンを焼くたびに「生地をこねる→成形→焼成」という手順を毎回書く必要はありません。

「パンを焼く」と呼ぶだけで一連の手順が自動で実行されます。これを関数の呼び出しと言います。

パンを2回焼きたい場合は、「パンを焼く」関数を2回呼び出すだけでOKです。

C言語に置き換えると:

printf関数には「画面に文字を表示する」一連の処理がまとめられています。printf("こんにちは")と記述するだけで、画面制御の細かい手順を自分で記述する必要がありません。

関数は数値、構造体、ポインタなど各種データを返却可能です。

再帰呼び出し(自身を呼び出す処理)に対応。関数内のローカル変数は呼び出し毎に新たに生成されます。関数を入れ子に定義することはできませんが、変数はコードブロック内に個別に宣言可能です。

プロジェクトのコードは複数の.cファイルに分割し、個別にコンパイルできます。

変数には3種類のスコープが存在します:関数内部のみ有効、単一ファイル内でグローバル、プログラム全体で参照可能。

4 プリプロセッサ

コンパイル実行前に前処理が実行されます:マクロによる一括文字列置換、外部コードファイルの読み込み、一部コードの条件付きコンパイルなどです。

プリプロセッサとは、言語本体の構文に含まれない命令をコンパイル前に事前処理する機能のことです。開発効率を高めるためマクロという仕組みが用意されており、後の章で詳しく解説します。

三、低レイヤー寄りの簡潔な言語

ここで言う低レイヤーは悪い意味ではなく、コンピュータが元々扱う基礎データ(文字、数値、メモリアドレス)を直接処理し、ハードウェア標準の演算ロジックを活用するため実行速度が非常に速いという意味です。

つまり他の言語と比べ、コンピュータのより深い内部機構にアクセスでき、メモリアドレスの操作はもちろんハードウェアの制御も可能です。

言語本体の機能は極めて簡素、高度な機能はライブラリで実現

C言語には標準で組み込まれていない機能が多く存在します:文字列、配列、コレクション、ファイル読み書き、入出力処理など。

文字列や配列全体を一括操作する構文はなく、構造体のみ一括コピーが可能です。

自動メモリ管理・ガベージコレクションが搭載されておらず、メモリは開発者が手動で制御する必要があります。

read/writeといった読み書き専用キーワードは存在せず、画面出力やキーボード入力の取得はすべてライブラリ関数を呼び出して実現します。

シングルスレッドの基本的なフローのみ対応し、並行処理・同期処理・コルーチンといった機能は標準搭載されていません。

ライブラリとは、他の開発者がC言語または他の言語で作成した関数の集合のことです。ライブラリの関数を呼び出すことで基礎機能を一から作成する手間を省けます。

多くの機能をライブラリ経由で呼び出す必要があるものの、言語本体は規則が少なく簡潔なため習得しやすく、開発者が言語の全仕様を完全に理解することも容易です。

四、C言語の標準規格:ANSI C(1988年)

標準規格とは、C言語が普及し始めた当初は各企業が独自の仕様を定めており統一されたルールが存在しなかったため、専門の団体が統一ルールを定めた規格のことです。USB端子やコンセントの規格と同じように、統一基準を定める団体が存在します。

ANSI = American National Standards Institute

解説

米国国家規格協会の略称で、米国の民間規格化団体です。ソフトウェアの開発やコード作成は行わず、工業・電子・コンピュータ・プログラミング言語など各分野に統一規格を定める役割を担っています。

ANSI Cとは何か?

1983年、ANSIはC言語の文法を統一する専門委員会を設立し、1988年末に初の公式規格を発表しました。この規格のことをANSI C(C89とも呼ばれる)と言います。

五、ANSI規格に付属する標準ライブラリ

ファイル読み書き、書式付き入出力、メモリ確保、文字列処理など汎用的な機能を提供する統一された標準ライブラリが追加され、統一されたヘッダファイルから利用できます。

C言語の文法本体は非常に簡素で、変数・条件分岐・ループ・関数・ポインタといった基礎的なルールのみ定義されており、文字出力、キーボード入力、ファイル操作、数値計算、文字列処理といった機能は標準で搭載されていません。

ANSI Cによって定められた、全世界のコンパイラで統一的に使用可能なクロスプラットフォームな汎用関数群のことを標準ライブラリと呼びます。

利用方法:#include xxx.hでヘッダファイルを読み込むことで、ライブラリ内の関数を直接使用できます。

例:

#include <stdio.h> //入出力ライブラリ:printf(画面出力)、scanf(キーボード入力取得)
#include <stdlib.h> //メモリ確保、プログラム終了、乱数生成
#include <string.h> //文字列のコピー・比較
#include <math.h> //sin、sqrtなどの数学計算Code language: HTML, XML (xml)

ANSI規格が登場する前は、UNIXとWindowsで画面出力関数の記述方法が異なり、OSを切り替えるとコードがエラーを吐いていました。標準ライブラリ登場後は、printf("hello")と記述するだけでWindows・Linux・Macすべての環境で修正なしに動作し、開発者の負担が大幅に軽減されると同時にC言語の普及が加速しました。

標準ライブラリは何で開発されているのか?

大半の機能はC言語で実装されていますが、一部にアセンブリ言語などが活用されています。

文字列コピーのstrcpy、数値計算、メモリ複製といったハードウェアに直接触れない関数は、ほぼすべて純粋なCコードで記述されています。

OSやハードウェアと直接やり取りする処理はC言語単体では実装できないため、補助的な言語、主にアセンブリ言語と組み合わせて開発されています。

六、移植性と型安全性

同一のソースコードは、少しの修正、あるいは無修正で各種OS上でコンパイルし、実行ファイルとして動作させることができます。

ここまで読んでC言語の基礎的な知識は身についたと思います。もしまだ理解できていない箇所があっても問題ありません。文字だけの説明では理解しにくい部分も多いため、後の章で実例を交えて段階的に解説します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です