mcommit's message

大阪でソフトウェア開発の仕事をしている simotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

C++が嫌いだ

タイトルの通り、私はC++が好きではありません。
個人的な好き嫌いなので誰に向けたメッセージというわけでもありませんし私のC++言語に対する理解が間違っている点は多分にあると思います。

仕事でC++を使わないといけない個人的な不満のはけ口として、とりあえず思いついたC++が嫌いな理由を書いておきたいと思います。

1. C++が嫌いな有名人が多い

オブジェクト指向(Object-Oriented)という言葉は私が作った。そのとき、C++ を想定していなかったことは確かだ」

C++ について アラン・ケイ
※そういえば、たしかMatzさんもC言語オブジェクト指向だが、C++オブジェクト指向ではない」コードの世界(もしかしたらネットの記事だったかもしれません)か何かで語られていたと思います。

C++ is a horrible language.

C++ について リーナストーバルズ

人ではありませんがこんな意見もありました。

関わる者全てを、混沌と困惑と混迷の螺旋へと落とし込み、その長大な術式は術者の眼精疲労を誘引することマッハである。

C++ について アンサイクロペディア


業界の大御所の方々がこれだけの発言をしているのですから、三流プログラマーの私が「C++が大好きだ!」なんて言ったら

「おい、いまC++が好きとか言う声がきこえたぞ。誰やコラ?業界から消すぞコラ!」

みたいなことになって、SMAPみたいに謝罪会見を開く必要性が出てくるかもしれません。

2. .cppと.hを両方見る必要がある。

「エディタのタブが増えちまうだろうがこの野郎!どう責任取るんじゃゴルァ!」

誰かが書いたC++のコードを読む場合ひたすら.cpp(実装)と.h(宣言)を見比べながら作業をしなければなりません。苦痛です。

「そんなのC言語でもおんなじだろ?」

という声が聞こえてきそうですが、C言語でそんな風に感じたことは今まであまりありません。
一般的にC言語だとヘッダファイルには、

  • プロトタイプ宣言
  • 構造体定義
  • enum定義
  • 公開すべき#define 定義

くらいしかなく探したい情報が直ぐに見つかってすぐにファイルを閉じれるからかもしれません。

また、C++オブジェクト指向言語なので継承の機能があります。
継承元のファイルを辿る面倒くささは他のオブジェクト指向言語でも同じだと思いますが、C#Java等と違って1つのクラス(機能)を調べるのに最低でも2ファイル(.cpp,.h)を開かないといけないのが辛いです。最近知ったのですがC++には .hppという拡張子まであるそうです。

エディタがタブまみれになった挙句、

「あれ、そもそも今何を調べようとしていたんだっけ?」

ってなったりします。
※VisualStudio,eclipseといったIDEを使えばこの苦痛はある程度軽減されることが分かりました。エディタ派の場合はctagを使うとよいですね。この問題をみなさんが解決していらっしゃるのか、そもそもこんなこと苦痛と感じていないのか。

C++でよくコードを書いている方に聞いてみたい点です。

3. 結局Cなの?

c++からC言語の関数が呼び出せるとかエントリポイントがmain関数とか、structが使えるとか、結局お前はどっちやねん。

Cからの移植性や歴史的経緯のためにこのような仕様になっていると思いますが仕様として、

「〇〇もできるから便利」
ではなくて

「〇〇もできるからかえって不便」

という印象が強いです。
※逆に「〇〇はできない」言語の方が結果として使いやすかったり学習コストが低いです。

例えば初学者やC言語経験者がC++を学習する場合
「classとstructを使い分けるのはどのような場合か」
「#defineマクロとconstな定数はどちらを使うべきか」
みたいな疑問がわんさか湧いてきます。

きちんと理解すれば細かい使い分けもできて便利かもしれませんが、そもそもこういった疑問がわいてくること自体はデメリットだと思います。

コーディング中にこういった疑問を持てば、一旦コードを書く手は止まり、
「コードはいったいどうあるべきか?」
という自分探しの旅にでないといけなくなります。
たまに旅にでるのはいいのですが、仕事で使う分にはやはり

「何のんきなこと言ってやがんだこの野郎!c++でstructだぁ?男は黙ってclassの一択だ馬鹿野郎!」

と押し切ってくれる方がありがたいです。

4. デフォルトでGCがない

RubyC++の家このまえ遊びにいったらさ、あいつん家いまだにボットン便所だったぜ」
Java「マジで!?そんなやつ今時いるの?あいつん家貧乏なんじゃね?」
C 「・・・あの~・・・うちも実は汲み取り式で・・・」
Ruby「いや・・・あの、きみん家はいいんだよ。汲み取り式でもfreeというかアンティークというか趣があるというからさ!C++んちはnewとdeleteとか見た目だけいきってるしさ!」
Java「そうだよ!Cくんは最悪スタック式かstatic変数式のもあるしさ!」
C 「うん、ありがとう。でもC++くんはぼくの親戚だから・・・」
Ruby Java「・・・」

みたいな気分になります。
※2016年にもなると、
ぼっとん便所 - Google 検索

を知らない世代の人もいるかもしれませんね。

5. 結局どの文字列型をつかえばいいのさ

std,CString,boost,自作・・・だれか正解を教えてください。


私自身は、C++を嫌いになる理由はたくさんあったのですが、C++が好きな人や自社の開発で積極的に採用する企業もあるようです。

組込系の仕事でもC++を使う案件もちょくちょくと見かけます。

ネットの記事を見ていると、C++を愛用されている熟練のプログラマーの人もいるようですが、今回この記事(というかぼやき)を書いていて、どういった点が好きなのか聞いてみたいと思いました。

もしかしたら自分が無知なだけでC++には素敵なチャームポイントがあるのかもしれません。

追記

anonymous様からコメント頂きましたので、少しC++を勉強してみた記事をかきました。

へぼいプログラマー様からコメント頂きまして、C++に関する思いで ~へぼいプログラマー様からコメント頂きました~ - mcommit's messageという記事を書きました。

追記2

先日、闘うプログラマーという本を読見直しました。

本の中で、Windows NTの開発において、グラフィックチームが(ビルゲイツに勧められて)開発にあたりC++を採用したエピソードが書かれていました。

C++を使った結果として

  • C++の習得に時間がかかった
  • サイズが大きくなった
  • 遅くなった

というネガティブな結果が出て、グラフィックチームのリーダは、NTのプロジェクトリーダーのデーブカトラーからディスられたそうです。※カトラーはビルゲイツの勧めを無視してC言語で開発をしたそうです。

C++オブジェクト指向言語なのでC言語と比べてサイズが大きくなるのは避けられないと思いますが、遅くなった理由はなぜなんだろうかと疑問に思います。

仮想関数を使った場合にvtableから呼び出し関数を取得するために遅くなるというのはよく言われますが、そのことを言っているのでしょうか。

だとしたらカーネル内で仮想関数を呼び出すコードを書く方がどうかしているような気がしないでもないのですが・・・

私自身は(ハードに近い)カーネル内のコードで抽象クラスを使うメリットがイメージできません。カーネル内のコードをC言語で素直に書いた場合よりメリットが得られるとしたら、C++に何を期待したのかが気になります。


もしかしたら、Windwos NTが開発されていたのは1980年代後半から90年代前半の話なのでC++での開発スタイルはまだまだ確立されていなかったのかもしれません。