C言語入門

歴史

C 言語はもともと Unix システムの開発ツールとして発明されました。

1969 年、米国ベル研究所のケン トンプソンとデニス リッチーは Unix オペレーティング システムを開発しました。 Unix はアセンブリ言語で書かれており、他のコンピュータに移植できないため、高級言語で書き直すことにしました。しかし、当時の高級言語ではその要件を満たすことができなかったため、トンプソンは BCPL 言語に基づいて B 言語を発明しました。

1972 年に、デニス リッチーとブライアン カーニハンは、B 言語に基づいて新しい言語を再設計しました。そのため、この新しい言語は C 言語と呼ばれました。

1973 年に、Unix システム全体が C で書き直されました。それ以来、この言語は急速に普及し始め、さまざまなオペレーティング システムやシステム ソフトウェアの開発に広く使用されています。

1988 年に、米国規格協会 (ANSI) が C 言語を正式に標準化し、C 言語の安定性と標準化が始まりました。

数十年経った今でも、C 言語は最も広く使用されている人気のシステム プログラミング言語の 1 つであり、Unix および Linux システムは依然として C 言語を使用して開発されています。

C言語の特徴

C言語が長く繁栄し、広く応用されている主な理由は、C言語がいくつかの独特な特徴を持っているからです。

(1) 低級言語

C 言語は、ハードウェアを直接操作したり、メモリを管理したり、オペレーティング システムと通信したりすることができるため、非常に底辺に近い言語、つまり、必要なプログラムを作成するのに非常に適しています。ハードウェアと対話し、非常に高いパフォーマンス要件を必要とします。

(2) 携帯性

C 言語は元々、Unix システムを他のコンピュータ アーキテクチャに移植するために設計されました。これにより、最初から移植性が非常に高く、C プログラムをさまざまなハードウェア アーキテクチャやオペレーティング システムに比較的簡単に移植できます。

C言語は、移植性の良さから、現在ではコンピュータだけでなく、自動車、カメラ、家電などの基盤となるシステムのプログラミング言語としても使われています。

(3) シンプルさ

C 言語の構文は比較的単純で、文法規則はそれほど多くなく、糖衣構文はほとんどありません。一般に、2 つの構文でほぼ同じことを実現できる場合、C 言語では 1 つだけを提供するため、言語の複雑さが大幅に軽減されます。

また、C 言語の構文は基本的な構文であり、高度なデータ構造は提供されていません。たとえば、C 言語には「クラス」が存在せず、複雑なデータ構造を自分で構築する必要があります。

(4) 柔軟性

C 言語はプログラマにほとんど制限を設けません。プログラマーは自分たちが何をしているのかを知っており、ユーザーがさまざまな危険な操作を行うことを制限しないことを前提としています。その結果についてはユーザーが責任を負います。

C 言語の哲学は、「プログラマを信頼し、邪魔をしない」です。たとえば、プログラマが自分でメモリを管理できるようにしますが、自動メモリ クリーニング機能は提供しません。また、型チェック、配列の負のインデックスチェック、ポインタ位置チェックなどの保護手段は提供されていません。

一見、これは危険に思えるかもしれませんが、上級プログラマにとっては、プログラミングの自由度が高まります。ただし、これにより C 言語でのデバッグも容易ではなくなります。

(5) まとめ

上記の特性により、C 言語は非常に高いパフォーマンスでプログラムを作成し、ハードウェアの可能性を最大限に活用することができ、C 言語コンパイラの実装は比較的簡単です。しかしその一方で、C 言語のコードはエラーが発生しやすく、一般のプログラマーにとって適切に記述するのは容易ではありません。

さらに、C++、Java、C#、JavaScript など、現代の人気言語の多くは C 言語に基づいています。 C言語をしっかり学ぶと、これらの言語への理解が深まります。

C言語バージョン

歴史的に、C 言語には多くのバージョンがありました。

(1)K&RC

「K&R C」は、C 言語のオリジナル バージョンを指します。 1978 年、C 言語の発明者であるデニス リッチーとブライアン カーニハンは、有名な教科書「The C Programming Language」を共著しました。 C 言語には明文化された構文標準がないため、この本は標準として認識されており、このバージョンは著者 2 人の姓の頭文字をとって「K&R C」と呼ばれています。

(2) ANSI C (C89 または C90 とも呼ばれます)

C 言語の元のバージョンは非常に単純で、多くの状況の記述が非常に曖昧です。また、C 構文は依然として急速に発展しており、C 言語の標準化を求める声はますます高まっています。

1989 年に、米国規格協会 (ANSI) は一連の C 言語標準を開発しました。 1990 年に、国際標準化機構 (ISO) がこの規格を採用しました。これは「ANSI C」と呼ばれ、リリースされた年によっては「C89」または「C90」と呼ばれることもあります。

(3)C95

1995 年に、米国規格協会はマルチバイト文字とワイド文字のサポートを追加することで 1989 年の標準を補完しました。このバージョンは C95 と呼ばれます。

(4)C99

1999 年に行われた C 言語標準の最初のメジャー リビジョンでは、二重スラッシュ (//) コメント構文などの多くの言語機能が追加されました。このバージョンは C99 と呼ばれ、現在最も人気のある C のバージョンです。

(5)C11

2011 年に、標準化団体は C 言語を再度改訂し、Unicode とマルチスレッドのサポートを追加しました。このバージョンは C11 と呼ばれます。

(6)C17

C11 標準には 2017 年にパッチが適用されましたが、リリースされたのは 2018 年でした。新しいバージョンは、C11 の欠点の一部を解決するだけで、新しい機能は導入されていません。このバージョンは C17 と呼ばれます。

(7)C2x

標準化団体は C 言語の次期バージョンについて議論しており、2023 年に採用される可能性が高いと言われており、そのときのバージョンは C23 と呼ばれます。

C言語のコンパイル

C言語はコンパイル言語であり、ソースコードはテキストファイルなので単独で実行することはできません。バイナリ実行可能ファイルを実行するには、コンパイラを使用してバイナリ実行可能ファイルを生成する必要があります。コンパイラがコードをテキストからバイナリ命令に変換するプロセスは、コンパイル フェーズと呼ばれ、「コンパイル時」とも呼ばれ、実行フェーズ (「ランタイム」とも呼ばれます) とは区別されます。

現在、最も一般的な C 言語コンパイラは、Free Software Foundation によって立ち上げられた GCC コンパイラであり、無料で使用できます。このコンパイラは本書でも使用されています。 Linux および Mac システムでは GCC を直接インストールでき、Windows システムでは MinGW をインストールできます。ただし、それほど面倒な作業をする必要はありません。Web ページ上で直接 C コードの実行をシミュレートして結果を表示できるオンライン コンパイラーが 2 つあります。

この本の例は、GCC を使用してコマンド ラインからコンパイルされています。

ハローワールドの例

C 言語のソース コード ファイルは通常、接尾辞 .c で終わります。以下は、単純な C プログラム hello.c です。これは単なる通常のテキスト ファイルであり、任意のテキスト コンパイラを使用して作成できます。

#include <stdio.h>

int main(void) {
  printf("Hello World\n");
  0を返します。
}

上記のプログラムの唯一の機能は、画面に「Hello World」を表示することです。

ここでは、これらのコードが何を意味するかについては説明しません。C コードをどのようにコンパイルして実行するかを皆さんに見てもらうための例として示します。 GCC コンパイラーがインストールされていると仮定すると、コマンド ラインを開いて次のコマンドを実行できます。

$ gcc hello.c

上記のコマンドは、gcc コンパイラを使用して、ソース ファイル hello.c をバイナリ コードにコンパイルします。 「$」はコマンドラインプロンプトであり、実際に入力する必要があるのは「$」の後の部分であることに注意してください。

このコマンドを実行すると、コンパイル済みの製品ファイル「a.out」(アセンブラ出力の略称、Windows プラットフォームでは「a.exe」) がデフォルトで現在のディレクトリに生成されます。このファイルを実行すると画面に「Hello World」と表示されます。

$ ./a.out
こんにちは世界

GCC の -o パラメータ (output の略語) は、コンパイルされた製品のファイル名を指定できます。

$ gcc -o hello hello.c

上記のコマンドの -o hello は、コンパイルされた製品のファイル名が hello であることを指定します (デフォルトの a.out を置き換えます)。コンパイル後、hello という名前の実行可能ファイルが生成されます。これは、a.out の名前を指定するのと同じです。このファイルを実行すると同じ結果が得られます。

$ ./こんにちは
こんにちは世界

GCC (標準の略称) の -std= パラメータは、どの C 言語標準に従ってコンパイルするかを指定することもできます。

$ gcc -std=c99 hello.c

上記のコマンドは、C99 標準に従ってコンパイルを指定します。

パラメータを接続するには、上記の -o のようなスペースを使用するのではなく、-std の後に = を使用する必要があることに注意してください。また、= の前後に余分なスペースを含めることはできません。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0