Linus Torvalds 的 C++ 水平如何,為什麼他敢炮轟此編程語言?

C社區里不用說了

既然敢於炮轟C++,那麼他C++的造詣和編程水平如何呢?

C++的各種輔助編程和設計的理念技術:從基本的數據封裝(當然這個C也沒問題)、RAII資源管理、強大的STL/Boost庫到現代C++的Smart Pointer,Lambda/closure,function/bind,auto類型推導等等豈是這個狂熱的C使用者可以無視的?(分類並不嚴格,大家不要糾結)

提此問題的動機並非想在編程武林中確定Linus的排位,更多的是想知道,沒有以上所提的所有C++的語法糖,Linus本人和C社區里的高手們又是如何巧妙而高超的處理相應的問題的呢?尤其是在做大型的需要優雅設計的系統、大量的需要有效管理的資源等的時候,dirty and ugly的hacking就不算了吧

另外,談C++水平,並不是狹義的指OO。


Linus 只炮轟過一次,那是因為 git 選擇了 C 語言,很多人「選擇性無視了這段話的由來」。這段話的來由是因為有一位大炮在郵件列表中公開說 Linus 在 git 項目中使用 C 語言進行開發的理由是 「BULLSHIT」,所以 Linus 才開炮說「你才是 BULLSHIT 」,然後明確說明了(大意),因為 C++ 有一群豬隊友,為了避免使用 C++ 的豬隊友來搞亂代碼,所以 git 項目使用純 C 寫作。

各位簡單的思考一下,你開發一個軟體,人家罵人的都跑到你的郵件列表(國人可以理解為這就是官方論壇)裡面來開罵了,你還不發飈能行?

是否炮轟,與他本人的 C++ 水平沒有關係,而且他炮轟的只是那個大炮,以及一部分豬隊友,而非所有的 C++ 程序員。這隻與他能接觸到的那些 C++ 程序員的水平有關係。作為非商業的開源軟體,其實他並不能選擇誰來參與他的項目。不能夠根據項目的技術需求來挑選人,而只能通過現有人才的力量來選擇項目技術。

事實上,他的觀點沒什麼大問題。Linus 自稱在 Linux 團隊中的主要職責是代碼審查。換句話說他評估什麼代碼是好的,什麼是不好的,什麼該進入代碼,什麼不該進入。

他明白哪些人會來參加他的項目,哪些人會為他的項目貢獻代碼,如果這些人的 C++ 能力都不如 C 能力,那麼他就絕對不能選擇 C++ ,這與他本人的 C++ 能力沒有關係,也與 C++ 本身沒有關係,而是作為代碼審查者,他太清楚與他合作的那些人寫 C++ 程序的能力水平了


曾經在水木上看到一個帖子討論大神的C++的水平如何。我回去沒找到原貼。大意是說大神的C++的水平也是很厲害的,也曾經試過用來重寫內核代碼,但很快就放棄了。至於他水平如何,有個小故事。有個人在討論組內發帖問一個問題,對於他負責的代碼中某個bug百思不得姐,當然這個是用c++寫的。然後大神回帖說,你看你的代碼是由於某編譯器帶來的問題,它產生的機器碼是巴拉巴拉這樣的。於是眾人退散。

既然是故事,真實性不可靠,權當一樂。

//////// 以下搬運自csdn

Linux之父Linus Torvalds曾經在三年前,因為微軟的一位同學質疑Git用C語言開發,而將C++痛批了一頓(參見Linux之父炮轟C++:糟糕程序員的垃圾語言)。當時,他是這樣評論的:

C++正處在困境當中,它既無助於簡化,以實際用於進行原型化或者簡單的GUI編程,又不是像C那樣的簡潔的系統編程語言,能夠積極地鼓勵你使用簡單和直接的語言構造。

2010年6月5日到11日,他又在郵件列表中連續發貼,直截了當地炮轟C++。他明確表示:「我確實不喜歡C++,依我來看,它真的是一門很爛的語言。」

