Linus 對 C++ 的批評有無道理?

Gmane -- Re: RFC Convert builin mailinfo.c to use The Better String Library.

直接轉帖原文:

*YOU* are full of bullshit.

C++ is a horrible language. It"s made more horrible by the fact that a lot
of substandard programmers use it, to the point where it"s much much
easier to generate total and utter crap with it. Quite frankly, even if
the choice of C were to do *nothing* but keep the C++ programmers out,
that in itself would be a huge reason to use C.

In other words: the choice of C is the only sane choice. I know Miles
Bader jokingly said "to piss you off", but it"s actually true. I"ve come
to the conclusion that any programmer that would prefer the project to be
in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn"t come and screw up any project I"m involved with.

C++ leads to really really bad design choices. You invariably start using
the "nice" library features of the language like STL and Boost and other
total and utter crap, that may "help" you program, but causes:

- infinite amounts of pain when they don"t work (and anybody who tells me
that STL and especially Boost are stable and portable is just so full
of BS that it"s not even funny)

- inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn"t very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app.

In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C. And limiting your project to C means that people
don"t screw that up, and also means that you get a lot of programmers that
do actually understand low-level issues and don"t screw things up with any
idiotic "object model" crap.

So I"m sorry, but for something like git, where efficiency was a primary
objective, the "advantages" of C++ is just a huge mistake. The fact that
we also piss off people who cannot see that is just a big additional
advantage.

If you want a VCS that is written in C++, go play with Monotone. Really.
They use a "real database". They use "nice object-oriented libraries".
They use "nice C++ abstractions". And quite frankly, as a result of all
these design decisions that sound so appealing to some CS people, the end
result is a horrible and unmaintainable mess.

But I"m sure you"d like it more than git.


打個岔,之前去交大聽bjarne的講座,有個人就問了他對於這份郵件的看法,本人英語不是特別好,但是明顯感覺到bjarne不爽linus很久了,直接說linus sometimes don』t know what he is talking about.甚至說linux內核也可以用java來寫,kernel這塊編寫不是很懂,但是用java來寫真是感覺有點像氣話了,不過感覺linus那封郵件是不是確實有點偏激了…………


不是完全沒道理。


對於編碼能力達到爐火純青,同時精力也集中於某幾個長期迭代的項目的高手而言,使用何種語言幾乎是無足輕重的(不影響性能或其他某些關鍵要素前提下),我想這是Linus對批評意見大光其火的根本原因。

具體理由上來說,在操作系統內代碼基差異很大,存在大量瑣碎代碼的情況下,再過度強調代碼的復用和組織結構就意義不大了。更何況編碼的本質目的是為了實現功能,如果上來就要求實現功能的人把很多精力投入在設計上;一方面提高了門檻,不利於活躍開發,另一方面增大了設計失敗情況下的風險和潛在損失。所以不如把這種瑣碎的部分完全交給基礎邏輯來做。

但這並不是說c++就不能用,眾所周知,在通用的代碼和整體架構中,有很多類似面向對象的設計,使用c雖然可以做甚至更加靈活,但也帶來了代碼冗餘以及容易產生錯漏的缺點。只是因為開頭提及的因素在這些項目中不是那麼顯眼或為大家熟悉。

所以我的意見是不要麼糾結於這些帶頭大哥是怎麼說的,而集中注意力於項目實現本身,如果對linux或其他項目中的編碼方法不太滿意,比如sysfs這樣複雜子系統,而希望藉助c++語言本身特性加以改進的化,那就不妨嘗試去做。但請注意,在任何時候這只是幫助快速準確構建功能,而不能代替意圖本身。


linus沒有批評C++,他批評的是他周圍用C++的人。倘若你要讓我來評價,我也見過很多C++寫得好,但一旦讓他用C就會把C用成屎的。人是很複雜的,不要試圖簡化分類。


世界在變,這幾天有些懷念我的諾記1100了,單論打電話發簡訊,我現在的三星還真不如當初的1100順手。

好了,言歸正傳。先回答問題,當然有道理。Linus雖然是個噴子,但是人家也是個有內涵的噴子,有乾貨的噴子,有追求的噴子,有品味的噴子……

答案有了,打算走了?邊走邊想:連Linus大神都把C++噴成這樣了,對C++,必須粉轉黑,路人轉死黑呀,否則怎麼在圈裡混……那兄台,請留步,再聽我一言。咱們程序員自認為是技術人員而非神職人員,對吧,所以咱遇事兒不能上來就整搬出大神,虔誠皈依,立地成佛的套路呀(信Emacs得永生!)……咱得看原因。

