Cogito Ergo Sum.

我思う故に我あり

ここ1週間ほどC/C++入門をパラパラ眺めていた。

 3月末に10日間ブッ続けで勉強会を行う「狂気のVB合宿」に参加してプログラミング学習熱に火がついてしまい、ここ1週間ほどC/C++入門をパラパラ眺めていた。

 実は僕は、C入門なら過去に何度も読んだことがあるが、C++入門はほとんど読んだことがない(しかも、読んだとしてもC++の「C」部分しか読んだことがなかった。「++」部分で言うと、printfやscanfの代わりにcoutやcinを使うとか、char[]の代わりにstringを使うとか、その程度)。

 で、C++の「++」部分を学びながら思ったのは、C++JavaC#と比べて(よく言われているように)確かに面倒臭いが、Cの知識を既に持っているとしたら、JavaC#を一から学ぶよりもオブジェクト指向プログラミングというものを理解しやすいだろう、ということ。プログラミング言語としては後発のJavaC#の方が言語仕様そのものはスッキリしていて学びやすいと思うのだが、Cの土台の上にC++の皮を被せた方がオブジェクト指向プログラミングの概念的理解も容易かもしれない。

 Cプログラマの強みはやはりCという比較的「低級」な言語を使っていたことでハードウェア寄りの感覚が身についている点。僕にとってオブジェクト指向プログラミングを理解するのは本当に難しかったが、その難しさの一端は「あるコードがハードウェア上でどのように実行されているのか想像できない」というところにもあった(これは「オブジェクト指向を概念的に理解できない」というのとはまた別の話だが)。

 例えば、「オブジェクト指向プログラミング言語には『多態性』と呼ばれる仕組みが備わっています。これは、基底クラスの型で宣言した変数に派生クラスのインスタンスを代入し、ある(仮想)メソッドを呼んだ場合、派生クラスのメソッドが実行される、という仕組みです」と説明されるよりも、「基底クラスの型で宣言した変数(実はポインタ)には派生クラスのインスタンス(のメモリアドレス)を代入することができます。そのため、あるメソッドを呼ぶと派生クラスのメソッドが実行されます。これを利用して、(抽象的には同じ機能である同名のメソッドを呼ぶだけで)実際に代入されているインスタンスの種類に応じて異なるメソッドが実行される『多態性』という仕組みが実現されています。そのためプログラマは、個々の派生クラスの違いにとらわれることなく、抽象度の高いレベルでのプログラミングに集中することができます」と説明された方が僕にはピンとくる。

 もちろん、「オブジェクト指向プログラミングとは何か」を概念的に理解することと、「オブジェクト指向プログラミング言語に備わっている様々な機能は具体的にどのような仕組みで実現されているのか」を理解することでは、理解すべきものが違うし、僕にとって本当に難しかったのは「どう書けばどうなるか」ではなく、むしろ「その仕組みは何のためにあるのか(それがどう便利なのか)」を理解することだったのだが、Cの知識に付け足す形でオブジェクト指向的な機能に関する知識を追加し、そこから概念的・抽象的な理解につなげる、という途もあったのだ、と今なら思う。

 開発の現場ではC++開発経験者がやはり重宝されているらしい。C++マスターは(ヤッカイな言語を使ってきた結果)OSの働きに関してかなり深いところまでの知識を持っており、それがC++を使わないような現場でも役に立つらしいのだ。その点、最初からC#みたいな人は敵わないらしい(「最初からC#」なんて人は若い人だろうから、経験年数の差かもしれないが…)。

 まぁしかし、僕は今さらC/C++をもう一度一から学び直そうという気にはならないなぁ…。やっぱ面倒臭い。