他還說,C++語言想解決的問題都不對路,都是一些皮毛問題,而沒有涉及真正深層次的問題。C++的對象、模板和函數重載都基本上純粹是C的語法擴展,是語法糖,總體上把C的語法和類型系統都弄得更糟。他建議,在系統編程里直接用C就可以,非系統編程里,應該選擇一種有垃圾收集的語言,C++語言的特性基本無用,只會搗亂。因此,什麼時候C++都不可能是正確的選擇

在另一個帖子中,他進一步說明,內核開發使用C語言而非C++的理由之一,是交流。在龐大的項目中,人們對不是自己開發的模塊並不了解,能快速理解其他模塊中函數的確切含義才能提高開發效率。而C++引入的各種抽象則使代碼非常依賴上下文,想理解一段代碼,需要看多得多的上下文。對於需要不斷打補丁(小段代碼)的內核來說,這是非常要命的。Linus也承認,在其他一些情況下,可能需要更多語言支持,語言級的內存分配機制如垃圾收集、並發、動態代碼生成等等。但是內核開發不需要。而且,即使是這些方面,C++也不靈。他不忘嘲笑C++的new關鍵字很蠢。

有人問到,C++沒有解決的深層次問題是什麼?Linus回答,比如並發。他進而又痛批了一通:C++是狗屎,根本沒啥設計,只是在C上面加了些渣滓而已

有人問Linus對Go語言怎麼看。他回答,Go語言里有些不錯而且重要的東西值得關注,許多決策都很合理。但設計者自己稱這個語言為實驗性的,這當然有其原因。而且,引入一種新語言沒那麼容易,過二十年再說吧。

此外,Linus還在另一個帖子里痛批了面向對象語言。他認為面向對象語言以對象為核心,加一些相關聯的方法,簡直是囈語。重要的東西應該是數據結構,對象本身有啥重要?真正有意思的,是在不同類型的不同對象交互而且有鎖規則的時候。但是,即使是這時候,封裝什麼「對象介面」也絕對錯誤,因為不再是單一對象的問題了。他的結論是,面向對象解決的都是一些小問題


沒有「老是炮轟吧」,就炮轟過一次,而且轟的是「C++標準太複雜導致不合格使用者太多,容易誤用和濫用語言特性」。

你列了一些C++的「好特性」,但作為一個10多年C++用戶,我在用其它語言時「唯一」十分想念的C++特性是確定性析構與RAII,其它都可有可無


從Linus的Subsurface代碼來看,我覺得比大部分C++黑好多了。


內核到處是OO思想,水平自然在你我之上。


這個真不知道,

因為實在找不到他寫過的C++代碼。


windows,linux,unix,mac osx,內核都是c語言、彙編寫的。有一種系統是c++寫的內核,就是諾基亞的塞班系統,現在已經死掉了,據說代碼量比win xp還大,連他們自己的程序員都無法維護,最後就死掉了。

所以c++不是做內核的料,c++可能是最複雜的語言,但是絕對不是最牛逼的語言。

Linus Torvalds不用c++絕對不是他技術不行的問題。


雖然我沒看過他寫的C++代碼,但是我覺得他的水平不足以跟豬一樣的隊友一起用C++寫linux,所以乾脆禁止了(逃


這個問題好像是在問 達摩祖師 槍法咋樣? 當然如果覺得他不夠達摩祖師的級別 也可以問 喬峰 用刀會不會很厲害?真正內力深厚的稻草都可以殺人 掃地僧用的是掃把 輕鬆制服慕容復他爹和喬峰他爹 語言只是工具 編程思想最重要 能解決實際問題最重要 如覺得無關請 無情的摺疊我吧:)


Linus專註的領域是os kernel,在這個領域裡目前沒有任何一個語言可以撼動C語言的主導地位,世界上使用最廣泛的操作系統kernel——linux和windows NT都是用C語言寫的。

我總結其原因有這麼幾點:

