C++与Java:一场技术与技术的较量

发表时间: 2022-06-28 23:55

近日,2022年6月TIOBE编程语言排行榜正式发布。不出意外的是,Python继续稳居榜首,C语言、Java、C++、C#分列第2-5位。相比去年同期,C++的占有率大幅提升,而Java的热度和流行度似乎正在逐步减弱。从目前的的趋势来看,C++超越Java的可能性正在增加。

2020年6月TIOBE编程语言排行榜(前20名)

C++步步紧逼,Java节节败退

在最新的一期榜单中,TIOBE官方也用“C++即将超越Java”的醒目标题,点出了这一重大变化。众所周知,Java一直被奉为编程语言中的常青树,但是随着其他语言的追赶,Java的地位正遭受着巨大冲击,业界甚至发出了“Java老矣,尚能饭否”的质疑声。

在上个月的榜单中,TIOBE的CEO Paul Jansen就做出预测,C++将会是下一个超越Java的语言。通过对比不难发现,C++的占有率达到9.63%,并以2.26%的增速,大踏步地追赶身前的Java。反观Java,其占有率下降了1.07%,仅占比10.47%,与身后的C++的差距也被缩小至0.84%。

究其原因,Paul Jansen表示:“C++具有高性能的高级编程是其表现出色的主要原因。”需要指出的是,C++语言每三年都会修订一次,这些修订还包括了开创性的新特性,使得该语言能够与Java、C#不相上下,且没有垃圾收集器的性能损失。

此外,51CTO注意到,从2022年4月到6月的TIOBE编程语言排行榜来看,C++的占有率一直在上升,而Java的占有率却在不断下降。

如下图所示,C++语言在4-6月的增速分别为1.14%、1.01%、2.26%,而Java的增速依次是-0.41%、-0.74%、-1.07%。

从演进趋势来看,C++正在迎头赶上,而Java却是节节败退。

Java源于C++,两者差异却很大

有意思的是,Java的前身正是C++。

让我们将时间拉回至三十年前,Sun公司的一位工程师James Gosling带领其团队基于C++,对其进行改造。他们去掉了C++一些不实用的功能和特性,又结合嵌入式系统的实时性要求,开发出一款面向对象的Oak语言。

经过三年的迭代和升级,又恰逢互联网崛起之际,Oak华丽变身并更名为Java。此后,由于其具备面向对象、“写入一次,随处运行”的可移植性等特点,Java迅速名声大振。

事实上,Java由C++衍生而来,且Java语言的对象模型几乎就是C++对象模型的简化版。但是二者之间还是存在着明显的差异的。

C++有而Java没有的特性

  • C++支持多重继承,Java语言不支持多重继承。但Java引入了接口的概念,可以同时实现多个接口。由于接口也具有多态特性,因为在Java语言中可以通过实现多个接口来实现与C++语言中多重继承类似的目的。
  • C++支持运算符重载,Java不支持运算符重载。
  • C++支持预处理,Java没有预处理器。虽然Java不支持该功能,但它提供的import机制和C++中的预处理器功能类似。
  • C++支持默认函数参数,Java不支持。
  • C++支持goto语句,Java不支持goto语句(Java中goto是保留关键字)。
  • C++支持自动强制类转换,这会导致程序的不安全,Java不支持自动强转,必须由开发人员进行显式地强制类型转换。
  • C++中结构和联合的所有成员均为公有,这可能会出现安全性问题,而Java根本就不包含结构和联合,所有的内容都封装在类里面。

Java有而C++没有的特性

  • Java提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式地管理内存的分配。在C++语言中,需要开发人员去管理对内存的分配(包括申请与释放),而在C++语言中,通常都会把释放资源的代码放到析构函数中。Java引入了一个finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时会被释放。
  • Java提供对注释文档的内建支持,而C++没有。
  • Java包含一些标准库,用于完成特定的任务。例如,Java提供了用于访问数据库的JDBC库,用于实现分布式对象的RMI等标准库。而C++则依靠一些非标准的、由其他厂商提供的库。
  • Java具有反射机制,能够在程序运行时进行自我检查,同时也允许对其内部的成员进行操作。C++没有提供这样的特性。
  • Java为解释性语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C++是编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C++慢,但是Java能够跨平台执行,而C++不能。
  • Java是纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。此外,Java语言中不存在全局变量或全局函数,而C++兼具面向对象和面向过程编程的特点,可以定义全局变量和全局函数。
  • Java语言中没有指针的概念,这有效防止了C++语言中操作指针可能引起的系统问题,从而使程序变得更加安全。
  • Java字符串类作为Java语言的一部分定义,而不是作为外加的延伸部分,在整个系统中建立字符串和访问字符串元素的方法是一致的。C++不支持字符串变量,使用“Null”终止符代表字符串的结束。

总的来说,Java其实是由C++发展而来,保留了C++的大部分内容,其编程方式类似于C++,但是摒弃了C++的诸多不合理之处,从根本上解决了C++的固有缺陷。使得Java句法更清晰,规模更小,更易学,同时更具健壮性、安全性和平台无关性。

C++的哪些特性是Java不能取代的?

想要了解两种语言未来的发展趋势,就不得不探讨其不可替代性。针对“C++的哪些特性是Java不能取代的”这一话题,国内程序员小灿(化名)有话要说:

“我的工作是游戏服务端的开发。没有真正做过服务端的人,很难体会到那种成就感——看着你写的程序,运行在一台普通的电脑上,然后可以支撑上千人流畅地游戏。”

根据其工作经历,他指出,你可以预测要用到的内存,可以预测需要的网络流量,可以想象出,每一份数据如何在服务器和客户之间流淌,可以描绘得出,每一个int,它在内存中是怎样分布的。

“真的是优雅,像一个无限次可导的映射一样优雅”,正如小灿所说,“那种感觉就是,你能控制一切。C++仿佛一把锋利的屠龙刀,像切黄油般划开恶龙那坚韧的鳞甲,让你优雅得将一条龙分解掉。”

另一位程序员“West”认为是性能,他表示,一般来说,虽然Java花了很多年时间努力使自己的性能接近C或者C++,但Java与原生应用还是存在一定的性能差距,这种差距对于普通的应用并不明显,但对于性能要求较高的应用来说,就有点明显了。

他强调,3D游戏通常都要挖掘硬件能力到极限,这类游戏就是配备当时最好的硬件还显不够,那么Java对性能的影响就不能忽视了。所以其实现在就算是Android这样的Java为主的平台,其上的很多游戏仍然是使用C++写的。

C++和Java到底选哪个?

这两种语言:前者难学、难上手,但竞争小一些,内卷比Java好得多。后者好学一点,也比较容易上手学,但竞争大,内卷严重。

你说学哪个,主要还是看你自己。

开发者说

写在最后

事物的发展都是循序渐进的,编程语言亦是如此。无论如何,两种编程语言都在不断的演进和升级中得到优化。对于从事不同工作的程序员来说,C++和Java也各自有其妙处。至于C++在未来是否会超越Java的位置,我们拭目以待!

参考链接:

https://www.icode9.com/content-1-700319.html

https://www.tiobe.com/tiobe-index/

作者:莫奇

来源:51CTO技术栈