C言語はきわめて息の長いプログラミング言語です。1960年代終わりから1970年代初頭にかけて誕生し,以後現在に至るまでの30年以上,ずっと第一線で使われ続けてきました。そしてこれからも,C言語とその子供であるC++は現役の言語として使われ続けていくでしょう。なぜならC/C++は,今日のコンピュータ環境に欠くことのできない存在になっているからです。

 図1を見るとわかるように,C/C++はOSからビジネス・ソフトまでありとあらゆるソフトウエアの開発に広く利用されています。その用途は汎用コンピュータ向けプログラムの開発にとどまりません。組み込み機器からスーパー・コンピュータに至る特殊用途のプログラミングまでコンピュータがかかわるあらゆる分野でC/C++が活躍しています。メモリー容量などに大きな制約がある組み込み機器のプログラミングなどは,コンパクトなコードを出力できるC言語はうってつけですし,とことん性能を追求しなければならない用途では,ハードウエアを直接制御できるC言語の特徴が生かせます。

図1●今日のコンピュータ環境はC/C++抜きには成り立たない
図1●今日のコンピュータ環境はC/C++抜きには成り立たない
[画像のクリックで拡大表示]

 C/C++の活躍の幅が広いことは,あらゆる種類のC/C++プログラマが世界中に大勢いることを意味します。それが様々な好循環を呼びます。例えば,開発ツールやライブラリは,C/C++に対応させることが多数のユーザーを獲得することにつながります。それらを開発する技術者たちもC/C++を使っているケースが多いので,ユーザー・ニーズを的確に捉えた使いやすい製品が作られる可能性が高くなります。そして使いやすい環境が整えば,またそれだけC/C++の人気が高まります。

シンプルで高速だったことが普及の要因

 なぜC/C++はこのような好循環を呼ぶことができたのでしょうか。一つの理由は,もちろんC言語自体がプログラミング言語として優れていたからです。

 C言語の構文はとてもシンプルです。入門段階で覚えなければならないことは少なく,すぐにテクニックを磨く段階に進むことができます。ライブラリの使い方や効率の良いコーディング・テクニックなど,覚えれば覚えるほど書けるプログラムの幅が広がります。

 もう一つの理由は,C言語で作られたUNIXがOSとしてはもちろん,プログラミング環境としても優れていたことです。初期のUNIXには,現在のLinuxのようにOSのソースコードとCコンパイラが標準で付属していました。完成品としてこのうえないお手本とすぐに使えるツールが用意されていたことが,普及の一因になったことは間違いありません。

 加えて,UNIXだけでなく,パソコンの世界にもいち早く登場したことが普及を決定付けました。C言語は中核部分がシンプルであるぶん,コンパイラも比較的シンプルに作ることができます。UNIXをパソコンで動かせるようになったのはここ10年ほどのことですが,Cコンパイラはそれよりずっと早くパソコン用に実装されました。しかもC言語で書いたプログラムは,当時のパソコンでは驚くほど高速に動作したのです。BASICインタプリタ全盛の時代からパソコンでプログラミングをしていた人の中には,Cコンパイラに初めて触れたとき,「マシン語で書かなくてもプログラムがこんなに速く動作するなんて!」と衝撃を受けた人もいました。

C/C++の長所はときに短所になる

 ただし,C/C++はいいところばかりではありません。C/C++の長所とされる部分が短所となるケースもあるからです。

 その一つに,C言語は非常に自由度の高いコーディングができることが挙げられます。例えば,if-elseの処理を1行で記述できるC/C++の三項演算子は便利な機能ですが,よく見ないと処理内容がよくわかりません(リスト1)。

リスト1●三項演算子を使ったCプログラムの例。(a)の(1)は,(b)のようなif-elseの処理を三項演算子を使って1行で記述したもの
リスト1●三項演算子を使ったCプログラムの例。(a)の(1)は,(b)のようなif-elseの処理を三項演算子を使って1行で記述したもの
[画像のクリックで拡大表示]

 こうしたC言語の特徴を愛する(または極端に嫌う)世界中の開発者が集まって,わかりにくいCプログラムのコンテスト「IOCCC(The International Obfuscated C Code Contest)」が開かれるほどです(図2)。Webサイトに公開されている入賞作には,一見しただけではC言語で書かれているとは思えないものまであります。コーディングの自由度が高いことは,書き方次第でいくらでもわかりにくいコードを書けてしまうというデメリットでもあるわけです。

