Wednesday, 16 May 2007

C++



PL/Iの再来とか、C++はソフトウェア工学を10年後退させたとか、まぁ、そんな言われ方をしてますが...

http://tinyurl.com/2e38yw

が有名か...


もともとのCには、モジュールという概念がなく、大域変数をモジュール化出来ないっていう欠点がある。static で、ファイルの中に閉じ込めることは出来るんだけど。なので、そのあたりを改良したものが欲しいってのはある。

C++ の同時期に、Objective C とか Cob とか、いろいろ提案されてました。大学院時代の同僚も同じようなことしてました。AT&T Bell Lab をback ground に、ゴリ押し的に広まった。最初は、C++ からCへ変換する cfront とかいう実装だったはず。

Ojective C がSmalltalkを意識した実装になっているのに比べて、「Cの構造体と、構造体経由の間接呼び出しを使った、簡易実装」という感じになってます。なので、Cの構造体の欠点がそのまま残っている。この程度だったら、自分で、構造体でオブジェクトを作った方がいいと思う。

初期の有名なC++で実装されたアプリというと、InterViews というGUI Toolkit と、それで実装された idraw ですね。このidraw が「C++ のversionがあがるたびに、動かなくなる」という技を出す。いいソフトだったんだけどな。PostScript 自体がidrawのファイルフォーマットになっているという。k2d とかいう名前であるらしいが見つけられませんでした。

でも、C++ が、真のダメさ加減を発揮するのは、Template を採用してからだと思う。制御不可能なほど、ものごとをこじれさせる感じです。それまででも十分に複雑だったのに、さらに、Template を覚えないといけないんですか? タイプ変数を導入できるので、その部分は便利といえば便利なんだが... まぁ、マクロだと思えば、その場で展開されるというだけだとも言えるのだが。

  template<typename _Tp>
  complex<_Tp>&
  complex<_Tp>::operator/=(const _Tp& __t)
  {
   _M_real /= __t;
   _M_imag /= __t;
   return *this;
  }

このoperator overrideも「見た目通りに動かない」C++ と言う感じを良く出してます。この中で bug ったりしたら、debug のやりようがないです。引数の型が異なると、異なる関数を呼び出す polymorphism も C++ の場合は裏目にでていると思う。

Effective C++ は必須なんだけど、それを読んでも、なぁ...

自分で係わることは幸い少なかったんだが、C++ が噛んでいるプロジェクトで幸せにはなれないと思う。Acsis C++ の時は、逃げてしまいました。

継承とか、大域変数のモジュール化とかで使いたいことは使いたいんだけど、

 ゴミで一杯の巨大な仕様

が、すべてをぶち壊しにしていると思う。Objective C が良くできていただけに、C++ が広まったのは残念です。

ま、今は、Java に逃げるという手があるから、まだまし。っていうか、今時、C++を使うのは、Windows な開発者だけだろ?

No comments: