說它是糟糕程序員的垃圾語言?
亮點是,糟糕程序員(重點,要考)的垃圾語言!
也就是說,C++也許是精致程序員的寶,而糟粕程序員無疑會使其變為垃圾語言。
所以,linux之父說的沒毛病啊!開個玩笑,其實事件由來是兩個高手間的爭論。
Linux之父Linus Torvalds為Linux內核開發而專門打造的版本控制軟件Git,已經引起了業界的廣泛關注。有位Dmitry Kakurin老兄在查看了源碼后,發現其使用的是純C而非C++,表示不可理解,便吐槽道:
“別拿可移植性說事兒,這是屁話(BS,bullshit)。”
(此外,他還批評Git工程中蠻力地直接讀寫文本的方式,既繁瑣又易錯,而且使對上層邏輯的理解變得非常困難。)
這個吐槽引起Torvalds的強烈反應,他用“*YOU* are full of bullshit.”(你才滿嘴屁話呢)作為自己反駁的開場白。接著,他轉向對C++罕見的火藥味十足的炮轟:
“C++是一種糟糕的(horrible)語言。而且因為有大量不夠標準的程序員在使用,而使情況更糟,以至于極容易產生徹頭徹尾的垃圾(total and utter crap)。老實說,選擇C就是為了把C++程序員踢出去?!矣羞@樣的結論,任何喜歡用C++而不是C開發項目的程序員,可能都是我希望踢出去的人,免得他們來搞亂我參與的項目。C++會導致非常非常糟糕的設計選擇。你們這些C++程序員總是一上來就用語言的那些‘漂亮的’庫特性,比如STL、Boost和其他徹頭徹尾的垃圾,這可能對你們的程序有所‘幫助’,但是卻會導致:
——當庫無法工作時,帶來無窮無盡的折磨(別跟我說什么STL,尤其是Boost,很穩定而且可移植性很好,那全是屁話,而且一點都不可笑)
——低效的抽象編程模型,可能在兩年之后,你會注意到,有些抽象效果并不怎么樣,可所有代碼已經依賴于它所設計的‘漂亮’對象模型了,如果不重寫應用程序,就無法更正。
也就是說,使用優秀的、高效的、系統級的及可移植的C++的唯一方式,最終還是僅限于C本身具有的所有特性。項目限制只用C,意味著參與的人不會搗亂,也意味著會得到許多真正懂得底層問題,又不會折騰那些白癡‘對象模型’垃圾的程序員。
所以,我很抱歉,對于Git這樣效率為主要目標的軟件,C++的所謂優點只是巨大的錯誤。而我們將看不到這一點的人排除在外,這便是巨大的附加優勢。
如果你想要用C++寫的版本控制系統,去玩Monotone吧。他們確實使用了‘真格的數據庫’、‘漂亮的面向對象庫’、‘漂亮的C++抽象’??墒牵f實話,所有這些,對某些所謂的計算機專業人士而言富于吸引力的設計方案,其最終結果確是一堆可怕、難以維護的垃圾?!?/p>
Torvalds和Dmitry Kakurin爭論繼續中。
對Torvalds的回擊,Dmitry反唇相譏:
“隨著只用C編程的恐龍們逐漸滅絕,你很快就會發現只剩下自己一個人在固執己見。用Git貢獻者的數量是說明不了問題的。顯然C++開發者也能夠貢獻C代碼。但是以為他們喜歡這種方式,那可就錯了。 沒有C的時候,我用匯編編程。而后,在C++誕生之前,我轉向了C。現在,我使用C++和C#,而且不會走回頭路。差勁的程序員用任何語言都寫不出好程序。但是為了將差勁的貢獻者拒之門外,這樣一個沒譜的理由而懲罰優秀的開發者,這簡直是胡鬧?!?/p>
只過了10幾分鐘,Torvalds就回貼了:
“和你不同的是,我實實在在地給出了不喜歡C++的原因,而且指出了它可能導致的各種問題的實例。而你呢,沒有給出一條像樣的使用C++的理由。事實上,Git比其他軟件配置管理軟件都要好,而好的品味(taste)和C正是原因之一?!?/p>
對上面的最后一句話,Torvalds后來又做了如下補充:
“說得更具體一些:
——簡單和清晰的核心數據結構, 非常精益(lean)且頗具雄心的代碼管理著它們,將“簡單勝于花哨”這一方法發揮到極致。
——有意識地不抽象數據結構和算法,因為它們恰恰是Git核心的全部要素(whole point)。
如果你想用更花哨的語言,C++絕對是最糟糕的選擇。如果想要真正的高級特性,那就選擇有垃圾回收或者好的系統集成的,而不是既缺乏C的簡約(sparseness)又缺乏C的直接,而且還沒有重要概念的高層綁定(high-level bindings to important concepts)的東西。
一言以蔽之,C++正處在困境之中,它既無法幫助原型化或者簡單的GUI編程足夠簡化從而真正可用,又不是C那樣積極地鼓勵你使用簡單和直接的語言構造的精益系統編程語言。”
(另一位同學插了一句:這還沒有提到很難找到兩個C++編譯器支持同樣的特性。)
“這與什么恐龍毫無關系。好的品味永遠不會過時。將C與匯編語言相提并論,恰恰說明你對自己所討論的問題缺乏起碼的概念(don't have a friggin idea)?!?/p>
爭論還在繼續。半個小時之后,Dmitry回帖:
“我說過,這是一種信仰問題。因此,任何講道理和爭論都會無窮無盡,而且也毫無意義,就像任何其他宗教問題一樣。
我來講講Git開發應該使用C++的理由(而不是一般意義上C++對任何項目都更好的理由,這種說法同樣也是毫無意義的):
1. 好的String類能夠大大提高代碼的可讀性(而且代碼也會顯著減少)
2. 好的Buffer類——理由同上
3. 管理內存和文件/套接字/鎖句柄的智能指針和智能句柄
就目前而言,通過這種繁瑣的宏管理字符串和內存,很難看出高層邏輯。”
接下來他的語氣變得緩和,甚至最后還用了一個笑臉:
“以我之見,Git具有非常漂亮的高層設計(對象數據庫,使用散列數據和元數據的簡單且容易訪問的存儲。)向你贊一個!
但是具體實現方式——C和shell腳本的混合、自底向上發展出來的命令行界面,就很一般了。
我可沒有將C與匯編語言相提并論。我只是要指出我曾經用許多不同的語言編程,目睹了糟糕的程序員用任何語言都會寫出差勁的代碼。因此這實際上是與語言無關的。”
Torvalds則依然怒氣未消,他反駁Dmitry對Git用宏管理字符串和內存的批評:
“完全是屁話。字符串/內存管理根本無關緊要。還是去看看源代碼吧(我敢打賭你沒有看過)。這不是重要的部分,而且也不復雜。唯一真正重要的部分是設計。有些部分之所以是用 ' 原型化語言 ' 編寫,恰恰是因為它們不是核心部分,而且會被C慢慢地替換掉。C++可沒有辦法替換shell腳本或者Perl代碼。而且C++也沒辦法讓真正核心的部分變得更好。
顯然你這一輩子已經經歷了 ' 匯編-> C -> C++/C# ' 的轉變過程,你將我這樣一直堅持用C的比作 ' 恐龍 ',似乎這是一種向更好/更現代的語言不可避免的演進。這是毫無根據的,因為C在很多方面都遠遠優于C++(更優于C#),包括可移植性,還有接口和低層支持。
你當然可以用任何語言編寫糟糕的代碼。但是,有些語言,尤其是帶有一些心理(mental)包袱的語言本身就非常糟糕。你這樣的新手跑來指出一些絕對無關緊要的補丁特性(此處應該指C++對C的增強特性),用它們作為一種語言優越的論據(這些東西語言原作者都不喜歡),這一事實本身恰恰說明你滿腦子都是糊涂概念,應該好好醒悟一下了。
對于Git核心代碼真正重要的,是諸如這樣的事情:編寫自己的對象分配代碼,使內存占用盡可能小,從而能夠高效地記錄百萬對象的標志。這實際上是為樹形關系的多個對象編寫本質上非常優化的分析程序,因為這里沒有任何抽象。這絕對是在原始內存字節一級上的。
這些事情能夠用C之外的語言編寫嗎?當然可以。但是那些認為C++字符串處理這樣的高級特性很重要的人肯定是寫不出來的。
事實上,這正是C擅長的事情。不僅指語言本身,還包括一種必需的心態(mentality)。C最大的優點之一,就是它不會使你認為程序是什么高層的東西。正是后一種心態會使你明顯偏向其他語言,但實際上從Git的角度看來,所謂 ' 高層 ' 恰恰是錯誤的。”
Dmitry回帖:
“我不僅看過源代碼,而且還做過很多調試工作。我發現的問題大多數都與處理Windows上的路徑(也就是字符串處理)有關。”
他表示不再糾纏于“C與C++孰優孰劣”的討論,而是介紹了一下自己的出發點:
“我的目的是使用Git時,若遇上有些功能無法使用的情況,我想能夠在盡可能最短時間、花費最小的力氣進行改正,并貢獻改正的代碼。對我來說,這只是我主要工作的一種消遣而已。
而Git用C編寫這一事實,對這一目的毫無好處。建議使用C++,是現有C代碼基礎的唯一出路。所以,雖然C++可能從學術上來講并非最佳選擇,但它是唯一切合實際的選擇。
‘除了其他已經嘗試過了的政體之外,民主是政體的最差形式?!獪厮诡D 丘吉爾。
現在,我認識到自己只是一個不太活躍的貢獻者,但我希望自己的聲音能夠被人聽到。而那些承擔開發和維護Git的主要負責人也應該發出自己的聲音?!?/p>
此后,Torvalds沒有再發言,大概是認為自己已經大獲全勝。而另外一些Git貢獻者繼續對Dmitry進行反駁,可以看出,Torvalds的看法并不是他的私見。Theodore Tso說:
“我認為字符串處理是C++會找來大麻煩的地方之一。糟糕的程序員(原文為idiot)會這樣寫代碼:
a = b + "/share/" + c + serial_num;
其中你肯定無法弄清到底分配了多少內存,因為有類型強制轉換、重載的操作符(感謝上帝,在C++中你可以重載逗號操作符?。?,而當這種東西出現在內循環中,結果將是性能上的大災難,而且原因還不易查找!”
另外還有同學諷刺說,的確有不少C++程序員貢獻代碼,但是反而需要核心的C程序員花費更多時間去修改和刪除。