図2●IOCCCのWebサイト(台湾にあるミラー・サイトhttp://www.tw.ioccc.org/)。およそ教科書には載っていないような「邪悪な」Cのコードが多数公開されている
図2●IOCCCのWebサイト(台湾にあるミラー・サイト)。およそ教科書には載っていないような「邪悪な」Cのコードが多数公開されている

 また,C/C++の「不親切さ」を批判する人も少なくありません。C/C++は余計な機能を極力省いてある代わりに,必要とあらばプログラマの責任でどのような処理でも記述できるように作られています。OSを記述するためには,ハードウエアの機能を隅から隅まで存分に制御できなければならないからです。

 しかし,様々なプラットフォームが出現し,複雑化した現在のソフトウエア開発では,アプリケーションのプログラミング言語に,そういったハードウエアを直接に制御する機能(“叩く”と表現する人もいます)を持たせるべきではないという考え方のほうが一般的です。その意味でC/C++は,アプリケーションを書くために用いられるプログラミング言語としては型破りな部類に入ります。

メモリー操作はもろ刃の剣

 不親切さの典型的な例が,メモリー管理をプログラマ自身に任せていることでしょう。C/C++プログラムの動的なメモリー操作は,熟練開発者の腕の見せ所でもあるのですが,不慣れな開発者の手にかかると,実行環境が不安定になるメモリー・リークや,ネットワーク・セキュリティの分野でたびたび取りざたされるバッファ・オーバーフローなどが発生する原因になります。

 一方Javaや .NET Frameworkは,C/C++と異なり,ガーベジ・コレクションなどの機能を実行環境に備えることで,メモリー管理の問題に対応しています。メモリー管理が自動化されていたほうが,開発者にとってありがたいアプリケーション分野もあるからです。

 もっとも,.NET Frameworkに対応した拡張言語であるC++/CLIが登場したことで,こういった分野でもいずれC/C++が活躍するようになるかもしれません。C++/CLIは,.NET Frameworkのサブセットであるアプリケーション実行環境CLI(Common Language Infrastructure)で使用するために拡張されたC++です(詳しくはPart3を参照)。C++/CLIを使えば,メモリー管理など,実行環境が備える“親切な”サービスを受けることができます。C++/CLIは,最新のVisual C++である「Visual C++ 2005」に搭載されています。

 米Microsoftは,当初 .NET Frameworkの主力開発言語として新開発のC#を前面に押し出し,大改造が必要になるC++の対応についてはあまり熱心ではありませんでした。それが一転してC++/CLIの開発に踏み切った背景には,やはりC/C++も .NET Frameworkにきっちりと対応させておかないと開発者を取り込めないという読みがあったのかもしれません。いずれにせよ,この点でもC/C++を学ぶ「お得感」は一向に減っていないわけです。

壁を乗り越えてマスターしよう

 C/C++への“入門”は簡単です。無償のC/C++コンパイラがたくさんあるので,適当なものを入手してインストールすればもう準備万端です。

 とはいえ,C/C++は“習熟する”のが難しい言語です。文法を覚えるのは簡単なのですが,その先には理解を妨げる壁がいくつも立ちはだかっているからです。そこで,このPartでは初級レベルを脱出するまでに行き当たるいくつかの難所を重点的に解説します。

 Part2では,「勉強の進め方がわからない」「Javaなら少し勉強したんだけど…」といったC/C++にまつわる素朴な疑問にQ&A形式でお答えします。

 Part3では,無償で提供されているVisual C++ 2005 Express Editionの基本的な使い方を紹介します。「難解なツール」という昔のVisual C++のイメージは最新のVisual C++にはもう当てはまりません。

 Part4は,C言語を学ぶ人なら誰もが行き当たる最初の壁,「ポインタ」を重点的に解説します。ポインタを理解できるかどうかがC言語を使いこなせるかどうかの大きなカギを握っています。一度挫折した人も,今まさに挫折しかかっている人も,Part4を読んで乗り越えてください。

 Part5では,入門書がほとんど一言で済ませてしまうコンパイルから実行ファイル生成までの流れを,エラーの原因を探るという視点で解説します。ぼんやりとしか理解していない方は,この機会に理解を深めましょう。

 Part6はC++を学ぶ人にとっての最初の難所である「クラス」「継承」「多態性」を取り上げます。これらの機能は構文を覚えても実践になかなか結び付きません。簡単なアプリケーションの作成を通じて実際の使い方を身に付けてください。