はじめに
筆者が「C++と組み込み環境」(http://cppemb.blog17.fc2.com/)というブログを書き始めた数年前に比べると,組込み開発の現場でC++が利用されるケースがずいぶん増えてきました.特に大規模な開発でC++の利用機会が多いようです.今後もこの傾向は続くことでしょう.それにともない,Cの経験は豊富だけれども,C++はほとんど使ったことがないというエンジニアも,C++に触れる機会が多くなってきます.
C++は非常に豊富な機能を備えたプログラム言語であり,一朝一夕にマスターできるものではありません.それでも,Cを使いこなせる経験者であれば,C++の機能の多くを使用することはあきらめ,Cの延長上にある導入しやすい機能だけを使った「より良いC」として,今日,明日にでもC++の便利さを享受することができます.しかしさらに,より良いCではなく,本格的にC++を使いこなせるようになれば,他のプログラム言語では決して真似ることができないほどの強力な武器を手に入れることができます.
CもC++も,「プログラマーを信用する」ことを前提としたプログラム言語です.典型的な高級言語の経験しかないプログラマーにとって,Cの敷居は非常に高いものになっています.たとえば,Cの次のような特徴が敷居を高くしてしまっているのでしょう.
- ポインタの使い方を間違うと,簡単にメモリの内容を破壊してしまう.
- 配列の範囲を超えたアクセスや,数値のオーバーフローなど,ランタイムチェックがほとんど行われない.
- メモリ管理をプログラマーが行わなければならない.
- 処理系によってint型のサイズが異なるなど,曖昧な規定が多い.
これらは,使いこなせるものにとっては,Cの短所というよりは長所にもなるものです.しかし,経験の浅い者にとってはとっつきにくいことは確かです.C++も,こうしたCの特徴をそのまま継承しています.さらには,次のような特徴が初心者を悩ませます.
- ソースコード上には何も書いていないところで,関数が呼び出される.
- 突然,関数の枠を飛び越えて分岐してしまう.
- 知らないうちに非常にプログラムサイズが大きくなる.
- 大したことはしていないのに非常に遅い.
Cの特徴が必ずしも短所ではなかったように,C++のこうした特徴も,使いこなせるものにとっては長所にもなりうるものです.要は使い方しだいであり,なぜそうなのかを理解していれば,自在にそれらの特徴を操ることができるようになります.
高い信頼性を持ち,効率の良いプログラムを開発するには,ソースコード上の字句1つ1つが,どのような意味を持ち,コンパイラにどのように解釈され,プラットフォーム上でどのように振る舞うかを把握しておかなければなりません.こうした知識がなければ,ソースコードレビューの際に一目で見つけられるような不具合を,何日もかけてデバッグする羽目になります.
本書では,こうした観点から,C++というプログラム言語の詳細を解説することに努めました.「組込み向け」の書籍であるにもかかわらず,ハードウェアの制御,通信プロトコル,リアルタイムOSなどの話題はほとんどありません.それらについては,Cを用いた解説書が豊富にあり,C++を用いたとしてもやるべきことはほとんど変わらないからです.そうしたことに紙面を割くよりは,C++プログラムの振る舞いを,アセンブリ言語のレベルで理解できることを目指すほうが得策と考えました.
これからC++を始めようとするエンジニアの手引きとして,また,C++プログラムの不可解な現象を目の当たりにして,デバッガの前で立ちすくむエンジニアのトラブルシューティングとして,本書をお役立ていただければ幸いです.
平成21年2月 高木信尚