型チェックの本当の意味
「C++プログラミング言語の歴史と特徴」連載第15回目の今回も前回に引き続き次の公開論文を精読していきます。
第1回連載資料論文
今回は、「3.4 Type checking」節の意味を考えます。節のタイトルは、"型をチェックする"という意味です。語学的には難しいところはありません。しかしプログラミング学習を始めたばかりの人や経験の浅い開発者は、おそらく、このようなタイトルを見ると、"自分には専門的過ぎる"と感じてしまい、学習意欲が減退してしまうのではないかと想像されます。冷静に考えてみれば、この節のタイトルは、技術的な難度の高さを必要以上にあおっている印象を受けます。
「Type」というのは、確かに"型"を意味する英語です。しかし、型の意味を正確に説明できる人は、おそらく、いないと思われます。説明できる人によっては、"型とは、メモリのバイト数である"と主張する人もいることでしょう。また別の人は、"型とは、クラスである"と説明することでしょう。前者の場合、メモリとバイトというコンピュータ専門用語を持ち出していますから、プログラミング初心者用の説明としては失格です。後者はどうでしょうか。同じように、クラスというソフトウェア専門用語が使用され、説明としては難解の部類に入ります。いずれの説明も失格とすれば、いったいどのような説明が必要とされているのでしょうか。
本文に目を通してみると、この節は次の2つの文で開始されています。
C++ provides and relies on static type checking. That is, most language rules are checked by the compiler before a program starts executing.
これらの2つの文には、「static」と「compiler」という単語が見えます。これはどういうことかといえば、この節の内容は平均的なプログラマにとっては大変難しい、ということなのです。ましてや、プログラミング学習を始めたばかりの人にはまったく理解できない、ということなのです。Cの入門書などを開いてみると、型の説明をする箇所では必ず、変数とメモリの関係を図解しています。筆者は、そのような図書をかなり目撃しています。そして、"これを覚えることにより、読者は何か得るものがあるのだろうか?"と考え込んでしまいます。それでは、ここで、次のコードを見ていただきましょう。
int main()
{
int mennseki = 0;
double tate = 3.14;
double yoko = 5.34;
mennseki =tate * yoko;
return int(mennseki);
}
単純なコードですから、まずじっくり眺めてください。このコードでは、「int」と「double」という2種類の型が使われています。このコードを、"メモリ"という、ハードウェア的な視点から見ると、"面白みのまったくないコード"です。しかし、次の点から見るとどうでしょう?
このコードを作成した人は、おそらく、長方形の面積を求めたいのではないか?
プログラム内では3つの変数が使用され、それぞれにmennseki(面積)、tate(縦)、yoko(横)、という名称が与えられています。プログラムというのは、私たち人間の思考内容、興味、想像力、あるいは、夢などを表現したものです。このコードの場合、コードの作成者は長方形の面積計算を電算化しようとしています。繰り返しますが、プログラムはあくまでも作成者の表現内容です。すべてのプログラムには、作成者の人間性や性格などが自然に反映されるものです。このプログラムは、作成者の次のような性格を示してくれています。
・この作成者は、冷静さに欠ける。
・この作成者は、アバウトな性格の持ち主である。
プログラムを見ると、この作成者は面積には0、縦と横にはそれぞれ3.14と5.34という数値を与えています。皆さん、この数値の与え方はどこかおかしいと思いませんか。
「0」は整数、「3.24」などは小数です。ここには、2つの異なる視点が混在しています。つまり、面積を整数で求めるのか、あるいは、小数点で求めるのか、作成者の意図がはっきりしていません。これは人間的な表現をすれば、"的を絞りきっていない"、"焦点があいまい、"いまいち突込みが弱い"、あるいは、"考えがまとまっていない"、ということになります。コンピュータから見ると、"そのような高度な概念(0と1以外で構成される奥深い意味や感情的な表現)"は理解不能、ということになります。コンピュータは、人間的な"あいまいさ"を理解することはできません。それは(0と1だけでは表現できない)あまりにも高度なものだからです。
このプログラムをMicrosoftのVisual Studio.NET 2003でビルドすると、次のような警告が出されます。
warning C4244: '=' : 'double' から 'int' に変換しました。データが失われているかもしれません。
ある程度のプログラミング経験を積んだ開発者は、"この警告は、プログラマのコーディングミスを指摘している"、と解釈すると思います。しかし、それはあくまでも経験を積んだ人の発想からの解釈です。筆者は、その解釈は中途半端、と考えています。この警告は、コーディングミスを単に指摘しているのではなく、"作成者の表現上に詰めの甘さが残り、コンパイラはその甘さを検出・指摘している"と解釈すべきです。プログラムを書くのは私たち人間です。コンパイラを作成するのはいったい誰でしょうか?コンパイラを作成するのも私たちと同じ生身の人間です。これは、人間の表現力の弱さが、別の人間により発見された、という、私たちの日常生活でよく見かける風景とまったく同じです(注:.NETではこの種の問題はエラーとなります。.NETコンパイラの開発者は、警告ではなく、エラーとしたわけですから、より明確な方針を打ち出したわけです。このようなソフトウェアの流れをつぶさに見ると、結構面白いでしょう)。
"型をチェックする"という意味を知りたい場合、メモリやバイトではなく、あくまでも、"表現の正確さ"、"表現内容の整理と構成"という、人間的な視点に立つことが大切です。これは、C++では特に重要になります。ご承知のように、C++では"クラス"という概念が導入され、Cと比較すると、表現力が数段向上しています。大切なのは、表現することであり、表現内容の整理と構成、なのです。筆者は、この発想を理解できない場合、C++はおろか、JavaやC#などをはじめとする"オブジェクト指向言語"の習得は到底無理ではないか、と判断しています。
第3.4節には、いろいろな断片コードが用意されています。筆者の記事を読み終えた後は、自分の目ですべての断片コードを解釈してみてください。解釈作業では、メモリやバイトというコンピュータ的な視点からではなく、"表現内容の整理と構成"、"表現におけるあいまいさの解消"、という人間的な視点から眺めるようにしてください。"何を、どのように表現したいのか?"を考えることが何よりも大切です。
前へ |
次へ
Copyright©豊田孝 2004-
2008
本日は2008-12-04です。