一文で言うC++
C++は静的型付けのコンパイル型プログラミング言語で、あなたのソースコードをネイティブな機械語へ直接変換します。この一つの設計上の選択——インタープリタもなく、プログラムとCPUの間に仮想マシンも置かない——こそが、C++が書ける言語の中で最も速いものの一つである理由であり、絶対に遅くてはならないソフトウェアを支えている理由です。
お決まりの最初のプログラムです。ここでそのまま実行してみましょう。
スクリプト言語よりも構造が多いですが、これは意図的なものです。C++は、明示的に書くことと引き換えに精密な制御を与えてくれます。これらの一つ一つを、この先の数ページで順に解きほぐしていきます。
C++が速い理由
ほとんどのスクリプト言語は、実行時に命令を読み取って実行するインタープリタや仮想マシンを通してコードを動かします。C++はそのすべてを省きます。
- コンパイラ(
g++やclang++など)が.cppのソースを読み取り、特定のプロセッサとオペレーティングシステム向けの機械命令へ翻訳します。 - その結果が、CPUが直接実行する単体の実行ファイルです。あなたのコードとハードウェアの間には何も介在しません。
プログラムの実行中に翻訳が一切行われないため、C++のプログラムは瞬時に起動し、プロセッサの全速力で動きます。さらに、より高水準の言語があえて隠しているメモリやハードウェアへのきめ細かな制御も手に入ります。
トレードオフは、その機械語が一つのプラットフォーム向けにビルドされる点です。Windowsでコンパイルした実行ファイルはMacでは動きません——ターゲットごとにソースを再コンパイルします。(これは、どのJVMでも動く可搬性のあるバイトコードへコンパイルするJavaとは対照的です。)
静的型付けとマルチパラダイム
二つの性質が、C++のコードの見た目と感触を形づくります。
静的型付けとは、すべての変数がコンパイル時に分かる型を持ち、プログラムが動き出す前にコンパイラがあなたの型をチェックする、という意味です。
countは生涯ずっとintです。そこに"hello"を入れようとすればコンパイルが通りません。これは、最初に多めに書く手間と引き換えに、丸ごと一群の間違いを早期に捕まえてくれます。
マルチパラダイムとは、C++が一つのスタイルをあなたに強制しない、という意味です。素朴な手続き型のコードを書くことも、ロジックをクラスにまとめること(オブジェクト指向)も、汎用で再利用できるコードのためにテンプレートを使うこともできます。実際のプログラムのほとんどは、この三つを混ぜて使います。この柔軟性は強力ですが、その分C++には学ぶべき範囲が広いという意味でもあります——一度に一つの概念ずつ進めていきましょう。
C++の用途
C++は、性能と制御が譲れないところならどこにでも顔を出します。
- ゲームエンジン - Unreal Engine、Unityのコア、そしてほとんどのAAAゲームのコード。
- システムソフトウェア - オペレーティングシステム、デバイスドライバ、ChromeやFirefoxのようなブラウザ。
- 高性能サービス - マイクロ秒が物を言うデータベース、取引システム、検索インフラ。
- 組み込みとハードウェア - 自動車、ドローン、医療機器、IoT向けのファームウェア。
あるソフトウェアが速くなければならない、限られたメモリに収まらなければならない、あるいはハードウェアと直接やり取りしなければならないなら、それがC++で書かれている可能性は十分にあります。
C++はCではない(でもそこから始まった)
C++は1980年代にCから「クラス付きのC」として育ち、今もそのほとんどがスーパーセットのままです——多くの正しいCコードがC++としてコンパイルできます。とはいえ、言語はそれ以来途方もなく大きく成長しました。
C++は、オブジェクト指向プログラミング、汎用コードのためのテンプレート、参照、例外、そして出来合いのツールが詰まった豊富な標準ライブラリを追加します。次のコードはそのうちの一つ、vectorを使っています——自前でメモリを管理するサイズ変更可能な配列で、Cでは手作りしなければならないものです。
モダンなC++(C++11、C++17、C++20の規格)は、言語をCのルーツよりも安全で表現力豊かにするために、こうしたツールに大きく頼っています。初心者にありがちな間違いは、標準ライブラリがすでに問題を解決してくれているのに、CスタイルのC++——手動のメモリ管理、いたるところに生の配列——を書いてしまうことです。このドキュメントを通して、私たちはモダンなスタイルを優先していきます。
次へ:C++のインストール
自分のマシンでC++を書いて実行するには、コンパイラが必要です——たいていはg++(GCCの一部)、clang++、またはWindowsならMSVCツールチェーンです。次のページでは、そのうちの一つをインストールし、ターミナルから動作することを確認する手順を案内します。
よくある質問
C++は何に使われますか?
C++は、速度と制御が重要なソフトウェアを支えています。ゲームエンジン(Unreal、Unityのコア)、オペレーティングシステム、ブラウザ(Chrome、Firefox)、データベース、取引システム、組み込みデバイスなどです。その強みは、クラス・テンプレート・標準ライブラリといった高水準の機能を備えつつ、ハードウェアに近いところで動作できる点にあります。
C++はコンパイル型ですか、それともインタープリタ型ですか?
C++はコンパイル型です。g++やclang++のようなコンパイラが、あなたのソースコードを特定のCPUとオペレーティングシステム向けのネイティブな機械語へ直接翻訳し、単体で動く実行ファイルを生成します。プログラムとプロセッサの間にインタープリタも仮想マシンも介在しません。だからこそC++はとても速いのです。
CとC++の違いは何ですか?
C++は「クラス付きのC」として始まり、そのほとんどがCのスーパーセットなので、たいていのCコードはC++としてコンパイルできます。大きな追加点は、オブジェクト指向プログラミング(クラスと継承)、テンプレート、標準ライブラリ(vectorやmapのようなコンテナ)、参照、例外、そしてCにはない数多くの安全性・利便性のための機能です。