本記事では、C言語のバージョンについて解説します。
バージョンの種類
2024年においては、C言語の主要なバージョンは以下の5種類です。
- K&R C
- ANSI C(C89/C90)
- ISO C(C99)
- C11
- C17/C18
- 1978年K&R C
デニス・リッチーとブライアン・カーニハン
- 1989年ANSI C(C89/C90)
アメリカ国家規格協会(ANSI)と国際標準化機構(ISO)
- 1999年ISO C(C99)
国際標準化機構(ISO)
- 2011年C11
国際標準化機構(ISO)
- 2018年C17/C18
国際標準化機構(ISO)
K&R C
最初のバージョンであるK&R Cは、1978年にデニス・リッチーとブライアン・カーニハンによって開発されました。
このバージョンは、C言語の基本的な構文やデータ型 (int、char、floatなど)、ポインター操作、構造体の導入など、現代のC言語の基盤を築いたものです。
ただし、この時点でのC言語はまだ標準化されておらず、コンパイラによって挙動が異なることがありました。
ANSI C(C89/C90)
ANSI C (C89/C90)は、1989年にアメリカ国家規格協会(ANSI)と国際標準化機構(ISO)によって開発され、C言語の初めての標準化を代表します。
この標準化により、関数プロトタイプの導入、標準ライブラリの大幅な強化、void型の導入、ヘッダファイルの標準化などが行われました。これにより、C言語はより厳格かつ移植性の高い言語へと進化しました。
ISO C(C99)
ISO C(C99)は、1999年に国際標準化機構(ISO)によって開発されたC言語の機能を大幅に拡張したバージョンです。
ここでは、関数内での変数宣言の場所をより柔軟にする、新しいデータ型(long long int、_Boolなど)の導入、インライン関数のサポート、可変長配列、単一行コメント(//)のサポートなどが加わりました。
これらの改善により、C言語はより現代的で多機能なプログラミング言語へと成長しました。
C11
C11は、2011年にアップデートされた現代的なプログラミングの要求に応えるための新しい標準です。
このバージョンでは、マルチスレッディングのサポート、_Genericキーワードによるジェネリックプログラミングの導入、匿名構造体と共用体のサポート、静的アサーションの追加などが行われました。
これらの機能により、C言語はより強力かつ柔軟な言語へと進化しました。
C17/C18
最新のバージョンはC17(またはC18)で、2018年にアップデートされました。
主に以前のバージョンでのバグ修正と言語仕様の明確化に焦点を当てています。
新しい機能の大幅な追加はないものの、このバージョンはC言語の安定性と移植性を向上させることに貢献しました。
マルチスレッディングについて
C言語で公式にマルチスレッディングがサポートされたのはC11ですが、それ以前のC言語バージョンでも並行処理や並列処理は可能でした。
ただし、このような処理は通常、OSのAPIやサードパーティのライブラリを利用して実現されていました。
OSのAPIの利用
WindowsではWin32 API、UNIX系OSではPOSIX Threads(pthreads)を使用して、マルチスレッディングを実装していました。
サードパーティライブラリ
Boost(C++用ですが、Cプロジェクトでの使用事例もあり)や他のスレッドライブラリを使用してマルチスレッドを実現することも可能です。
プロセスベースの並行性
プロセス間通信(IPC)を使用し、複数のプロセスを起動して並行処理を行う方法もありました。
C言語のバージョンとコンパイラのバージョンの違い
混同しやすいですが、「C言語のバージョン」と「コンパイラのバージョン」は異なる概念です。
C言語のバージョン
定義
C言語のバージョンは、言語自体の標準仕様のバージョンを指します。
内容
各バージョンは、C言語の文法、データ型、標準ライブラリ、プログラミングの概念など、言語の基本的な構造と機能を定義しています。
目的
標準化されたバージョンは、プログラマーが異なる環境やプラットフォーム間で互換性のあるコードを書くのを助けます。
コンパイラのバージョン
定義
コンパイラのバージョンは、C言語をコンパイルするための特定のソフトウェア(コンパイラ)のリリースバージョンを指します。例えばGCC(GNU Compiler Collection), Clang, MSVC(Microsoft Visual C++)などがあります。
内容
コンパイラの各バージョンは、特定のC言語のバージョンをサポートし、追加の最適化、機能、プラットフォーム固有の拡張などを提供します。
目的
コンパイラは、C言語のコードを実行可能なバイナリに変換する役割を持ちます。異なるコンパイラは、パフォーマンス、エラーチェック、デバッグ機能などにおいて異なる特性を持ちます。
コンパイルについては以下の記事で解説しているので、もしよければ参考にしてみてください。
まとめ
C言語のバージョンについて見てきました。C17/C18などの新しいバージョンの方が高機能だと思われますが、C言語で書かれたシステムは古いシステムも多く、古いバージョンが使用されているものも多いです。
そのため、バージョンにこだわらずに使いこなせるようになっておくことで、様々な開発に対応できると思います。