作者丨千山
日前,荷兰软件质量评估公司TIOBE发布2022年12月编程语言排行榜。在最新榜单中,Python依然占据榜首位置岿然不动,而C++在TIOBE排名历史上首次超过Java,以0.12%的微弱优势跃居第三。
前三分别是Python、C、C++,Java则下降到第四。根据TIOBE公司的首席执行官Paul Jansen的说法,这是自2001年TIOBE指数公开以来,Java首次不在前三名之列。也是二十多年间,C++的排名第一次超过Java。

图源:互联网
需要指出的是,编程语言的排行有各种各样的评级依据,而TIOBE指数是衡量编程语言热门/受欢迎程度的一个指标。其百分比计算并不是基于市场份额,而是依据全球熟练的技术工程师、课程、第三方供应商数量,并使用流行的搜索引擎,如谷歌、必应、雅虎以及维基百科、亚马逊、油管等统计出排名数据。
因此,就TIOBE的榜单来说,它在一定程度上反映了某个编程语言的热度、时下流行度,但不能作为判定这门语言好不好、成不成功的凭据。作为开发者,了解编程语言的热度有其必要性,一方面可以用来考察编程技能是否与时俱进,另一方面在开发新系统时也可以作为语言选择的参考。
今年以来,C++和Java的排名一直比较焦灼。此前在《C++与Java“相爱相杀”:一个步步紧逼,一个节节败退》一文里,我们提到,在6月的TIOBE榜单中,“C++的占有率大幅提升,而Java的热度和流行度似乎正在逐步减弱。从目前的的趋势来看,C++超越Java的可能性正在增加”。如今,这一可能成为了现实。
有业内人士猜测,C++的激增或许部分得益于2020年12月稳定发布的C++ 20。C++之父Bjarne Stroustrup曾表示:“C++ 20是自C++11以来最大的发行版,它将是C++发展史上的里程碑。”其表现也的确不负众望。
Bjarne认为,C++ 最有实力的地方并不是它的某个独到之处特别伟大,而在于它在事物的大范围变化中的表现都很不错,更通俗地说,“C++的长处,更多在于它对许多问题都是很好的解决途径,而不在于它对某个特定问题是最好的解决途径”。
当然也有人对C++表示不满。微软Azure CTO Mark Russinovich就曾在今年公开放话,“是时候停止用C/C++启动任何新项目了,一切需要无垃圾回收语言的场景都该使用Rust”。出于对内存安全性的考虑,Russinovich表示应该弃C++而选Rust。
不过事实也证明,这一论断为时尚早。正如Bjarne所回应的那样:“新语言通常需要多年时间和重大努力才能在其广泛的应用领域与成熟语言相匹配。爱好者很少看到这一点,并且他们的评论往往是片面的。”而今C++在TIOBE 榜单上的强势表现也说明,开发者们对于C++这门与时俱进的老牌语言仍保持着相当高的青睐度。
如前文所说,TIOBE指数只是一种衡量标准。若跳开这一范畴,Java的表现有时更好,在所有编程语言中都是名副其实的佼佼者。
从社区规模看,Java以1650万排名第三,远超C/C++(1230万),仅次于Python(1690万)和JavaScript(1960万)。
研究公司Slashdata在其2022年第三季度的开发者国家状况报告中发现,“在过去两年中,Java的社区规模几乎翻了一番,从830万增加到1650万”。Slashdata报告还指出,Kotlin是增长最快的语言社区之一,Kotlin代码运行在Java虚拟机上,因此它的兴起也提升了Java。
从GitHub上的项目数量衡量,在2022年10月咨询公司Redmonk的编程语言排名中,Java同样排名第三,紧随Python和JavaScript。
Redmonk的联合创始人James Governor在今年4月的一篇文章中指出:“全球公有云三巨头——亚马逊、谷歌云、微软 Azure ,还有Oracle都在大力投资Java语言、运行时支持以及托管和管理服务,寻求为现代化赢得企业工作负载。“这种投资无疑是对于Java本身价值的高度认可。
早在2017年,时任Oracle软件开发副总裁的Mark Cavage就表示,“我们希望在下一个十年中实现Java至上,Java永存”。如今看来,这一期望并非妄言,Java在编程语言界的地位的确很难撼动。
但需要留心的是,Java在某些地方也会流露出“老将迟暮”之色。
根据StackOverflow的年度开发人员调查,在最受欢迎的技术列表中,Java在2018年获得了45.3%的受访者的支持。2020年,这一数字下降到40.2%。而在2022年,Java的赞美率仅为33.27%。
今年9月,Oracle正式发布了最新版本的编程语言Java 19,一如甲骨文的承诺——每年3月和9月更新Java版本,这一次依然没有跳票。但相较于甲骨文刷版本号的勤根不辍,开发者们对此的回应却有些意兴阑珊。年初的统计显示,37%的开发者还停留在2014年发布的Java 8版本,29%使用Java 11做开发,只有37%表示会考虑切换到Java 17 LTS。
Java不会很快消失,但有时候它也不再是人们的首选。
在最新的TIOBE排行榜上,除了老牌“常青树”之间的博弈,一些小众语言的突围也值得关注。其中,Kotlin和Julia 越来越接近前 20 名。Kotlin从上个月的28名跃至23, Julia则从32升至24。

图源:互联网
大众印象中,Python、C和Java的认知度和存在感可能比较高。实际上,Kotlin和Julia也各有其优势。
作为通用语言,Kotlin可以在Java工作的地方工作:服务器端应用程序,移动应用程序(Android),桌面应用程序。它适用于所有主要的工具和服务。当然最终应用还是因人而异。
Julia发展很快,但其生态系统仍有进步空间。多重派发(multiple dispatch)作为其杀手级特性值得感兴趣的开发人员加以了解(详见《是什么让Julia变得独一无二?》一文)。虽然关注度不如Python等热门语言。但是谁都无法否认Julia在科学计算领域的巨大优势。
据了解,TIOBE将于下个月公布2022年的年度编程语言,Python、C和C++将角逐年度语言奖。过去一年,Python的王者地位有目共睹,如今其以3.76%的涨幅占据16.66%的市场份额,也让它成为年度编程语言的最佳候选者之一。C++获得这一殊荣还是在2003年。今年的评选结果是王者归来还是黑马杀出,我们可以静心以待。
参考链接:https://www.theregister.com/2022/12/10/java_slips_behind_c_in/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur
我正在研究使用EventMachine支持的twitter-streamrubygem来跟踪和捕获推文。我对整个事件编程有点陌生。我如何判断我在事件循环中所做的任何处理是否导致我落后?有没有简单的检查方法? 最佳答案 您可以通过使用周期性计时器并打印出耗时来确定延迟。如果您使用的是1秒的计时器,您应该已经过了大约1秒,如果它更长,您就知道您正在减慢react器的速度。@last=Time.now.to_fEM.add_periodic_timer(1)doputs"LATENCY:#{Time.now.to_f-@last}"@