ビジネス WinDbgアプリケーション開発技術 イメージロード(ユーザモードとカーネルモード)


「分かりやすさ」とC++コード

 今回は、「分かりやすさ」という視点から、「Cの世界」と「C++の世界」を比較します。前回は次のようなC++ソースコードをご覧頂きました。
#include <iostream>

int main()
{
  std::cout << "I don't know anything about programming!" << std::endl;

  const std::string ch = "I don't know anything about programming!\n";
  
  std::cout << ch.data();
  std::cout << ch.c_str();

  printf(ch.c_str());
  std::cout.write(ch.c_str(), ch.size());
  return int(0);
}
 このC++コードをご覧になった皆さんは、おそらく、次のリストに含まれる疑問の一つや二つをお持ちになったと思います。

・とにかく難しい!
・Cのソースコードとどこか似ている
・#includeに続くiosteamという意味が分からない
・stdio.hがないにもかかわらず、printf関数が呼び出されていることが不思議だ!
・std::coutのstdの意味が分からない
・std::coutの「::」の意味が分からない
・std::coutのcoutの意味が分からない
・「<<」の意味が分からない
・std::endlのendlの意味が分からない
・「std::string ch」のstringの意味が分からない
・「std::string ch」のchの意味が分からない
・ch.data()の意味が分からない
・ch.c_str()の意味が分からない
・std::cout.writeの意味が分からない
・ch.size()の意味が分からない

 これらの疑問点を一般化すると、次のような結論を得ることができます。

結論1:CとC++の間には構文の違いがある
結論2:CとC++の間には単なる構文を超えた違いがある

 「結論1:CとC++の間には構文の違いがある」の例は次のようなコードに見られます。

printf(ch.c_str());
std::cout.write(ch.c_str(), ch.size());

 1番目の「printf」関数は、Cの時代から存在するものです。2番目の「std::cout.write」は、「std名前空間内にあるcoutオブジェクトのwriteメソッド」という意味を持っています(詳しくは次回以降から順次説明していきます)。

 これら2つのコードはいずれも文字列を画面に表示します。しかし2番目のコードは、文字列に加えて、その文字列の大きさに関する情報を受け取っています。文字列というのは、複数の文字で構成されています。つまり、C++の世界では、文字列はデータとサイズ(大きさ)を持っている、という常識を尊重しているのです。ここでは、Cの世界と比較して、C++の世界では、「分かりやすさ」と「表現力」を向上させるために、より多くの情報が使われている、ということを覚えておいてください。これは決して難しいことをいっているのではありません。コンピュータと私たちの日常生活の関係がより緊密になっただけです。

 情報量が増えること。これは時代の流れであり、「メタデータ」、仮想マシンの動作・制御情報、オブジェクト指向、あるいは、「アスペクト指向」などにつながります。情報量が増えることは、確かに、「分かりやすさ」や「表現力」は向上しますが、システム自体は複雑化し、パフォーマンスの低下という副作用も顕在化します。しかし、「分かりやすさ」と「高度な表現力」の追求は時代の流れです。

 「結論2:CとC++の間には単なる構文を超えた違いがある」は、次のようなコードに見られます。

std::cout << ch.data();
std::cout << ch.c_str();

 この2種類のコードは、外見こそ違いますが、同じ文字列を同じ画面に表示します。プログラミング学習を始めて間もない方や、もしかすると、ベテラン開発者の皆さんでも、"不思議だ!"とつぶやいていらっしゃるかもしれません。本当に不思議です。なぜ不思議な感じがするのでしょうか。それは、表現力が増したからです。そして、表現する道具の選択肢が増え、自分の好みの表現方法を簡単に選択できるようになったからです。この変化には、技術難度の深まりがあるのではなく、むしろ、「技術側から私たち人間への接近」があります。

 たとえば、「std::cout << ch.data();」というコードは、次のような意味を持っています。

 "文字列(ch)のデータを標準出力(cout)に表示する"

 この意味をより正確に表現すると、次のようになります。

 "C++の文字列はデータ(文字)と管理情報(文字数)を持ち、私たち人間と同じように自分で管理している。ここでは、文字列が自分自身で管理しているデータを標準出力装置に出力している"

 Cの世界では、単に、"連続したメモリの内容を画面に表示する"という発想でした。その発想は、プログラミング初心者に"大きな壁"を最初に見せているようなものでした。メモリが文字列に変化し、さらに、その「文字列はデータを持ち、その大きさなどを自分で管理している」、という具合に人の認識が深まってきています。人間社会の進歩や文化の発展といってしまえばそれまでですが、ソフトウェア開発者の認識が深まり、「分かりやすさ」と「表現力」が向上しています。つまり、私たちの観察結果をそのままソースコードとして表現できる方向に進化しているのです。

 CとC++の最大の違い。それは、「分かりやすさ」と「表現力」の向上といってよいでしょう。人は技術の奴隷ではありません。技術は人に使われてこその技術です。この逆転を可能としたのが、CとSimulaを統合させたC++設計思想です。

前へ | 次へ




 WinDbg入門  ホーム


Copyright©豊田孝 2004- 2009
本日は2009-01-06です。