第一,C語言的性能模型和控制流非常簡單清晰,更接近硬體、更接近彙編。C++會引入不必要的複雜性。

具體說:

1) 性能模型變得不直觀

首先明確一點,內核是對性能的要求非常嚴格。C++很多語言特性是犧牲性能tradeoff開發效率的,不適用於內核開發。C++聲明一個棧上類變數的開銷很可能因為一個複雜的構造函數變得非常大,而且一眼還看不出來。另外拷貝構造函數、運算符重載、STL這些都會帶來同樣的問題,結果就是製造很多額外的profiling工作(想想C++11里move語義為了解決什麼問題)。

2) 控制流變得不直觀

這個問題的原因是C++引入了構造函數和析構函數。大家應該都見過,C++會引入全局類變數的,使得模塊載入的時候會有一些全局變數的constructor被調用,這些constructor可能還會調用一些別的東西,這會導致控制流變得不直觀,尤其內核對順序非常敏感,這會帶來很多麻煩的問題。

第二,Kernel里用不上繼承

內核很少會用到inheritance,反而狀態機用的會比較多。內核會涉及到很多概念,比如VM、Thread、Process、Schedule、FS等等,每個概念都是相對獨立和完整的概念,很難也沒有必要抽象成繼承鏈。複雜的繼承關係出現在應用層。OO是一種模塊化代碼的方式,但是並不適合所有的場景。無論是linux還是nt kernel的代碼模塊化都做的非常好,尤其是nt kernel,微內核代碼非常少,LZ感興趣可以找來看看。

update

Linus對C++的敵視還有另一個非常重要的原因——語言設計哲學。

C++的語言設計哲學是萬能語言,儘可能支持各種編程範式。而unix哲學裡是「Use the best tool for the job」,這也是為什麼unix平台上出現了perl、python、awk等一堆語言。顯然Linus是對萬能語言嗤之以鼻的。


只有沒入門的「碼農」才會問這種問題!什麼叫***C++水平?拿一門語言給這樣的大拿作標籤,簡直是人性的猖狂!人家的段位早就超越了一門語言了好不好!某個計算機語言這種標籤只適合插在「碼農」身上!


Linus 的 C++ 水平應該不怎麼樣,原因:他自稱 C++ 的豬隊友太多,但是他有 code review 的大權,如果他的 C++ 夠牛逼,完全可以否決豬隊友的代碼。


其實題主更應該問C++比C到底高明多少?

答案是在相當多領域引入C++除了裝逼沒有什麼積極作用


有時候不光看水平,還要看貢獻。他對開源世界的貢獻是巨大的,知乎上相信有不少能寫出來內核的高手,但是他們對這個世界有多少貢獻呢?


等你用C++寫了操作系統了,你就有資格這樣問了。


為什麼不找出他對C++攻擊的原話呢?或許他沒有噴過C++語言本身,只是C++確實不適合他和他的團隊做內核呢?


看看這本Linus親筆自傳,會更全面了解這傢伙:《只是為了好玩》


這個怎麼說呢,如果你要是說他什麼模版之類的東西,或者庫用的熟不熟,估計不太行,如果你是說他對語言理解深刻不深刻,那絕對還是很6的,畢竟敢說i am your god,思想是相通的。


這傢伙兩周就把git寫出來了,你們自己想想,自己兩年能寫出來不?

想起一句話,」我不是針對你 我是說在座的各位都是辣雞「。。。


感覺Linus主要是站在一個操作系統開發或者內核開發角度來看。如果開發大型應用軟體,既需要面向對象的設計來組織一個大型的軟體,又需要追求C一般的運行效率,似乎除了C++別的選擇不多。其次,感覺語言本身的價值是在其承載的項目上體現,選擇一門語言而沒有選擇另一種來開發,更多是歷史原因。


推薦閱讀:

Linus 真心誠意地誇過哪些人或技術?

TAG:C | 林納斯·托瓦茲LinusTorvalds |