C,C++,C#的点评
最近,Linux之父Linus Torvalds在事隔三年之后,又一次炮轟C++語言(見http://www.realworldtech.com/forums/index.cfm?action=detail&id=110563&threadid=110549&roomid=2 )。在國外技術社區掀起新一波的批判C++語言的狂潮。國內技術社區也不甘清凈,csdn在這里(http://news.csdn.net/a/20100612/218785.html)也有非常熱烈的討論。國內C++的大牛網易的云風也加入論戰(http://blog.codingnow.com/2009/01/the_new_c_standard.html)。
總結目前各方對C++的批判,主要觀點如下:
1. 做系統底層編程(比如linux內核、網易游戲引擎),C++和C相比沒有任何優勢。因為底層編程不需要C++那么多的“面向對象抽象”
2. 做上層應用編程(比如CRM、ERP等企業應用),雖然需要“面向對象的抽象能力”,但C++過多的語言機制導致C++語言陷阱太多(特別是稍不留神就有內存泄漏),因此應該選用提供垃圾收集機制的語言。(Linus沒說,但是基本指的是C#、Java幾個主流語言)。
雖然這種說法有些太過絕對,但是firelong認為還是相當有道理的。特別是第2點,因為以前我們公司就有一個C++寫得CRM項目,剛開始老板還讓我們在C++上繼續改,改了將近半年,全體人員都決定放棄了,轉到現在的C#上。Linus這種觀點出來后,C#社區好像很受鼓舞,我甚至在某個論壇上看到一些C#程序員在歡呼C#萬歲了。但是firelong的問題是,C#語言真的完美了嗎?仔細思考這個問題后,firelong認為并非如此。事實上C#語言現在一路狂奔,有點重蹈當年C++語言發展的覆轍。firelong將不成熟的思考寫出來,與大家共同討論。
?
firelong認為C#目前可能重蹈C++語言覆轍。微軟從2002年C# 1.0開始,到2010年8年時間推到C# 4.0,平均每2年一個新版本。其中屬于重大的語言特性有:泛型、Lambda表達式與linq、dynamic動態特性、并發編程。除了重大語言特性外,還有很多很多技巧語法。微軟這樣一路狂奔,只要是想出來的cool點子,都往C#語言里面加。 很多程序員也很追求cool的效果,瞧瞧看,我們C#語言又有XXXXXXXXX功能,你們Java、Python? XXXXX有嗎?
?
但問題是“新特性越多,語言就一定越強大嗎?”,我們真的需要那么多cool特性的編程語言C#嗎?
?C++語言走到今天的墻途末路,眾人踩踏的地步,跟C++語言過于臃腫的功能特性密切相關。 firelong這些年的編程經驗表明,語言新特性對語言并非一本萬利,而是可能會帶來很多傷害:
1. 新特性加重了編譯器的編譯負擔,編譯效率低下。大家試試很多linq項目的編譯速度就知道了。
2. 新特性加重了運行時的運行負擔,運行效率低下,大家試試很多dynamic動態新特性的運行效率就知道了。
3. 新特性加重了程序員的心智負擔,在寫代碼時必須考慮很多功能背后的影響,“顧前思后”就是C++程序員最后拋棄C++的一個很大的原因。大家回想一下現在在VS2010底下寫C# 4.0程序,還有當初寫C# 1.0程序的流暢性了嗎??
?
?有的朋友可能會說,那是firelong水平低,對這些新特性沒有掌握好,所以要批判C#新特性。首先firelong水平不一定低(帶一個10人的C#隊伍已經近2年)。其次水平再高,也有心智負擔。看看Linux之父Linus Torvalds和網易的云風等諸多國內外大牛批判,他們可都是響當當的C++技術大牛,難道是對C++各種特性不熟練所以才批判C++?
綜上所述,firelong對微軟C#編譯器組有以下建議:
保留C#以下功能:
1. 面向對象
2. 接口
3. 構造器、字段、方法
4. 垃圾收集
5. 異常
6. 并發支持——這是firelong唯一投票支持的新特性,因為它在今后的項目太常用了。
7. 和其他語言的互操作(類似P/Invoke)——那些不適合C#做的,用其他語言來做,然后與C#互操作。
?
然后將研發精力投入C#語言的代碼優化和內存收集優化上,讓C#成為一門效率超高的語言,比那些華而不實的新特性重要得多!
?
刪除C#以下功能:
1. 委托和事件(這些都可以用接口來做,參考Java)
2. 反射(反射用處很小,如果真想用反射,請用其他語言)
3. 特性(也可以用接口做,C++沒有特性不是一樣活得很好)
4. 屬性、索引器、析構器(都是方法)
5. JIT編譯(直接編譯成native代碼,完全沒必要JIT,微軟當初JIT是因為承諾跨平臺,但是現在C#真的跨平臺了嗎?還是Windows上跑,Mono這種阿斗別提了。)
6. 泛型(沒必要,用的很少)
7. Linq(去掉,還是用Sql語句+存儲過程來的實際)
8. dynamic(去掉,真想dynamic,讓ruby、python, f#等去做吧)
9. 還有更多。。。。大家來補充
?
firelong說得不一定對,但是firelong相信一個簡潔、高效的語言,比那一堆華而不實的“新特性”要有用得多——語言最后的威力是“開發軟件”,而不是“比拼新特性”。
為什么C語言至今仍是編程語言的王者?它滿足了簡潔、高效!而不是它有很多新特性。如果C#不這么做,將會有其他語言埋葬C#。就像C慢慢埋葬C++,Ruby慢慢埋葬Java一樣。
?當然微軟C#編譯器組不會聽firelong的建議,但是如果這樣下去,C#幾年之后將比現在的C++更為臃腫,那時候批判C#的就不止firelong一個人了,恐怕也不僅僅是批判了。
轉載于:https://www.cnblogs.com/vvv999vz/archive/2011/01/22/2125367.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的C,C++,C#的点评的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: robots.txt文件里面怎样屏蔽蜘蛛
- 下一篇: C# 正则表达式(备忘录)