其實他把他的原因說得很清楚了,基本都對。很多人的C++水平也就能寫個小程序,做點兒習題,結果因為知道C++的目標是打算開發高性能的系統程序,所以就覺得自己用C++寫出來的系統程序一定會性能又高又穩定,對於這些人(好像我也是哎……)被噴一噴也挺好的,寫系統程序本身就已經非常複雜了,如果你連編譯器都搞不定吃不透,那你估計連你的系統是怎麼死的都不知道……而如果你覺得你已經吃透了C++的編譯器,那你還有時間了解你的程序所在的領域么?不過寫編譯器的都基本上切到C++了,在他們寫了20年C++編譯器之後,終於有信心用了……不過人家這優勢明顯呀,人家要解決的問題就是編譯器本身……我記得有人排名說計算機系統最複雜的兩個部分:操作系統和編譯器(鏈接器,載入器),那你們想想拿C++寫操作系統是什麼感受?學透第二複雜的系統以便於構造最複雜的系統?你們跟自己的腦子有仇?這些年Linus被C的編譯器都坑過好幾回,還敢用C++,所以Linus噴C++是完全有道理的。

擦,好像越抹越黑了……

C就像是手機中的諾記1100,可靠,方便,值得信賴,不會坑你。但是世界在進步(退步?),軟體開發也不可能止步於C。C++是一門不錯的語言,據我所知它是唯一一個真正做到了在提供更高抽象的同時,又不損害程序的可預測性以及性能的語言。C++提供了更好的類型系統,讓編程更加安全;C++提供了對象生命周期定義以及自動的構造析構調用,減少了代碼量;C++使得代碼更容易被複用。只不過這些東西都不是白送的,需要認真構思才能達成目標,如果你總是酒後寫代碼,那你還是別用C++了……

客觀地說,我覺得C++處在一個過渡階段的位置,從C這種傻編譯器到一種更牛逼的編譯器的中間狀態。將來可能會出現一種牛逼編譯器,當你能正確描述你的問題之後,它會自動生成最優的求解代碼。但是誰知道這個過渡期有多長,5年,50年,500年?但就現階段而言,我覺得C++是一門還不錯的語言……

唉,其實說這麼多有啥用呀,硬體越來越強,C++中費了老鼻子勁省下來的開銷,有人在意么?不過C++其實也一直在努力進化(向著更加喪心病狂的方向?)。

所以,咱不要做跟風的噴子,要噴就做一個有創新的噴子,一個獨特的噴子,一個講道理的噴子,即使是Linus那樣的大神,咱也不跟隨,不盲從……

如果你們哪天用C++真用得很不爽,被各種神隊友各種坑,被大神的代碼恥笑的時候,咱再猛猛噴它!


看了全文感覺沒有乾貨,純粹是為噴而噴,Linus也是個性情中人。

事實上C語言程序員都對底層的硬體的東西很感興趣,而對底層感興趣的都會不爽C++。Linus是個典型代表,他對底層細節的追求甚至連其他開發者都覺得過分,所以這樣的人討厭C++也是正常的。

因為C++是想兩頭討好,既迎合大規模程序開發面向對象的潮流,又不願放棄底層,還想兼容C,結果搞了個雙方都不討好的結果,面向對象編程者指責C++不夠面向對象,C語言程序員指責C++搞了一大堆複雜繁瑣易出錯的玩意。Linus吐槽STL主要就是因為STL里經常被發現有BUG。偏偏C++的賣點之一就是STL。兼容C更是敗筆,C語言滿足的特性放在面向對象里就是災難,一個全局變數能破壞所有分層,一個指針能毀掉所有的封裝。

C語言的思想是取一個計算機語言功能的最小子集,換取最大自由,在這個子集內你可以做任何事情,沒有任何來自語言特性的限制,有點像無政府主義,什麼反人類黃暴的時期都可以做的出來,不像後面出來的語言,打著為你好的旗號,做出很多框架,雖然確實讓代碼凈化了很多,優雅了很多,編程方便了很多,但是也失去了很多自由,在C語言野慣了很難適應到處都是條條框框的C++。

我的感覺是,C++的代碼里塞進點C語言看不出來什麼問題,但是C語言里塞C++就噁心的很了,更喪心病狂的是在C語言代碼里塞模板。所以Linus拒絕加入C++的代碼是說的通的。


因為寫C++的豬隊友太多了,關鍵是很多豬隊友的自我感覺還超好。


我覺得C++ FQA的批判更全面一些。

Linus的這篇批判集中在OO方面,其實對所有OO的語言都是一樣的(比如Java各種Factory),批判稍微缺乏特異性。。


說到底,這個話題無非就是想找個標準答案而已。。。唉!人家隨便放的一個屁,也可能是標準答案。


torvalds/subsurface-for-dirk

(逃


看這裡 http://www.zhihu.com/question/30292024/answer/47513658

C++坑太多了,玩刀老是把自己給削到了


當然有道理。一個做工程的人,當然會對這種學院式的語言不爽。


支持linus。C++繁瑣的語法束縛了編程的自由度,而自由正是創新的來源。


推薦閱讀:

你最喜歡的國外編程網站是哪些?
python按行遍歷一個大文件,最優的語法應該是什麼?
ruby語言有什麼樣的美學特點?
寫一個實用水平的編譯器有多難,多大工作量?
直接看 ISO C++14 的標準文檔學習 C++ 可行嗎?

TAG:編程語言 | CC | 林納斯·托瓦茲LinusTorvalds |