Part2では,「そもそもC/C++についてよくわかっていません」という方のために,C/C++言語に関する素朴な疑問をQ&A形式でお答えします。“今さら人には聞けないなぁ”というような疑問も取り上げていますので,初心者の方でも安心して読んでください。

Q1: C/C++のいいところは何? なぜ普及したの?

 C/C++の最大の魅力は,コンピュータでできることなら,ほとんどどんな種類のプログラムでも比較的簡単に書けることです。

 CがもともとOSを記述するために作られたことは特集1でも触れました。OSの役割をおおざっぱにいうと,ハードウエアの機能を使いやすい形でアプリケーション・ソフトに提供することです。アプリケーション・ソフトは基本的にOSが提供する機能を利用して動くプログラムですから,OSを作れる言語であれば,事実上どんなアプリケーションでも作れることになります。

 パソコンに関していえば,Cの処理系がいくつかのベンダーからコンパイラとして提供されたことも普及の大きな要因でしょう。昔の非力なパソコンでもそこそこ使い物になるアプリケーションを書けるCコンパイラは,パソコンのプログラミング言語といえばBASICインタプリタかアセンブラが当たり前だった時代には画期的な存在だったのです。

 もっとも,OSを開発できるほど強力な記述能力があることが必ずしもいいことばかりとは限りません。使い方を間違えれば,アプリケーションの土台にあるOSをクラッシュさせてしまうようなプログラムを書くこともできるからです。実際に,この点ではC/C++はむしろ少数派です。プログラミング言語の多くは安全性や手軽さを重視しているため,OSの動作に深刻な悪影響を与えるような機能は持っていません。Cの魅力は,見方を変えれば欠点でもあるわけです。


Q2: C/C++をこれから勉強するのはムダ? JavaとかC#のほうがいいの?

 誕生から30年(C++の場合は22年)経った今でも,C/C++はプログラマならぜひともマスターしておきたい言語です。主に利用する言語がJavaやC#になるとわかっている人でも,少なくともCだけはマスターすることをお勧めします。JavaやC#を使う人でも,コンピュータとプログラムの仕組みはきちんと理解しておくべきだからです。Cはそのために最適なプログラミング言語なのです。

 JavaやC#などの言語は,ハードウエアの仕組みをプログラマになるべく見せないことを念頭に作られています。例えば,JavaやC#では文字列を「String型のオブジェクト」として扱います。Stringオブジェクトが保持している文字列は,メモリー上のどこかに置かれているはずですが,それはプログラマには見えません。一方,C言語では文字列を「メモリーの連続した領域に書き込まれたデータ」そのものとして扱います。プログラマはメモリーの何番地にそのデータがあるかということまで知ることができます。JavaやC#のやり方は間違いを減らしやすいのですが,コンピュータがプログラムをどのように処理しているかをうかがい知ることはできません。

 もう一つ重要なのは,C/C++は現役の開発言語として活躍の場がたくさんあることです。Windowsアプリケーションの開発はもちろん,パソコン以外のコンピュータ機器でも実行速度を要求される用途やメモリー容量に余裕のない組み込み機器などで幅広く利用されています。C/C++を学ぶことは決して無駄にはなりません。


Q3: C/C++はプログラミングの勉強に向いてるの? 向いてないの?

 特集1で見たように,C/C++は,開発現場でバリバリと使われている言語ですから,これを学ぶのはとても意義のあることです。そして,もちろんプログラミングの学習にも適しています。変数の型やスコープ,暗黙の型変換,演算の優先順位など,どんなプログラミング言語を使う場合でも役に立つ基本的な機能や概念を学ぶことができます。実際,Cでプログラミングを学んだという開発者はたくさんいます。

 ただし,初心者が最初に学ぶ言語としては,Cは少し難しい部類に入るでしょう。もともとCは,どんなプラットフォームでも使えるように言語仕様がとてもコンパクトになっています。そのため最近の言語と比較すると,標準で用意されている機能は少なく,プログラマに親切な仕組みもあまりありません。例えば,Cには文字列という型がなく,char型の配列で扱うため,必要なメモリー容量を自分で確保したり,ポインタで操作するといったテクニックが必須になります。

 しかし,そうしたテクニックやメモリーに関する知識などを学ぶことができる点もCの長所と言えます。それはあなたのプログラミング・スキル向上に役立つでしょう。もちろん,ほかの言語でプログラミングを始めても構わないのですが,一度はC/C++にチャレンジしてみてください。


Q4: C/C++はどうやって勉強したらいいの?
バイブルのような本があるの?
写真1●プログラミング言語C 第2版。Brian W. Kernighan,Dennis M. Ritchie共著。共著者二人のラスト・ネームから通称“K&R”と呼ばれる
写真1●プログラミング言語C 第2版。Brian W. Kernighan,Dennis M. Ritchie共著。共著者二人のラスト・ネームから通称“K&R”と呼ばれる

 

写真2●プログラミング言語C++ 第3版。Bjarne Stroustrup著。1000ページ超の大作だが,C++プログラマなら座右に置きたい
写真2●プログラミング言語C++ 第3版。Bjarne Stroustrup著。1000ページ超の大作だが,C++プログラマなら座右に置きたい

 C/C++であれ他のプログラミング言語であれ,実際にプログラムを書いて動かしてみることが一番身に付く学習法です。適当な入門書とパソコン1台,それにC/C++コンパイラさえあればすぐに始められます。

 バイブル的な本としては,それぞれの言語の設計者による解説書が有名です。Cは「プログラミング言語C 第2版」(共立出版発行),C++は「プログラミング言語C++ 第3版」(アジソン・ウェスレイ・パブリッシャーズ・ジャパン発行)です(写真1写真2)。これらは,「なぜそのような機能が必要か」「なぜそのようなやり方を採ったか」などの設計思想を設計者自身が説明しています。ただし,プログラミング自体の入門書としてはどちらも難しいかもしれませんので,全くの初心者ならば先にごく簡単な入門書で,ある程度カンを身に付けておくべきでしょう。

 歴史のあるCのほうが入門書は多く,Cの知識はC++でもほぼそのまま役立ちますから,プログラミング自体が初めてという方は,まずCを先に勉強しましょう。Cの文法はとてもシンプルなので,文法自体はすぐにマスターできますし,基本的な入出力なども難なく習得できるはずです。しかし,多くの人は「ポインタ」で習得のペースががっくりと落ちることでしょう。ポインタはCの大きな特徴で,これをマスターできなければCをマスターしたとはいえません。ポインタは,それだけを扱う書籍があるほどの「壁」でもあります。お勧めしたいのは,ポインタの活用が不可欠な,アルゴリズムやデータ構造の勉強を並行して進めることです。実際の利用法を知ることが理解の助けになるからです。

 Cがある程度わかれば,C++の勉強も比較的スムーズに進められるでしょう。特に,「ベターなC言語」としての機能は,構文さえ覚えればすぐにでも利用できます。

 C++の最初の壁はやはりクラスの使い方でしょう。Cの構造体が理解できていれば,構文や機能を頭で理解するのはさほど難しくありません(特集6を参照してください)。しかし,実践の難しさや奥深さはポインタ以上です。オブジェクト指向プログラミングやデザインパターンなどの勉強と並行して実践的な使い方を少しずつ身に付けていくのが着実な上達の助けになるでしょう。


Q5: CとC++の違いは何?

 それぞれの構文の違いで一番最初に目に付くのは,C++ではクラスを使えるようになった点でしょう。当初,C++が「C with Classes(クラス機能の付いたC)」という名前だったのは有名な話です*1。さらに演算子オーバーロードやテンプレートなどもC++の特徴的な機能です。

 また,短い関数の中身をコンパイル時に呼び出し元に直接埋め込んでしまう「インライン関数」や,引数のデフォルト値を指定する機能など,C的な部分にも様々な改良を加えています。

 こうした機能を実現するため,C++はプログラムに現れるデータの型を厳密にチェックする「強い型付け」の言語として設計されています。これは標準化前のCにはなかった考え方で,C++が登場した後に制定されたANSI Cで取り入れられました。現在のCプログラムの多くがC++プログラムとしても正しいのは,C++が互換性に配慮して作られていることに加え,CがC++の影響を受けて進化してきた結果でもあるわけです。

 なお,C++の原典に当たる「プログラミング言語C++ 第3版」(アジソン・ウェスレイ・パブリッシャーズ・ジャパン発行)は巻末付録でCとC++の互換性について一章を割いて詳しく解説しています。