C言語の抽象レベル

疑りぶかいあなたのためのオブジェクト指向再入門はすごくわかりやすい説明だと思います。ただ、皆様からのご意見(1)にあるメールにも同感できる所があります。この議論は非常に興味深いですが、結局

 board_put(board, x, y);

 board.put(x, y);

が違うかどうかということに集約できると思います。

私はこれはメンタルモデルの問題だと思います。つまり、プログラマーはコードを見た時に、頭の中で計算機を動かしながら読んでいると思いますが、二つの記述でその脳内の計算機の動きが違うかどうか、という問題だと思います。

例えば、私がC++の仮想関数を本当に理解できたと感じたのは、結局、仮想関数の呼び出しが、

 (*(obj->vtbl->func))() ;

であると理解した時です。つまり、言語の意味を脳内の計算機の動きとしてイメージできた時に「理解した」と感じるのです。

私の脳内の計算機では、

 board.put(x, y);

 board_put(board, x, y);

に翻訳されて動くので、上記の二つには違いがありません。あるいは「関数呼び出し」は基本的な概念ですが、「メッセージ通信」は実体のない仮想的な概念に思えます。でも、メールで異議をとなえた○○氏の場合は、脳内で違うモデルが動いているのではないかと思います。

ですからこの議論は、どちらの脳内計算機モデルが一般的であるか、あるいは有用であるか、という問題としてとらえるべきだと思います。私としては、自分のモデルは「現実のハード」に即したより実用的なモデルと主張したい気もしますが、それが正しいのかどうか確信はありません。

上記の例が示すように、私の脳内計算機の抽象レベルはこの例が示すようにC言語のレベルです。つまり、漠然とレジスタとメモリというハードはイメージしていますが、具体的な機械語レジスタの数や用途まで想定しているわけではありません。そもそもレジスタと言っても、伝送遅延や閾値をアナログレベルで考えて回路を設計するような人から見れば、もの凄い抽象概念だと思います。

ということは、自分のモデルの優位を主張するには、「レジスタ」という抽象概念が有用で「メッセージ」という抽象概念は有用でないのはなぜか?という問いに答えなくてはなりません。あるいは、C言語のレベルの抽象レベルを理解することが「計算機がわかってる」ための根本的な絶対条件であるとして、その下のレベルもその上のレベルも必要に応じて一時的に使えばいい補助的な概念と見なすのはなぜか。

ここまで自分に問いかけて、

  • 性能を考えるためには最も適切な抽象レベルである
  • 多くの技術者がそのように計算機をイメージしており、これを理解することがコミュニケーションのために重要である

という理由は思いつきましたが、これは絶対的な理由となりませんね。

中途半端な結論ですが、これはBLOGだしタダなのでここで終わります。