C++
C++は1979年にAT&Tベル研究所のビャーネ・ストロヴストルップさん(Bjarne Stroustrup)が設計に着手し、1985年に最初の商用リリースが行われたプログラミング言語です。C言語のハードウェア制御能力を保ちながら、Simula 67から学んだオブジェクト指向の抽象化機能を加えるという方向性で設計されました。現在はISO/IEC 14882として国際標準化され、ゲームエンジン・組み込みシステム・高性能計算の分野で広く使われています。
名前の由来
C++の名前は、C言語のインクリメント演算子 ++に由来します。i++ は「i を1増やす」という意味で、C++ は「Cを1段階進化させた言語」という言葉遊びの命名です。
当初の名称は「C with Classes」(クラスを持つC)でした。ストロヴストルップさんがSimulaのクラス機能をCに移植することを目標にしていたため、この名前が付けられました。1983年に同僚のリック・マスキッティさん(Rick Mascitti)が C++ という名称を提案し、以降この名前が定着しました。
ストロヴストルップさん自身は後に著書で「++C(前置インクリメント)の方が新しい値を返すので、こちらの方が正確だったかもしれない」と書いています。C言語経験者がニヤッとできる命名の経緯です。
1979年: C with Classesの誕生
1970年代後半、AT&TベルBCPL研究所でUNIXの開発に携わっていたストロヴストルップさんは、分散システムの研究でSimula 67を使っていました。Simula 67はオブジェクト指向プログラミングの概念(クラス・継承・仮想関数)を備えた言語で、大規模なプログラムを抽象化してモデリングする能力は高く評価されていました。しかし、Simula 67は実行速度が遅く、大規模システムの実用途には向いていませんでした。
一方、C言語はUNIXカーネルを書けるほどハードウェアに近く、高速でした。ストロヴストルップさんが求めていたのは「Simulaの抽象化能力とCの実行性能を兼ね備えた言語」です。1979年、彼はC言語にSimulaのクラス機能を組み込んだ「C with Classes」の開発を開始し、1980年には内部で実際に使われ始めました。
初期の「C with Classes」はクラス・基本的な継承・インライン関数・デフォルト引数・強化された型チェックを提供しており、Cpreというプリプロセッサを通じてCコードに変換してからコンパイルする方式でした。
ストロヴストルップさんの設計哲学
ストロヴストルップさんはC++の設計原則を明確に言語化しており、その核心は「コストのない抽象化(zero-cost abstraction)」という考え方にあります。
| 設計原則 | 内容 |
|---|---|
| 使わないものにコストを払わない | 使用しない機能のためにオーバーヘッドが発生しない。例外を使わなければ例外処理のコストはゼロ |
| 使うものは手書きコードと同等か近い性能 | クラス・テンプレートなどの抽象化が、同等のCコードと比較して性能面で大きく劣らない |
| Cとの互換性 | 既存のCコードとの相互運用を重視。C言語の資産(ライブラリ・コード)を活用できるようにする |
| マルチパラダイム | 手続き型・オブジェクト指向・ジェネリック・関数型を組み合わせて使える。スタイルを強制しない |
| プログラマーを信頼する | 制約を加えすぎない。Cと同様に、低水準な操作(ポインタ・ビット演算)を許容する |
この設計哲学はC言語のものと連続しており、「信頼するプログラマーに表現力を渡す」という点で共通しています。Javaが「誤りを防ぐために制限を加える」方向に進んだのと対照的に、C++は「正しく使えば低レイヤーから高レベルの抽象化まで全て書ける言語」を目指しました。
C++の系譜
C++はC言語とSimula 67を源流とし、その後の多くのプログラミング言語に影響を与えました。
| 言語 | C++との関係 |
|---|---|
| Java | C++の構文を受け継ぎながらポインタを排除し、GCとJVM上で動作する安全な言語として設計された |
| C# | MicrosoftがJavaに対抗して開発。C++とJavaの設計を参照しながら.NETプラットフォームに統合した |
| D言語 | C++の複雑さを整理し、GCを持ちながらシステムプログラミングもできる言語を目指した |
| Rust | メモリ安全性をコンパイラ時に保証する所有権モデルを導入し、C++が手動で管理していた部分を言語レベルで解決した |
| Swift | Objective-Cと並んでAppleのエコシステムで使われるが、C++の影響を受けた型推論・ジェネリクスの設計を持つ |
| Python / Ruby | 構文はCとは異なるが、多くの処理系がC/C++で実装されており、拡張モジュールのAPIはC/C++で書く |
主要な歴史的マイルストーン
1979年: C with Classesの開発開始
ストロヴストルップさんがAT&TベルBCPL研究所でSimulaのクラス機能をCに移植するプロジェクトを開始。Cpreというプリプロセッサを通じてCに変換する方式で実装された。
1985年: C++ 1.0の商用リリース
「C with Classes」から「C++」に改名され、最初の商用バージョンがリリースされた。クラス・仮想関数・演算子オーバーロード・参照型・定数などの機能が含まれた。同年、ストロヴストルップさんが著書『The C++ Programming Language』(通称TC++PL)を出版し、言語の普及に大きく貢献した。
1998年: C++98(ISO標準化)
C++が初めてISO/IEC 14882として国際標準化された。STL(Standard Template Library)が標準ライブラリに組み込まれ、コンテナ・アルゴリズム・イテレータという体系が確立した。Hewlett-PackardのAlexander Stepanovさんが設計したSTLの採用は、ジェネリックプログラミングというパラダイムをC++の中心に据えた。
2003年: C++03(軽微な修正)
C++98の技術的な誤りや曖昧さを修正した版。言語機能の追加はなく、仕様の整合性を高めた改訂。
2011年: C++11(モダンC++の出発点)
C++11は13年ぶりの大改訂で、「モダンC++」という言葉が生まれた転換点。追加された主な機能は、ムーブセマンティクス・ラムダ式・auto 型推論・スマートポインタ(unique_ptr / shared_ptr)・範囲for・nullptr・enum class・並行処理ライブラリ(std::thread)など。C++11以前と以降では、書き方が別言語と感じられるほど変わった。
2014 / 2017年: C++14・C++17
C++14はC++11の使い勝手を改善した版(ジェネリックラムダ・std::make_unique など)。C++17は構造化束縛・if constexpr・std::optional・std::filesystem・並列アルゴリズムなどを追加し、標準ライブラリが大きく充実した。
2020年: C++20(4つの柱)
C++11に匹敵する規模の大改訂。コンセプト(テンプレート制約)・レンジ(range-based algorithms)・コルーチン(非同期処理)・モジュール(#include に代わるコード分割)の4機能が追加された。特にコンセプトはテンプレートエラーを劇的に読みやすくした。
2023年: C++23
C++23は大規模な機能追加ではなく、既存機能の使いやすさを改善した版。std::expected(成功または失敗を表す型)・std::print(書式付き出力の近代化)などが追加された。
同時代の言語との比較
| 言語 | 登場 | メモリ管理 | 主な用途 |
|---|---|---|---|
| C言語 | 1972 | 手動(malloc/free) | OS・組み込み・システムツール |
| C++ | 1985 | 手動+RAII(スマートポインタ) | ゲームエンジン・組み込み・高性能計算・大規模アプリ |
| Java | 1995 | GC(自動) | エンタープライズ・Android・Webバックエンド |
| Python | 1991 | GC(参照カウント) | スクリプト・データサイエンス・AI |
| Rust | 2015 | 所有権モデル(GCなし) | システムプログラミング・WebAssembly・組み込み |
現代のC++
ゲームエンジン
Unreal Engine・Unity(一部)・Godot(コア)はC++で実装されています。ゲーム開発では毎秒60フレームを維持するためのリアルタイム性能が必要で、GCによる停止が許容されない場面も多く、C++のRAIIによる決定論的なリソース管理が採用されます。AAA(大手スタジオ)タイトルの大半はC++で書かれています。
組み込みシステム
マイクロコントローラや車載システムでは、リアルタイム応答性・メモリフットプリントの最小化が必要なため、C言語と並んでC++が使われます。ベアメタル環境(OSなし)でも動作できる点が重宝されています。
高性能計算・科学技術
物理シミュレーション・金融計算・機械学習フレームワーク(TensorFlow・PyTorchのC++バックエンド)など、計算速度が直接的に価値に結びつく分野で使われます。
データベース・インフラ
MySQL・PostgreSQL・MongoDB・Apache Kafka・Google Chromeの主要部分はC++で実装されています。大量のデータを高速に処理するインフラソフトウェアには、C++の性能と表現力が今でも重要な選択肢です。
よくある誤解
「C++はC言語の上位互換だ」
「C++はCのスーパーセットだ」という説明が広まっていますが、厳密には正しくありません。初期のC++はCとほぼ互換を保っていましたが、規格が分岐した現在では両者は独立した言語です。CのコードがC++でコンパイルできないケースがあります(void * の暗黙変換、Cのみのキーワード restrict・VLAなど)。共通の祖先を持つ「兄弟言語」と理解するのが実態に近いです。
「C++は難しいから避けるべきだ」
C++が難しいとされる理由の多くは、歴史的に積み重なった複雑さにあります。しかしモダンC++(C++11以降)のサブセットに絞れば、スマートポインタ・auto・範囲for・STLコンテナを組み合わせるだけで多くのプログラムが書けます。C言語同様、「全機能を知らないと使えない」わけではありません。
「Rustに置き換えられる」
RustはC++が持つメモリ安全性の問題にコンパイラレベルで対処した言語で、新規のシステムプログラミング分野での採用が増えています。しかし、数十年にわたって積み重ねられた大規模なC++コードベース(ゲームエンジン・組み込みシステム・金融インフラ)を短期間で置き換えることは現実的ではありません。両者は並存する期間が長く続くとみられています。
関連用語
- クラス / オブジェクト — C++のオブジェクト指向の基本単位
- テンプレート — ジェネリックプログラミングの機能
- スマートポインタ — unique_ptr / shared_ptr / weak_ptr
- RAII — リソース獲得は初期化時に行うという設計パターン
- ムーブセマンティクス — C++11で導入されたコピーを回避する仕組み
- ラムダ式 — C++11で追加された無名関数
- STL — Standard Template Library
- C言語の歴史と系譜 — C++の源流
- Javaの歴史と系譜 — C++から影響を受けた言語
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。