C++老矣,尚能饭否?
C++之父 Bjarne Stroustrup
C++之父Bjarne Stroustrup的简历上只有一句话“C++缔造者”,这样的成就是荣耀无比的。但似乎C++似乎过于低调,让很多C++程序员都没有新消息可以接收。Java有Oracle等大公司推动、.NET有微软推动、HTML 5有Google等推动、包括PHP有众多用户和社区推动,那C++有谁在推动呢?
C++从20世纪80年代面世,经历了以下三个阶段的发展
第一阶段从1980年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
Borland已陨落
不管我们用的是Borland公司还是微软的VC环境,很少有程序员关心C++的标准和版本问题。我们经常能听到Java或.NET程序员谈论Java 7或者.NET 3.5等版本的新特性,但有谁关心过C++的新版本?
C++真的老了?
PHP | 5212 |
Java | 11824 |
C++ | 9252 |
ASP.NET | 2383 |
可以看出C++程序员的需求是旺盛的,甚至超越了因电子商务而红火的PHP程序员。C++并不因为版本的问题而遭到抛弃,廉颇老矣,尚能饭否的应该是VB这样的语言。因为在智联招聘里,VB这个关键词只有可怜巴巴的827个职位。
看来C++还是很多程序员的饭碗,大家一致用行动证明C++并没有老去,并没有被人所遗忘。只是我们身在C++中,并不太关心它的进步和发展,只要用C++能处理好手头上的工作,哪管C++ 11的未来?
为什么新手不选择C++?
很多新人喜欢Java或者.NET,因为他们开发起来相对简单,甚至说高效。以往C++的优势在于对硬件资源的合理分配,特别是代码行超过三万以后,C++的系统消耗优势更加明显,这也是为什么很多大公司热衷于C++做大型开发的原因。
但随着内存和CPU等硬件设备的降价,硬件资源和性能问题似乎不再成为程序员们考虑的问题。就好像386、486时代的PC用户还要为那几十K的内存优化费劲一样,C++程序员那穷尽极致的节约系统资源,已经被看做是费力不讨好,新手们自然不选择C++了。
其实百度和《魔兽世界》都是C++写出来的。
看C++ 11的新特性
C++没有垃圾回收机制,未来似乎也没有。如果你不小心没管住内存,那么就要对不起了,内存崩溃的情况不是不可能。在Java和.NET都支持垃圾回收之后,C++ 11还是显得有些另类。当然我们也是猜测,这样对内存的精确控制,是不是出于对程序开发更加精确的考虑?
新的C++ 11里将会支持多线程开发,这个与目前多核CPU技术的发展密切相关,能极大的提高C++开发成品的效率。这个新特性应该是与时俱进的改变,还是没有多少创新性。Visual Studio 2010也已经实现C++并行构建的功能。
Lambda表达式也是此次C++ 11标准中最为人诟病的特性,甚至有C++程序员直言“这Lambda太丑陋了,还不如Java,尽管Java的Lambda也是极其丑陋。”也有清醒的C++程序员认为Lambda表达式在大型项目中的应用还是不错的,新的语言机制会带来新的效率,尽管这会有些阵痛。关于Java 7与C#中Lambda表达式的优劣,请点击这里。
借用一位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++的转身似乎显得慢了一些。在移动开发和WEB应用红火的今天,C++的声音似乎小了一些,希望这次C++ 11的新闻不会被Java 7和HTML 5给淹没了。
C++ 11标准放出,骂的人比捧的人要多。一是认为原有的C++老标准已经满足需要,二是认为新标准加入的新功能让初学者更不能适应。这两种意见有道理,就如同Windows XP已经很方便了,Windows 7全新的操作让很多人不适应一样。