C++ 的什么是 Java 不能取代的?

十几年前,大学的时候,我们的入门编程语言就是c++。我至今还记得两个很搞笑的事情。1》 大一开始上c++的课的时候,我有个同学,外号黄牛,拿着一本《21精通C++》,问老师:老师,我能够21天精通C++吗?老师像白痴一样看着他:我21年都没有精通C++。2》大一暑假的时候,我打算乘暑假把JAVA给入门了,坐在我旁边的舍友kim看见我在那里看JAVA,叫嚣说:C++才是王道。后来,我们宿舍6个人,只有我一直在C++领域,其他人都已经不用C++了。那个kim现在在迅雷,写php去了,薪水老高了,他现在的口号是:PHP是世界上最好的语言。这些已经是题外话了。后来出来工作,第一份工作是windows的应用程序。有段时间,我很困惑,看着要开发的程序,心里的想法是:这些代码,不需要我有如何高深的技巧,如何熟练C++,只要照着前人的代码样子,复制更改一下就OK了,换一个人来,可以做得同样好,有必要每天晚上还孜孜不倦地看书吗?然后我辞职了。接着的工作是游戏服务端的开发。我觉得,如果没有真正做过服务端的人,很难体会到,那种看着你写的程序,运行在一台普通的PC上,然后可以流畅地支撑上千人流畅地游戏,然后,你可以预测要用到的内存,可以预测需要的网络流量,可以想象得出,每一份数据如何在服务器和客户之间如何流淌,可以描绘得出,每一个int,它在内存中是怎样分布的。那种感觉就是,你能控制一切。现在,我的代码在一个内存只有2k的芯片长时间运行,捕捉感应数据,然后通过tcp,串口,红外,将数据流出去,服务器收到数据,将数据交给内嵌的lua控制模型,控制模型计算后,交给一个内嵌webkit的客户端,展现出来。于我来说,C++就是一把锋利的屠龙刀,像切黄油般划开恶龙那坚韧的鳞甲,让你优雅得地将一条龙分解掉。真的是优雅,像一个无限次可导的映射一样优雅。

Bjarne Stroustrup描述c++为"a general purpose programming language providing a direct and efficient model of hardware combined with facilities for defining lightweight abstractions"(C++ Programming Language, 4th Edition). 这个定义基本上涵盖了C++相对于其他语言最重要的两个优点。『direct and efficient model of hardware』是指,使用C++,你所用的数据类型和在实际硬件上的执行情况一一对应。在x86架构上,当你写下int i=0,你知道编译器为你生成的源代码一定是xor eax, eax。当你声明一个对象的时候,你知道它什么时候分配,是存储在stack上还是储存在heap里,heap上的对象什么时候消失,你也知道相邻的成员一定在内存上相邻(不考虑alignment, 事实上alignment在新版本的c++中也可以直接控制,不再依赖于编译器扩展)。而在Java中,你对此没有控制,当你声明一个Integer,你不知道,也不该知道JIT编译器如何实现你的这条指令,也不会知道Integer的内存模型是什么。这使得用C++写driver和kernel成为可能,也使得C++可以充分的利用硬件性能。『lightweight abstraction』要从两方面来看。『abstraction』是从和低级语言©比较的角度看的,很多c的idiom并不美:想想字符串处理和enum的作用域。相比之下,C++提供了非常完善的语言机制,来实现结构化、面向对象和泛型的语言模型。这种抽象使得你可以写出非常有表现力的代码,拿lambda举个例子:std::sort(vec.begin(), vec.end(), [](const T& t1, const T& t2) {
return t1.member1 < t2.member1;
});
你可以看到c++的表现力——这段代码是类型安全的,你在c当中调用qsort()需要指针转换;这段代码也是通用的——它不耦合于特定的类型(比如说Java的Collection和Array就有不同的sort方法)。而C++的表现力远不止于此,容器和智能指针的存在,使得你可以几乎消除一切恼人的内存分配、强制类型转换;RAII,使得异常安全的资源分配更加简单…。『lightweight』,则是从和更高级的语言相比较而言的。前面所述的代码,在Java里大概可以通过定义Interface和匿名内部类来实现。但这些都会引入额外的运行时消耗(不管有多小)。当你试图榨干硬件的最后一点性能的时候,你会发现这种消耗成为一种无法去除的障碍——你无法掌控JIT怎样优化你的代码。而c++的抽象,一般来说遵循『不为我没有使用到的特性付费』的原则。你使用RAII的时候,不会比手动分配资源多出任何的代价。如果你不使用Virtual Function,对象里就不会有VPTR;如果你写了一个通用的模板类sort(),你知道它所生成的代码和你手动为特定的类写的代码不会有任何不同;而在Java里你没有这样的选项:要不然你引入运行时负担(通过接口或者类型擦除和向下转换),要么你为每个特殊类型重写代码。除此之外,C++还有一些值得提出的好处,但这些和语言本身的设计并不直接相关,包括但不限于:——完善的系统支持,今天的操作系统,绝大多数基于C/C++的结构设计。——完善的编译器,我常常发现自己手写的代码profiling还不如STL的代码快,拿插入vector举例,很多编译器甚至会直接生成memcpy调用。所以,c++的什么东西Java不能取代呢?- Java很大程度上是一种『为了安全』而设计得语言,它用代码的冗余和功能的受限来换取使用的简易程度;在c++里,你能写出更加通用而简洁的代码。- 而且这种表现力并不以牺牲性能为代价。C++几乎和C一样快。- 更加灵活的编程模型——Java很大程度上依赖于类的层级结构。而C++下,你不需要为了写出通用的代码来构建庞大的继承树。- 随时深入底层的能力。大部分时候你不需要关心STL后面是什么,额外的代价是多少。但是当你确实需要的时候,你可以很轻松的控制这些——而不需要牺牲抽象性。以下是夹带的个人意见:人们对C++的憎恨,很大程度上是长期以来的误解。你可以用C++写出很坏的代码;但任何语言都不能阻止这一点(哪怕是Python)。今天的C++是一门出色的语言:它仍旧保留着效率和深入底层的能力;而标准库和新语言特性使得保留这种能力所需要付出的代价日益减少。没有『终极语言』,但在可以预见的将来,任何程序员的技能库中,C++始终将是一个非常重要的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值