C++老矣,尚能飯否?
原創(chuàng)【51CTO獨家特稿】中國人讀“C++”時存在兩種讀音,一種讀作“C加加”,另一種讀作“C plus plus”。兩種讀音似乎都沒錯,只是遵從不同的標準罷了。如同C++有兩種讀法一樣,目前C++陣營甚至沒有一個完整的標準,只有最符合和接近C++標準的編譯器GNU GCC 4.6.1和微軟的Visual Studio 2010 SP1。C++這個在Tiobe編程語言排行榜中躋身三甲的語言,為何連完整的標準都沒有?
C++之父 Bjarne Stroustrup
C++之父Bjarne Stroustrup的簡歷上只有一句話“C++締造者”,這樣的成就是榮耀無比的。但似乎C++似乎過于低調,讓很多C++程序員都沒有新消息可以接收。Java有Oracle等大公司推動、.NET有微軟推動、HTML 5有Google等推動、包括PHP有眾多用戶和社區(qū)推動,那C++有誰在推動呢?
C++從20世紀80年代面世,經歷了以下三個階段的發(fā)展
第一階段從1980年代到1995年。這一階段C++語言基本上是傳統(tǒng)類型上的面向對象語言,并且憑借著接近C語言的效率,在工業(yè)界使用的開發(fā)語言中占據了相當大份額;
第二階段從1995年到2000年,這一階段由于標準模板庫(STL)和后來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重性。當然,同時由于Java、C#等語言的出現和硬件價格的大規(guī)模下降,C++受到了一定的沖擊;
第三階段從2000年至今,由于以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發(fā)展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。
Borland已隕落
相信很多程序員跟51CTO記者一樣,在大學里學習過《C++語言程序設計基礎》。聽著老師們指著譚浩強的《C++程序設計》,不厭其煩的講解char、int等數據類型的取值范圍,指針指向地址取值的問題。在這過程中我們接觸的第一個IDE(編譯器)是Borland公司的C++ Builder,盡管他已經淪落到被人收購的境地。2009年5月6日,英國軟件商Micro Focus宣布,公司將以7500萬美元現金收購Borland軟件公司,一代軟件開發(fā)工具先驅者隕落了。
不管我們用的是Borland公司還是微軟的VC環(huán)境,很少有程序員關心C++的標準和版本問題。我們經常能聽到Java或.NET程序員談論Java 7或者.NET 3.5等版本的新特性,但有誰關心過C++的新版本?
51CTO記者隨機對一些C++程序員進行了調查,有50%的程序員表示對開發(fā)語言的新版本有興趣,但不會用到實際工作中。只有當所在公司要求他們統(tǒng)一進化到新版本時,才會使用新版本。有10%的程序員會從繁忙的工作中抽出時間來學習新版本,并獨自運用到開發(fā)工作中。剩下40%的程序員表示天天加班,根本沒有時間看所謂的新版本,到時候現學吧。
這樣的調查結果讓我們了解了國內程序員對編程語言新版本的態(tài)度。從51CTO發(fā)布的新聞《掀起C++ 11的神秘面紗》中,我們聽到了不少C++的程序員對于C++ 11的悲觀論調,甚至預言未來的C++ 11進不了編程語言排行榜的前十。
C++真的老了?
現在最好找工作的程序員是哪一類?根據51CTO編輯在智聯(lián)招聘網站,以北京地區(qū)為范圍,搜索到不同開發(fā)語言工作崗位數量如下:
PHP | 5212 |
Java | 11824 |
C++ | 9252 |
ASP.NET | 2383 |
可以看出C++程序員的需求是旺盛的,甚至超越了因電子商務而紅火的PHP程序員。C++并不因為版本的問題而遭到拋棄,廉頗老矣,尚能飯否的應該是VB這樣的語言。因為在智聯(lián)招聘里,VB這個關鍵詞只有可憐巴巴的827個職位。
看來C++還是很多程序員的飯碗,大家一致用行動證明C++并沒有老去,并沒有被人所遺忘。只是我們身在C++中,并不太關心它的進步和發(fā)展,只要用C++能處理好手頭上的工作,哪管C++ 11的未來?
為什么新手不選擇C++?
很多新人喜歡Java或者.NET,因為他們開發(fā)起來相對簡單,甚至說高效。以往C++的優(yōu)勢在于對硬件資源的合理分配,特別是代碼行超過三萬以后,C++的系統(tǒng)消耗優(yōu)勢更加明顯,這也是為什么很多大公司熱衷于C++做大型開發(fā)的原因。
但隨著內存和CPU等硬件設備的降價,硬件資源和性能問題似乎不再成為程序員們考慮的問題。就好像386、486時代的PC用戶還要為那幾十K的內存優(yōu)化費勁一樣,C++程序員那窮盡極致的節(jié)約系統(tǒng)資源,已經被看做是費力不討好,新手們自然不選擇C++了。
其實百度和《魔獸世界》都是C++寫出來的。
看C++ 11的新特性
C++沒有垃圾回收機制,未來似乎也沒有。如果你不小心沒管住內存,那么就要對不起了,內存崩潰的情況不是不可能。在Java和.NET都支持垃圾回收之后,C++ 11還是顯得有些另類。當然我們也是猜測,這樣對內存的精確控制,是不是出于對程序開發(fā)更加精確的考慮?
新的C++ 11里將會支持多線程開發(fā),這個與目前多核CPU技術的發(fā)展密切相關,能極大的提高C++開發(fā)成品的效率。這個新特性應該是與時俱進的改變,還是沒有多少創(chuàng)新性。Visual Studio 2010也已經實現C++并行構建的功能。
Lambda表達式也是此次C++ 11標準中最為人詬病的特性,甚至有C++程序員直言“這Lambda太丑陋了,還不如Java,盡管Java的Lambda也是極其丑陋。”也有清醒的C++程序員認為Lambda表達式在大型項目中的應用還是不錯的,新的語言機制會帶來新的效率,盡管這會有些陣痛。關于Java 7與C#中Lambda表達式的優(yōu)劣,請點擊這里。
借用一位C++程序員的例子來說明Lambda的正面作用,在C++中,STL的很多算法都要求使用者提供一個函數對象。例如for_each函數,會要求用戶提供一個表明“行為”的函數對象。以vector<bool>為例,如果想使用for_each對其中的各元素全部賦值為true,一般需要這么一個函數對象,
- class filler
- {
- public :
- void operator ()( bool & i) const {i = true ;}
- } ;
這樣實現不但麻煩,而且不直觀。而如果使用lambda,則允許用戶使用一種直觀和見解的方式來處理這個問題。以boost.lambda為例,剛才的問題可以這么解決:
- for_each(v.begin(), v.end(), _1 = true );
面對Java和.NET這樣的后起之秀,C++的轉身似乎顯得慢了一些。在移動開發(fā)和WEB應用紅火的今天,C++的聲音似乎小了一些,希望這次C++ 11的新聞不會被Java 7和HTML 5給淹沒了。
C++ 11標準放出,罵的人比捧的人要多。一是認為原有的C++老標準已經滿足需要,二是認為新標準加入的新功能讓初學者更不能適應。這兩種意見有道理,就如同Windows XP已經很方便了,Windows 7全新的操作讓很多人不適應一樣。
搞C++要有革命熱情
一切只能等C++ 11真正出臺,讓更多的C++程序員用到C++ 11才能有說服力。僅憑媒體放出的一些新特性恐怕還不足以讓大家完全了解C++ 11的真面目。51CTO編輯認為,C++ 11能把C++這款“老”編程語言帶到一個新的高度,C++還會是排名三甲的編程語言。
【編輯推薦】