現代のコンピューティングの基礎を築いたC言語は、単一の仕様書から始まったわけではなく、数十年にわたる標準化のプロセスを経て進化してきました。初期の非公式な仕様から、ANSI(米国国家規格協会)やISO(国際標準化機構)、IEC(国際電気標準会議)による厳格な標準規格へと移行することで、異なる環境間での互換性と信頼性が確保されてきました。
一般的に「ANSI C」と呼ばれる呼称は、最初の標準を策定したANSIに由来しますが、現在はISO/IECが主導して改訂を行っています。開発者の間では、中立的に「標準C(Standard C)」や「ISO C」と呼ばれることもあります。
Key Facts
- K&R C:1978年に出版された書籍に基づく最初の非公式仕様。
- C89/C90:ANSIおよびISOによって策定された最初の正式な標準規格。
- C99:
long long型や//形式のコメントなど、多くの現代的な機能が導入された重要な版。 - C11:マルチスレッドAPI(threads.h)やアトミック型などの並行処理サポートを追加。
- C23:2024年10月に公開された最新の標準規格。
C言語の黎明期と標準化の始まり
非公式仕様としてのK&R C
C言語の初期の指針となったのは、1978年にブライアン・カーニハンとデニス・リッチーによって執筆された書籍『The C Programming Language』でした。これは正式な規格ではありませんでしたが、事実上の標準(デファクトスタンダード)として広く利用され、「K&R C」や「C78」と呼ばれています。
ANSIによる標準化への道
言語の普及に伴い、厳格な仕様の必要性が高まりました。1983年にANSIは委員会「X3J11」を設立し、標準仕様の策定に着手します。1985年(C85)と1986年(C86)にドラフト版がリリースされ、1988年にはプリリリース版(C88)が公開されました。
そして1989年、ついに「ANSI X3.159-1989」として正式に批准されました。これが「ANSI C」または「C89」として知られる最初の標準です。
ISOへの移行と機能拡張(C90からC95まで)
C89の標準は、フォーマットのみが変更され、1990年にISO/IEC 9899:1990として採択されました。実質的に内容は同一であるため、「C89」と「C90」はほぼ同じ言語を指します。なお、これらの規格は現在はどちらの団体からも撤回されています。
C94/C95による機能補完
1995年には、ISO/IEC 9899:1990の修正案(Amendment 1)が公開されました。これは「C94」または「C95」と呼ばれ、主に以下の機能が追加されました。
<wchar.h>および<wctype.h>の導入による、マルチバイト文字とワイド文字のサポート強化。- ダイグラフ(代替文字組み合わせ)の導入。
- 演算子の代替表記を可能にする標準マクロの定義(例:
&&の代わりに使用するもの)。 - 規格バージョンを識別するための
__STDC_VERSION__マクロの導入。
このバージョンでは、マクロ値(199409L)と公開年(1995年)が異なるため、呼称が分かれることとなりました。
現代的なC言語への進化(C99からC11まで)
C99:大幅な機能拡充
2000年にANSIが採択したISO/IEC 9899:1999(C99)は、言語に劇的な変化をもたらしました。主な変更点は以下の通りです。
- 新データ型:
long long、_Bool、_Complex、_Imaginaryの追加。 - 言語機能の強化:可変長配列(VLA)、指定初期化子、複合リテラル、
restrictキーワード、可変引数マクロなどの導入。 - ライブラリの拡充:
stdint.hやcomplex.hなどの新しいヘッダーファイルの追加。 - C++との親和性向上:インライン関数や
//形式の1行コメント、宣言とコードの混在を許可。 - 安全性の向上:暗黙的な関数宣言や
implicit intなどの危険な機能の削除。
また、C99の修正版(Cor 3:2007)では、セキュリティ上のリスクが高いgets関数が非推奨となりました。
C11:並行処理と汎用性の追求
2011年12月8日に批准されたC11では、現代的なハードウェアへの対応が進みました。Unicodeサポートの改善に加え、_Genericキーワードによる型汎用式、threads.hによるクロスプラットフォームなマルチスレッドAPI、およびstdatomic.hによるアトミック型のサポートが導入されました。
最新の動向と今後の展望(C17からC2Yまで)
C17(2018年6月公開)は、新機能の追加ではなく、C11に存在した欠陥の修正に特化したバージョンです。その後、2024年10月に最新の標準であるC23が公開されました。
さらに、2020年代後半のリリースを目指して、次期改訂版である「C2Y」の策定が進められています。
その他の技術報告書(TR)と仕様書(TS)
標準規格以外にも、ISO/IECは特定の用途に向けた技術報告書(TR)や技術仕様書(TS)を公開しています。
| 文書番号 | 主な内容 | ステータス |
|---|---|---|
| TR 19769:2004 | Unicode変換形式のライブラリ拡張 | C11に統合 |
| TR 24731-1:2007 | 境界チェック付きインターフェース | C11に統合 |
| TR 18037:2008 | 組み込みC言語拡張 | 公開済み |
| TS 17961:2013 | C言語におけるセキュアコーディング | 公開済み |
| TS 18661シリーズ | 浮動小数点演算(バイナリ/十進)の互換性 | 一部継続開発中 |
現在は、TS 18661の最終パートや、ソフトウェアトランザクショナルメモリ、並列ライブラリ拡張などの新しい仕様が開発段階にあります。
Frequently Asked Questions
C89とC90に違いはありますか?
実質的な違いはありません。C89はANSIによる標準であり、C90はそれをISO/IECがフォーマットのみ変更して採択したものです。どちらもほぼ同一の言語仕様を指します。
C94とC95という2つの呼び方があるのはなぜですか?
この規格の内部バージョン(__STDC_VERSION__)が1994年であるのに対し、実際に公開されたのが1995年であったため、両方の年号が使われるようになりました。
C17で追加された新機能は何ですか?
C17では新しい言語機能は追加されていません。主な目的はC11規格に含まれていた不具合や欠陥の修正(バグフィックス)でした。
C23はいつ公開されましたか?
C23は2024年10月に公開され、現在のC言語の最新標準となっています。
C2Yとは何ですか?
C2Yは、2020年代後半にリリースされる予定の次期C言語標準に対する非公式な名称です。