月曜日, 8月 28, 2006

Cではなく何でC++なのか!

かなりの人口がC/C++を使用していると思う。
しかし、C/C++はまったく違う言語であるため
これを同一として考えるのは決してベターだとは思わない。

実際、C言語が書けるのだからC++も大丈夫でしょ!
なんて言われてしまうと泣きそうになる。
また、C++を始める前にまずC言語を勉強して...
なんて話も泣きそうである。

まあ後者については勉強方法なのだから、
何が正しいと言う事はないと思うが...
一つだけ言わせてもらうとC++とCは違う言語であるって事だ。
だから、C++の勉強をする上で
C言語を知っていなければならないって事はない。

もちろん、C言語を勉強してからC++に入った人と
いきなりC++に入った人が
同一時期であればC言語の勉強を行なった人は
先に進んでいる事は間違いない。
C++はC言語の多くに互換しているため、
この互換部分については理解していると言う事だからだ。

でもって今回私が思ったのはCとC++は
どの辺りが異なるのかって事である。
これについてはいろいろな箇所で語られていると思うが
切り口はかなり個人的な主観で行なうため
間違いもあるのかもしれない。
まあ、でもそれは私がそう思っているって事でいいとします。

まず第一に
C言語は手続き型プログラミング
という言語に位置しており、その設計方法は
「INDATA-PROC(処理)-OUTDATA」
ってな感じで記載する事が多い。
っていうか基本的にはこうなる。

それに対して
C++はオブジェクト指向プログラミング言語
でもあるって事になる。
ここで「でもある」ってところがポイントだと思っている。
つまり、オブジェクト指向を行なう必要はない。
それでもできるって箇所がポイントである。

オブジェクト指向はプログラミング言語が
発達している世の中ではかなり有用な考え方だと思っている。
簡単に言ってしまえば、抽象的にものを考えた事が
プログラミング化できるって訳だからこれはもの凄い事だ。
まあこの話はいろいろなところで言われているのだが
実際に抽象的なものをプログラムするって
どういう事かって事が分かりづらい。

そこで私目が勝手な解釈で言わせて頂きます。
抽象的の反対は具体的って事です。
なので
抽象的なプログラムとは具体的ではないプログラム
って事になります。
では具体的ではないプログラムってどのようなものでしょうか。
それはコードの記述がないって事ではないでしょうか?
コードの記述と言っても何も書かないのではプログラムになりません。
ここで言っているコードとは処理の具体的なコードを指しています。

void foo() {}
たとえば、上記のようなコードがある場合、
このfoo()って具体的ではなく、
あくまでも抽象的なコードとなります。
だったらCでも抽象的なコードが書けるのではないか
って事になるのですがCの場合は
上記のコードはそれ以上でもそれ以下でもない。
見た通りです。

それに対してC++ではクラスの中のメソッドに
virtual void foo();
この仮想関数は具体的なコードは不要で、
その内容を別の専門家に記載させる事ができます。
別の専門家とは、もちろん本当の専門家ではなく
自分で記載する別のクラスって事になります。

この仮想関数は専門家が作成する
関数の橋渡しの役割を行ないます。
つまり、この仮想関数によってある動作を
抽象的に定義してしまうって事です。
例えばこのfooが人間の歩くって事を表現する関数だったとします。
その場合、「virtual void foo( int minute )」何て定義を行ないます。
これによって、後でfooの具体的なコードを記載するものは
この歩く表現を行なう際に、
時間を引数として受け取って実装する必要があるって事です。

・赤ちゃんであれば「はいはい」で進む事になるので、
 時間辺りの歩く移動距離は、ほとんどないかもしれません。
・ある程度大きくなってくると、倒れながらも歩きます
 「はいはい」に比べると時間辺りの歩く移動距離は増える事になります。
・さらに大きくなると、倒れずに歩きますのでさらに移動距離が増えます。

ってな感じで、時と場合によって具体的な実装とは異なります。
つまり、抽象的に捕らえ、それをプログラムで表現可能である
って事は大変有効な手段となります。

Cの場合に意味のなかった関数に
C++では意味を持たせられるって事が
重要なキーワードとなります。

実際にこれをC++で表現しようとすると、
いろいろな勉強が必要になるのですが
でもそれだけの価値がある言語だと思っています。

C++の文法については何も触れていませんが
(一瞬触れたかな...)
追々時間があれば書いて行きたいですね。

0 件のコメント: