当前位置: 首页 > 科技观察

C++与Java“相爱相杀”:一个步步紧逼,一个节节败退_0

时间:2023-03-14 00:43:23 科技观察

近日,2022年6月TIOBE编程语言排行榜正式出炉。不出意外,Python继续高居榜首,C语言、Java、C++、C#分列2-5位。与去年同期相比,C++的份额明显增加,而Java的热度和流行度似乎在逐渐减弱。从目前的趋势来看,C++超越Java的可能性越来越大。2020年6月TIOBE编程语言排行榜(前20)C++越来越近,而Java正在节节败退这一重大变化。众所周知,Java一直被视为编程语言中的常青树,但随着其他语言的迎头赶上,Java的地位正在遭受巨大冲击,业界甚至发出了质疑的声音“Java老了还能吃”。在上个月的榜单中,TIOBECEOPaulJansen预测C++将成为下一个超越Java的语言。通过对比不难发现,C++的份额达到了9.63%,并以2.26%的增长率,大步追赶前面的Java。反观Java,其份额下降了1.07%,占比仅为10.47%,与身后的C++的差距也缩小至0.84%。究其原因,PaulJansen说:“C++的高性能高级编程是其性能突出的主要原因。”需要指出的是,C++语言每三年都会进行一次修订,这些修订还包括突破性的新特性。这使得该语言可与Java和C#相媲美,而没有垃圾收集器的性能损失。此外,51CTO注意到,从2022年4月至6月的TIOBE编程语言排行榜来看,C++的份额一直在上升,而Java的份额一直在下降。如下图所示,4-6月C++语言的增长率分别为1.14%、1.01%、2.26%,而Java的增长率分别为-0.41%、-0.74%、-1.07%。从演进趋势来看,C++在迎头赶上,而Java在节节败退。Java起源于C++,但两者的区别很有意思。Java的前身是C++。让我们把时间拉回到三十年前,来自Sun的工程师JamesGosling带领他的团队基于C++对其进行了改造。他们去掉了C++一些不实用的功能和特性,结合嵌入式系统的实时性要求,开发了面向对象的Oak语言。经过三年的迭代升级,恰逢互联网兴起,Oak转型更名为Java。此后,由于其面向对象、“一次编写,随处运行”的可移植性等特点,Java迅速名声大噪。事实上,Java是从C++派生出来的,Java语言的对象模型几乎就是C++对象模型的简化版。但是两者还是有明显的区别的。C++具有Java所没有的特性。C++支持多重继承,而Java语言不支持多重继承。但是Java引入了接口的概念,可以同时实现多个接口。因为接口也具有多态的特性,因为在Java语言中可以实现多个接口来达到类似于C++语言中多重继承的目的。C++支持运算符重载,Java不支持运算符重载。C++支持预处理,Java没有预处理器。虽然Java不支持这个功能,但是它提供的导入机制类似于C++中的预处理器功能。C++支持默认函数参数,Java不支持。C++支持goto语句,而Java不支持goto语句(goto是Java中的保留关键字)。C++支持自动转换,这会导致不安全的程序。Java不支持自动转换,必须由开发人员显式转换。C++中结构体和联合体的所有成员都是public的,这可能会带来安全问题,而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无法替代的”这个话题,国内程序员小灿(化名)有话要说:“我的工作是开发游戏服务器,对于没有真正从事过游戏服务器的人来说很难servertounderstand感受一下成就感——看到你写的程序,在普通电脑上运行,然后支持几千人流畅玩游戏。”根据他的工作经验,他指出,你可以预测将要使用的内存,你可以预测所需的网络流量,你可以想象每条数据如何在服务器和客户端之间流动,你可以描述每条数据如何int分布在内存中,“真的很优雅,优雅得像一个无限可推的映射”,正如小灿所说,“感觉就是你可以控制一切。”C++犹如一把锋利的屠龙刀,切之如牛油。打开恶龙坚韧的鳞片,让你优雅地拆龙。”另一位程序员“韦斯特”认为是性能,他说,总的来说,虽然Java花了很多年时间试图让自己的性能接近C或C++,但Java和原生应用还是有一定的性能差距,这个差距对于普通应用来说并不明显,但是对于性能要求高的应用来说就有点明显了,他强调3D游戏通常要挖掘硬件能力发挥到极致,这类游戏配备当时最好的硬件是远远不够的,所以Java对性能的影响不容忽视。所以其实即使是像Android这样基于Java的平台,上面的很多游戏还是用C++写的。C++和Java选哪个?这两种语言:前者难学难用,但竞争较小,自省能力比Java好很多。后者比较好学,比较容易上手,但是竞争性强,性格内向。你说学哪一个主要看你自己。开发人员说,事情到头来是一步步发展的,编程语言也是如此。不管怎样,两种编程语言都在不断的进化和升级中得到优化。对于从事不同工作的程序员来说,C++和Java也各有优势。至于未来C++是否会超越Java,我们拭目以待!参考链接:https://www.icode9.com/content-1-700319.htmlhttps://www.tiobe.com/tiobe-index/