UTALI

みんなの役に立つ情報をどんどん公開していきます

リーナス・トーバルズはC++が嫌いなそうです

f:id:mochizuki_p:20170221190858p:plain

Linuxカーネルの開発者としてして知られるリーナス・トーバルズはC++に批判的であることでも有名だ。

その証拠にLinuxカーネルにC++を採用する提案がなされたが、全て強い言葉で拒絶している。

今回紹介するのはそのうちの2つ

まず最初にドミトリー・カクリン( Dmitry Kakurin )のメールへの返信から

純粋なC言語で書かれているGitにC++を採用したらどうか?という内容だったようだ。

ドミトリー・カクリンへの返信

始めにGitのソースコードを見て2つのことが奇妙に思えた。

どうしてC++を使わずに純粋なC言語を使っているんだ?可搬性については無視すればいいじゃないか?そんなデタラメは

Dmitry Kakurin

デタラメを言っているのは貴様だ

C++は本当に恐ろしい言語だ。そして、多くの無能なプログラマーがそれを使い、本当にクソなプログラムを簡単に書いてしまう点で、さらに恐ろしい言語だ。

本当に正直に言えば、C言語の選択になんの理由もないとしても、C++を使うプログラマーは何がなんでも排除しなければいけない。それだけでもC言語を使う十分な理由になる。

言い換えるならば、C言語が唯一まともな選択肢なんだ。Miles Baderが冗談めかしてC++プログラマーに「貴様を追い出すため」と言っていたのを覚えているが、実際その通りだ。

そして、僕は、C言語よりもC++での開発を好むプログラマーは、僕の関わるプロジェクトを台無しにされることがないように、追い出したい連中であるという結論に達した。  

C++は、本当に、本当にひどい設計にプロジェクトを導いてしまいがちだ。  

もしC++を使えば"本当に素晴らしい"ライブラリの特徴を持ったSTLやBoost、あるいは他の本当にクソなライブラリを使う羽目になるだろう。  

   それらのライブラリはプログラミングを多少楽にはするかもしれないが、別の問題を起こすことになるだろう。それは、

  • バグを潰すのに途方もない苦労をしなければならない(STL、そして特にBoostが安定していて可搬性も高いという連中は笑い物なだけでなくホラ吹きでもある)

  • それがあまり効率的でないということに気づくまで長い時間がかかる不効率な抽象的プログラミングモデル。そしてその不効率さに気づいた時点で、その"非常に素晴らしい"オブジェクトモデルに依存したコードは、保守困難な代物になっていて、結局全て書き直す羽目になる。

言い換えると、システムレベルで可搬性の高い効率的な良いコードをC++で書くならば結局のところC言語で利用可能なレベルまで機能を制限する必要がある。そしてプロジェクトをC言語に限定するということはプロジェクトを混乱から遠ざける結果に繋がる。そしてC言語の利用は、データ構造やアルゴリズムを熟知した多くの優れたプログラマーの協力を得られる結果になるだろう。

プロジェクトを馬鹿げた"オブジェクトモデル"のガラクタに滅茶苦茶にされてはいけないんだ。

だから本当にすまないが、Gitのような効率性が第一のプロジェクトには、C++の"長所"とやらは大きな過ちになる。そして、C++の欠点が理解できないような無能を排除するということが、次に大きな利点となるだろう。

もしバージョン管理システムをC++で開発するつもりなら、どうぞMonotoneで遊んでくれ。 実際、Monotoneを開発している連中は"本物のデータベース"を使っているそうだ。そこでは"ナイスなオブジェクト指向ライブラリ"を使い、"ナイスなC++の抽象化"を採用しているそうだ。そして少し乱暴な言い方をすれば、この手の設計思想はある種のアカデミックな連中には魅力的に映るそうだが、結末は保守困難な恐ろしいコードになるだろうね。

だけど、貴様はGitよりもそうゆうのが気にいるんだろ。

リーナス

次に紹介するのはロビン・ローゼンベルク(Robin Rosenberg)への返信

文脈から察するに古臭いC言語なんて使うのはやめて新しいC++を使おうぜ! という内容だったと察する。

ロビン・ローゼンベルクへの返信

これって僕たちは未だにCOBOL使ってんじゃねーか っていう意見と変わらないですよね?

Robin Rosenberg

実際に1992年頃C++をLinuxに採用することを試みたことがある

それはクソだった。信じてくれ、C++でカーネルを設計することは本当に馬鹿げたアイディアだ。

事実としてC++のコンパイラは信頼に欠ける。1992年の段階では今よりひどいものだったが、いくつかの基本的な事実は変わっていない。

  • C++の例外処理機能は基本的に壊れている。それをカーネルに使えば致命的になるだろう
  • メモリ配分のようなことを実装から隠してしまう言語やコンパイラをカーネルに使うのは得策ではない
  • C++のようなゴミ言語を使わずとも、C言語だけでオブジェクト指向(これはファイルシステムに有用性がある)のコードを書くことは可能だ

総合すれば、C++でカーネルモジュールを設計しようとしている連中は以下のいずれかだろう

  • わざと問題を起こしたがっている
  • C言語のコードをどうしても書きたくないC++キ○ガイの変人
  • 情報工学の授業でそうするように指示された

他に思いつく?

関連記事:

www.utali.io