実践C++入門講座こんにちは。本日より「実践C++入門講座」を始めます。原則として、毎週日曜日の夜24:00に公開します。この講座は、C++の特長を活かして高性能なプログラムを書けるようになるための実践的な入門講座にしたいと思います。1.なぜC++?まず初めに、難しいと言われるC++を学ぶメリットについて説明します。C++の特長C++は高速なプログラムを多くのプラットフォーム向けに高い生産性で開発できることが特長です。多数のCPUメーカ、OSベンダー、オープン・ソース・プロジェクトから多種類のコンピュータ用コンパイラとライブラリ(以後、処理系と呼びます)が提供されてますしかも、ワールド・ワイドな標準規格(ISO/IEC)により、多数の実装において比較的高いレベルで仕様が統一されていますこれらの特長により、多くの基幹的なアプリケーション・ソフトウェアや各種ミドルウェアがC++で開発されています。膨大なソフトウェア資産あります。従って、今後も基幹的なソフトウェアや高速性が要求されるソフトウェアの開発にはC++が使われ続けます。C言語との比較C++に近い言語として、C++の前身であるC言語があります。C言語も高速なプログラムを多くのプラットフォーム向けにアセンブラよりは高い生産性で開発できます。C++よりも更に小型のコンピュータ(というよりマイコン)でも使うことができます。近代的なプログラム開発スキーム(オブジェクト指向や各種コンテナ)を使えません。そのため脆弱性の少ない安全なプログラムを開発する苦労は並大抵のものではありません。古い時代に設計され互換性を維持してきた標準ライブラリは歴史的な問題点を多数抱えているため、それを使うために多くの知識(ノウハウ)を必要とします。その結果、標準ライブラリを含めた実用プログラミングの学習難易度は決して低くありません。ところで、C言語で近代的なプログラム開発スキームを使えないのは実は当たり前です。C言語にそれらを追加した言語がC++なのですから。C言語を拡張するのではなくC++という別の言語になったのには理由があります。C言語とC++では狙いが大きく異なるのです。C言語アセンブラ程ではありませんが、C言語は出力されるマシン語コードをプログラマが制御できます。そのような細かい部分の作り込みが必要な分野(OSのカーネルや小型CPUのファームウェアなど)向けです。メモリをギリギリまで節約するとか、ガチガチに高速化するなどの細かい部分をプログラマが制御できます。C++これに対してC++は細かい部分はコンパイラに任せて、プログラマはプログラムのより高度な部分に注力することで高い生産性で開発できます。安全性の高いクラス群をC++の近代的な機能で開発し、それらを用いて短期間で安全かつ機能豊富なアプリケーション・プログラムを開発するのに向いています。C++はC言語仕様をほぼ含んでますのでC言語のような細かい部分を制御するプログラムを書くこともできますが、プログラム全体をC言語スタイルで記述するのではC++を使う意味がありません。最適化が必要な部分のみに限定する使い方が望まれます。このように向き不向きがありますが、習得の容易なC言語でも工数を余分にかければC++分野のプログラムを開発することも可能であるため、C言語とC++のシェアは拮抗しています。近年C++が増えてきつつあり、特にIT技術先進国のアメリカでは既にC++のシェアはC言語のシェアを超えているようです。CとC++のシェアを比較してみました。IndexでもC言語のシェアが急落(-7.73%)していますし、ワールドワイドではC++のシェアが伸びつつ有る様子が伺えます。現在、最も多く使われているプログラミング言語の1つはJavaと思います。JavaはC++よりも更に生産性が高く、かつ、学習が容易になるよう設計されています。これにより多くのプログラマを確保することを狙っています。コンピュータの資源(主にメモリ)を多量に消費するため、小型コンピュータには移植されていません。提供するベンダもC++に比べると少なく稼働するコンピュータも少ないです。(CPUメーカでJava処理系を提供しているところを見たことはありません。)また、速度はJITコンパイラによりC/C++に近づいているという記事も散見されますが、原理的に追いつくことはありえません。これはAndroidとiPhoneのスムーズさの違いに現れてます。(AndroidはJavaでGUI制御しているため、ガベージ・コレクションでひっかかりもっかかりしてしまいます。)そしてJava処理系の基幹部分はC/C++で記述されてます。生産性が重要だが速度はそれほど重要でない部分にはJavaのような生産性の高い言語、速度が重要な部分にはC++のような高速な言語と住み分けるのが適切です。(例えばJava処理系の基幹部分は後者に属します。)ちなみに、複数のプログラミング言語について比較している記事がありました。参考になると思います。C++は難しいか?言語仕様がたいへん大きいため、確かに難しいです。私も未だにマクロ(#define)によるメタ・プログラミングの深い部分は使いこなせません。(ああ、これはC言語からありますね...)そのため、C++は難しいと聞いて最初から断念している人も少なくないと思います。ここへ来られている皆さんはきっとC++を学びたいと思って来られていると思います。