プログラミング言語

C

Dennis Ritchie(ベル研究所) / 1972年登場

OS やドライバ、組込みの土台を作る低レベル言語。ハードウェアに近く高速で、ほぼすべての言語や OS の基礎になっている。

3つの要点
TL;DR
  1. ハードに近い低レベルの手続き型言語。
  2. OS・組込み・他言語処理系の土台。
  3. 速度と制御が要るなら C、安全性重視なら Rust。

基本情報

仕様と特徴

C のロゴ
製品・技術の概要COS やドライバ、組込みの土台を作る低レベル言語。ハードウェアに近く高速で、ほぼすべての言語や OS の基礎になっている。
型付け
静的弱い型付け
実行方式
コンパイルネイティブ)
パラダイム
手続き型
登場
1972年Dennis Ritchie(ベル研究所)
この言語の強み
ハードを直接制御でき非常に高速移植性が高くどこでも動く
活躍する領域
OSカーネルドライバ組込み・マイコン / 高速なライブラリ・処理系

選定ガイド

選定ポイント

採用する理由と、事前に受け入れるべきトレードオフを分けて確認します。

採用に向く条件

選ぶ理由

  1. ハードを直接制御でき非常に高速
  2. 移植性が高くどこでも動く
  3. OS・組込み・基盤の事実上の標準

事前に確認する条件

考慮すべき点

  1. 手動メモリ管理で安全性が低い(領域外参照など)
  2. 標準ライブラリが小さく自前実装が増える
  3. 抽象度が低く生産性は劣る

向いている用途

こんな用途に向く

OS・カーネル・ドライバ組込み・マイコン高速なライブラリ・処理系

詳しい解説

もっと詳しく

どんな言語か

C は 1972 年ごろに Dennis Ritchie がベル研究所で開発した、低レベルの手続き型言語です。当初は UNIX を記述するために作られ、ハードウェアに近い操作をしながらもアセンブリより読み書きしやすい、という絶妙な位置を占めました。半世紀を経た今も、OS・デバイスドライバ・組込み機器の土台として現役で使われています。

「小さくて速い」が本質

C の核心は、言語そのものが極めて小さいことです。余計な仕組みを持たず、メモリ配置やポインタ操作を直接扱えるため、生成されるコードは高速で、ハードウェアの挙動を予測しやすくなります。

横にスクロール

Cソースとヘッダを前処理、コンパイル、アセンブルしてオブジェクトファイルを作り、複数のオブジェクトとライブラリをリンクしてネイティブ実行形式にし、ローダと実行時初期化を経てmainを実行する流れ
Cはソースごとに前処理して翻訳単位を作り、コンパイルとアセンブルで再配置可能なオブジェクトへ変換してから、複数のオブジェクトとライブラリをリンクします。実行時はOSローダと必要に応じた動的リンカがプロセスへ配置し、実行時初期化からmainを呼びます。言語仕様、プラットフォームABI、手動メモリ管理の境界を揃え、警告・静的解析・サニタイザ・テストを重ねます。

加えて、ほぼあらゆる CPU 向けにコンパイラが存在し、移植性が高い点も見逃せません。多くのプログラミング言語の処理系や OS 自体が C で書かれており、現代のソフトウェアの基礎になっています。

仕組み・特徴

  • 手動メモリ管理: mallocfree で確保・解放を自分で行う。GC がなく、いつ何が起きるか予測しやすい反面、責任は開発者にある。
  • ポインタと薄い抽象化: メモリアドレスを直接扱え、ハードウェアレジスタや連続領域を意図通りに操作できる。標準ライブラリは小さく、文字列や配列も自前で慎重に扱う。
  • 広く使われる C ABI: C 標準自体は ABI を定めませんが、各プラットフォームの C ABI は多言語から呼び出す共通の土台(FFI の基準)として使われ、他言語のライブラリが C インターフェースを公開することも多くあります。
  • 標準の進化: C89/C99/C11/C17/C23 と、緩やかに機能追加されつつ後方互換を重視。
#include <stdlib.h>
int main(void) {
    int *a = malloc(4 * sizeof(int)); // 確保したら
    a[4] = 1;                         // 領域外! 検出されないまま壊れる
    free(a);                          // 解放も自分の責任
    return 0;
}

得意・不得意

  • 得意: OS・ドライバ・組込みなど、速度と移植性が要る低レイヤー。他言語の基盤・処理系。
  • 不得意: 高速な大規模アプリ開発。安全網が乏しく、文字列処理や複雑なデータ構造は手間がかかる。

C++ / Rust との違い

観点CC++Rust
規模感小さい・薄い巨大・多機能中〜大・安全重視
メモリ安全自己責任自己責任(RAII で緩和)コンパイル時保証
主用途OS・組込み・基盤ゲーム・大規模高性能安全な基盤・新規開発
移植性極めて高い高い高い

つまずきやすいところ

安全は自分で守る

手動メモリ管理と領域外参照により、バグが静かに潜みます。バッファオーバーフローや解放後利用(use-after-free)は深刻な脆弱性に直結するため、境界チェック・静的解析・サニタイザ(ASan 等)を併用し、危険な関数を避けるのが定石です。新規で安全性を重視するなら Rust なども比較検討します。

総じて C は、小さく速く移植性が高い低レベル言語で、OS から他言語の土台まで現代ソフトウェアの基礎を今も支えています。

言語選定

Cを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

OS・カーネル・ドライバ

比較で見る軸

型付け: 静的・弱い型付け / 実行方式: コンパイル(ネイティブ) / パラダイム: 手続き型

導入後に効く点

移植性が高くどこでも動く

先に潰すリスク

手動メモリ管理で安全性が低い(領域外参照など)

数字・仕様の読み方
型付け
静的・弱い型付け
実行方式
コンパイル(ネイティブ)
パラダイム
手続き型
登場
1972年
Dennis Ritchie(ベル研究所)

判断チェックリスト

  • 自社の用途が「OS・カーネル・ドライバ / 組込み・マイコン」に近いか確認する。
  • 強みである「ハードを直接制御でき非常に高速」が本当に評価軸になるか確認する。
  • 注意点の「手動メモリ管理で安全性が低い(領域外参照など)」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

OS・カーネル・ドライバ組込み・マイコン高速なライブラリ・処理系

最初の一歩

Hello, World!

#include <stdio.h>
int main(void) {
    printf("Hello, World!\n");
    return 0;
}
公式ドキュメント