2013-05-17

記録からみるLinus TorvalsのC++観

だいぶ昔の、C++に対するLinus Torvalsの発言をtweetしたところ、結構な関心を集めていたので、気分転換に紹介してみる。

Re: [RFC] Convert builin-mailinfo.c to use The Better String Library. [LWN.net]

これはgitのMLで、なぜgitでC++を使わないのかという質問に対して、Linusの回答。

From:  Linus Torvalds <torvalds-AT-linux-foundation.org>
To:  Dmitry Kakurin <dmitry.kakurin-AT-gmail.com>
Subject:  Re: [RFC] Convert builin-mailinfo.c to use The Better String Library.
Date:  Thu, 6 Sep 2007 18:50:28 +0100 (BST)
Message-ID:  <alpine.LFD.0.999.0709061839510.5626@evo.linux-foundation.org>
Cc:  Matthieu Moy <Matthieu.Moy-AT-imag.fr>, Git <git-AT-vger.kernel.org>
Archive-link:  Article, Thread

On Wed, 5 Sep 2007, Dmitry Kakurin wrote:

>
> Gitのソースコードを始めてみた時、2つのことが頭にひっかかった。
> 1. C++じゃなくて純粋なC。理由は不明。移植性とか言わないでよ。
> クソだ。

クソまみれなのはオメーの方だ。

C++は悲惨な言語だ。しかも、少なからぬ数のプログラマーが使っていて、完全無欠のどうしようもないクソを生成するのがめちゃめちゃ簡単になっているという点で、よけいに悲惨だ。マジで、Cを選択する理由が「何もなかった」としてもだ、C++プログラマー避けになるというだけで、Cを使う大義名分になる。

つまりだ:Cの選択は唯一のまともな選択なんだよ。Miles Baderがふざけて、「いやがらせによる追い返し目的」なんていってたが、実際のところ正しい。俺の出した結論では、プロジェクトにCよりC++を使いたがるプログラマーは、むしろいやがらせして追い返したほうがいい。そうすれば、そんなヤツは俺のプロジェクトにやってきて、ひっかきまわしたりしないからな。

C++を使うとめちゃめちゃクソな設計の選択に追いやられる。必ず、最初は「よさげ」な言語のライブラリ機能、たとえばSTLとかBoostとか他の完全なクソを使い始める、それはプログラムに「役立つ」かもしれない。だがしかし、それによって引き起こされるのは:

  • 動かない場合の無限の苦痛(しかも、STLとか、特にBoostが安定していて移植性があるなんて言うやつはクソまみれだし全然面白くもなんともない)
  • 非効率的な隠匿プログラミングモデル、二年ほど開発を続けて、始めて一部の隠匿設計が非効率的なことに気がつくが、その時点では、もうオマエのコードはよさげなオブジェクトモデルに依存しきっていて、書きなおす以外に修正の方法がない。

つまり、まともで効率的でシステムレベルで移植性のあるC++ってのは、Cで使える機能だけに制限することだ。プロジェクトをCに制限すれば、ぶち壊すヤツはでてこない。それと、多くのプログラマーが低級な問題まで理解できるようになり、理想主義的な「オブジェクトモデル」のクソとやらでぶっ壊したりしない。

そういうわけで、悪いんだが、gitのような、効率を第一の目的としたのには、C++の「利点」とやらは大失敗なんだよ。こういうことが分からない人間を追い返せるというのは、多大な利点でもあるんだ。

C++で書かれたVCSが欲しけりゃ、Monotoneでやればいい。マジで。コイツは「本物のデータベース」を使っている。コイツは「よさげなオブジェクト志向ライブラリ」を使っている。コイツは「よさげなC++隠匿」を使っている。ショージキなところ、その結果として、研究者受けはいいらしいが、結果としては悲惨で保守不可能なゴミだね。

まあでも、お前さんはgitよりは気に入るだろうよ。

Linus

LKML: Linus Torvalds: Re: Compiling C++ kernel module + Makefile

もうひとつ。こちらは、LinuxのカーネルモジュールをC++で書くことの是非についてLinusの返事。もちろん、Linuxカーネルとのやり取りさえC互換で行えば、カーネルモジュールのバイナリがどのように生成されたか知ったこっちゃないが、C++でカーネルモジュールを書くのはなかなか難しい。

DateMon, 19 Jan 2004 22:46:23 -0800 (PST)
FromLinus Torvalds <>
SubjectRe: Compiling C++ kernel module + Makefile

On Tue, 20 Jan 2004, Robin Rosenberg wrote:

>
> これでは、「おれらCOBOLで何の問題もなかったじゃんwwwwww」的な論法じゃないか。

実際のところ、LinuxではC++を試したことがある。1992年のことだった。

結果はクソだった。マジで、カーネルコードをC++で書くのは、ド低脳の考えだ。

実際問題として、今のC++コンパイラーはまともじゃない。1992年当時はもっとひどかったのだが、昔も今も根本的なところは変わってない:

  • C++例外処理全体が根本的にぶっ壊れてる。特にカーネル内ではまともに動かない。
  • メモリー確保のようなものを隠したがるコンパイラーや言語は、カーネル用にふさわしい選択ではない。
  • Cでオブジェクト指向コード(ファイルシステムとかだと有用)を書くのは可能だし、しかもC++のような余計なクソがついてこない。

一般に、カーネルモジュールをC++で設計するやつは、以下のいずれかだ。

(a) 好んで厄介事に巻き込まれたい者
(b) 自分が書いているのは実はCだと気がついていないC++バカ
(c) 授業でそういう課題を与えられた者

(d)を付け加えるなら好きにしてくれ。

Linus

ちなみに、私はCが嫌いだ。

3 comments:

  1. "A response to Linus Torvalds on C++"
    http://warp.povusers.org/OpenLetters/ResponseToTorvalds.html

    ReplyDelete
  2. "C++についてLinus Torvaldsへの反論 | taro-nishinoの日記 | スラッシュドット・ジャパン"
    http://slashdot.jp/journal/501622/C%2B%2B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6Linus-Torvalds%E3%81%B8%E3%81%AE%E5%8F%8D%E8%AB%96

    ReplyDelete

  3. なぜzeromqをC++ではなくCで書くべきなのか、というエントリを書いている人がいるのですが
    これの和訳とかしてもらえないですかね??

    http://www.250bpm.com/blog:4

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.