C言語:C90から最新規格までの主要な変更点

技術的備忘録

C99

  1. インライン関数

    • inline キーワードが導入され、関数呼び出しのオーバーヘッドを減らせるようになりました。
  2. 可変長配列(VLA)

    • 実行時に大きさが決定される配列を宣言できるようになりました。
    int n = 10;
    int arr[n];  // nの値に基づいて配列のサイズが決定される
    
  3. 複素数型

    • complex.h ヘッダーが導入され、複素数の操作がサポートされました。
  4. 可変引数マクロ

    • マクロで可変数の引数を扱えるようになりました。
    #define debug(...) printf(__VA_ARGS__)
    
  5. long long int

    • より大きな整数を扱える型が導入されました。
  6. 柔軟な配列メンバー

    • 構造体の最後のメンバーとして、サイズが未定義の配列を宣言できるようになりました。
  7. // コメント

    • 一行コメントがサポートされました。
  8. ループ中での変数宣言

    • for文の初期化部分で変数を宣言できるようになりました。
    for (int i = 0; i < 10; i++) { /* ... */ }
    
  9. restrict キーワード

    • ポインタの最適化のためのキーワードが導入されました。
  10. 指定初期化子

    • 構造体や配列の特定の要素を初期化できるようになりました。
    int arr[6] = {[3] = 5, [5] = 2};
    

C11

  1. マルチスレッドサポート

    • threads.h ヘッダーが導入され、スレッドの作成と管理がサポートされました。
  2. アトミック操作

    • stdatomic.h ヘッダーが導入され、アトミック操作がサポートされました。
  3. ジェネリックな選択式

    • _Generic キーワードが導入され、型に基づいて式を選択できるようになりました。
  4. 匿名構造体とユニオン

    • 構造体やユニオン内で名前のない構造体やユニオンを定義できるようになりました。
  5. 静的アサーション

    • _Static_assert が導入され、コンパイル時にアサーションを行えるようになりました。
  6. alignas 指定子

    • 変数やデータ型のアライメントを指定できるようになりました。
  7. noreturn 関数指定子

    • 関数が戻らないことを明示できるようになりました。
  8. char16_tchar32_t

    • Unicode文字を扱うための新しい文字型が導入されました。

C17

  1. より安全な文字列関数

    • gets 関数が削除され、代わりに gets_s が推奨されるようになりました。
  2. 各種のバグ修正と明確化

    • 主に既存の機能の修正と仕様の明確化が行われました。

C2x(開発中)

  1. ラムダ式(提案段階)

    • 関数型プログラミングのサポートが強化される可能性があります。
  2. 属性構文の統一(提案段階)

    • 属性の記述方法が [[]] に統一される可能性があります。
  3. defer 文(提案段階)

    • リソースの解放を自動化する機能が提案されています。

これらの変更により、C言語はより安全で、表現力豊かな言語になってきています。

C言語の進化:C90から現在までの分析

変化の程度

  1. 基本的な構造の維持

    • C言語の核となる構文や概念(関数、ポインタ、構造体など)は大きく変わっていません。
    • これにより、古いコードの互換性が高く保たれています。
  2. 段階的な機能追加

    • 新しい機能は慎重に、そして段階的に追加されてきました。
    • これは、言語の安定性と信頼性を維持するための戦略です。
  3. 他言語との比較

    • C++、Java、Pythonなどと比較すると、Cの変化は確かに穏やかです。
    • これらの言語は、オブジェクト指向プログラミングやジェネリックプログラミングなど、 パラダイムシフトを伴う大きな変更を経験しています。

主要な変更点

  1. C99の影響

    • 可変長配列、インライン関数、複素数型など、プログラミングスタイルに影響を与える機能が追加されました。
    • これらの機能は、より柔軟で効率的なコーディングを可能にしました。
  2. C11の重要性

    • マルチスレッディングとアトミック操作のサポートは、現代のハードウェアに適応するための重要な一歩でした。
    • これにより、Cは並行プログラミングにおいてより競争力を持つようになりました。
  3. 安全性と型チェックの強化

    • C99以降、型チェックが厳格化され、より安全なコーディングが促進されています。
    • C11では、_Static_assertのような機能が追加され、コンパイル時のチェックが強化されました。

変化の影響

  1. プログラミングスタイルへの影響

    • 新しい機能(特にC99の機能)により、より表現力豊かなコーディングが可能になりました。
    • しかし、多くの開発者は依然として「古典的な」Cスタイルを好む傾向があります。
  2. 互換性の維持

    • 新しい機能のほとんどはオプショナルであり、古いコードの互換性は高く保たれています。
    • これは、組込みシステムや長期メンテナンスが必要なプロジェクトにとって重要です。
  3. 他言語との関係

    • CはC++やRustなどの言語の基礎となっており、これらの言語との相互運用性が重視されています。
    • しかし、これらの言語と比べると、Cの進化は控えめです。

結論

C言語は確かに進化してきましたが、その変化は他の主要なプログラミング言語と比べると控えめです。 これは、言語の安定性、信頼性、そして広範な既存コードベースとの互換性を維持するための意図的な戦略です。 しかし、新しい機能の追加により、現代のプログラミングのニーズにも対応しようとしています。

C言語の進化は、「革命」というよりも「進化」と表現するのが適切でしょう。 基本的な哲学と設計原則を保ちながら、徐々に、しかし着実に現代のプログラミングの要求に適応してきたのです。

これもClaude3.5に書いて貰った記事です

前回のC#,Java,C++に続いて、C言語でも同様の記事を書いてもらいました。
しばらく、こうやってClaude3.5でいろいろ試して見ます。

ではまた。

タイトルとURLをコピーしました