冒号课堂§6.1:系统语言 - 编程入门网
大批的C程序员。但这不是没有代价的,C++在兼容C的同时也保留了C的许多缺陷。Java成功的地方有很多,一个不容忽视的因素是它彻底摆脱了与C兼容的桎梏。由于C++对C的改革不彻底,又过于庞杂,并且效率上不如C,这使得C仍有其生存空间。略有讽刺意味的是,对C++批判最激烈的往往来自C的社区,比如Linux之父Linus Torvalds就曾激烈地批判过C++。”
“Linus?那可是我的偶像呢!”叹号惊讶道。 冒号劝诫:“如果你因为是他的粉丝而后悔学C++,那就是为他人的偏执买单,不管那人名气有多大。” 句号指出:“C++最为人诟病的地方有:语法过于复杂,学习曲线陡、开发效率低;支持的范式过多;OOP不彻底;自省(reflection)功能不足;支持指针操作导致安全隐患;没有自动垃圾回收,容易内存泄漏;没有线程支持;没有丰富的标准库支持图形界面、网络编程等。” “罪状不少哇!这些说法都有一定道理,但有些也有失公允。且听我一一道来。”冒号当起了辩护律师,“C++比较复杂这点没错,Stroustrup说过一句耐人寻味的话: 一种语言不够复杂是因为它还不够成熟。****肯定比儿童复杂,因为他要承担更大的责任。大家不妨看看Java从1.0到即将的7.0、C#从1.0到即将的4.0的发展过程,是否应证了这一点?当然C++的复杂度的确高于其他语言,但如果不执着于奇技**巧,它绝非高不可攀。C++的开发效率相比Java与C#,差距主要在两个方面:一是标准库不够完善,二是需要手工回收垃圾。关于前者,的确是C++的一大软肋,标准库竟然连企业应用中最常用的图形界面、网络编程、数据库处理、多线程等都不能涵盖,严重障碍了生产力。其实C++也有苦衷,不像Java和C#那样有大公司的鼎力支持,只靠效率极为低下的标准委员会来维护。98年的一个标准直到03年还在修订,下一个标准至少要到09年。连Stroustrup都在哭穷,声称没有足够的人力和时间来开发标准库,可为何广受赞誉的Boost库至今仍徘徊在标准门外?考虑到Boost的创办人大多出自标准委员会,其他无此背景的类库恐怕更难登C++之大堂了。相比之下D语言更惨,虽然天生丽质,苦无豪门青睐,只好一直待字闺中。” 叹号感慨:“金钱才是技术的最大推动力啊!” “话糙理不糙。”冒号也很无奈,“再来谈谈有关自动垃圾回收的问题。在C++中,程序员也不是非得手工清理垃圾不可的。更好的办法是遵循RAII的惯用法(idiom)[3],通过智能指针(smart pointer)来解决内存释放问题。” 逗号听不明白:“什么是RAII?” “RAII是Resource Acquisition Is Initialization的缩写,直译为‘资源获取即初始化’。”冒号解释,“其实更准确的叫法应该是RRIF(Resource Release Is Finalization),即‘资源释放即终结化’[4]。其思想是:将资源的取放与某一对象的生命周期绑定,初始化对象时获取资源,终结化对象时释放资源。用户代码不再直接管理资源,只需控制相应的对象即可。这样代码得以简化,资源的有效性也得以保障,并且还是异常安全的(exception-safe)[5]。” 问号猜想:“在Java中没有这种用法,是因为它已经有了垃圾回收器吗?” 冒号摇摇头:“问题的关键不在这里。资源不只限于内存,还包括文件、线程锁、数据库连接等等,这些都不是垃圾回收器所能解决的。看看Java的数据库应用代码吧,对于那些频繁出现的被try/catch/finally包裹的resultset.close()、statement.close()、connection.close(),你是习以为常呢,还是不胜其烦?” 逗号眼睛一亮:“如果采用RAII的技巧,这些都可以省去了吗?” 冒号再次摇头:“可惜Java不像C+ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |