近日,2022年6月TIOBE編程語言排行榜正式發(fā)布。不出意外的是,Python繼續(xù)穩(wěn)居榜首,C語言、Java、C++、C#分列第2-5位。相比去年同期,C++的占有率大幅提升,而Java的熱度和流行度似乎正在逐步減弱。從目前的的趨勢來看,C++超越Java的可能性正在增加。
2020年6月TIOBE編程語言排行榜(前20名)
C++步步緊逼,Java節(jié)節(jié)敗退
在最新的一期榜單中,TIOBE官方也用“C++即將超越Java”的醒目標題,點出了這一重大變化。眾所周知,Java一直被奉為編程語言中的常青樹,但是隨著其他語言的追趕,Java的地位正遭受著巨大沖擊,業(yè)界甚至發(fā)出了“Java老矣,尚能飯否”的質疑聲。
在上個月的榜單中,TIOBE的CEO Paul Jansen就做出預測,C++將會是下一個超越Java的語言。通過對比不難發(fā)現(xiàn),C++的占有率達到9.63%,并以2.26%的增速,大踏步地追趕身前的Java。反觀Java,其占有率下降了1.07%,僅占比10.47%,與身后的C++的差距也被縮小至0.84%。
究其原因,Paul Jansen表示:“C++具有高性能的高級編程是其表現(xiàn)出色的主要原因。”需要指出的是,C++語言每三年都會修訂一次,這些修訂還包括了開創(chuàng)性的新特性,使得該語言能夠與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卻是節(jié)節(jié)敗退。
Java源于C++,兩者差異卻很大
有意思的是,Java的前身正是C++。
讓我們將時間拉回至三十年前,Sun公司的一位工程師James Gosling帶領其團隊基于C++,對其進行改造。他們去掉了C++一些不實用的功能和特性,又結合嵌入式系統(tǒng)的實時性要求,開發(fā)出一款面向對象的Oak語言。
經(jīng)過三年的迭代和升級,又恰逢互聯(lián)網(wǎng)崛起之際,Oak華麗變身并更名為Java。此后,由于其具備面向對象、“寫入一次,隨處運行”的可移植性等特點,Java迅速名聲大振。
事實上,Java由C++衍生而來,且Java語言的對象模型幾乎就是C++對象模型的簡化版。但是二者之間還是存在著明顯的差異的。
C++有而Java沒有的特性
- C++支持多重繼承,Java語言不支持多重繼承。但Java引入了接口的概念,可以同時實現(xiàn)多個接口。由于接口也具有多態(tài)特性,因為在Java語言中可以通過實現(xiàn)多個接口來實現(xiàn)與C++語言中多重繼承類似的目的。
- C++支持運算符重載,Java不支持運算符重載。
- C++支持預處理,Java沒有預處理器。雖然Java不支持該功能,但它提供的import機制和C++中的預處理器功能類似。
- C++支持默認函數(shù)參數(shù),Java不支持。
- C++支持goto語句,Java不支持goto語句(Java中goto是保留關鍵字)。
- C++支持自動強制類轉換,這會導致程序的不安全,Java不支持自動強轉,必須由開發(fā)人員進行顯式地強制類型轉換。
- C++中結構和聯(lián)合的所有成員均為公有,這可能會出現(xiàn)安全性問題,而Java根本就不包含結構和聯(lián)合,所有的內容都封裝在類里面。
Java有而C++沒有的特性
- Java提供了垃圾回收器來實現(xiàn)垃圾的自動回收,不需要程序顯式地管理內存的分配。在C++語言中,需要開發(fā)人員去管理對內存的分配(包括申請與釋放),而在C++語言中,通常都會把釋放資源的代碼放到析構函數(shù)中。Java引入了一個finalize()方法,當垃圾回收器將要釋放無用對象的內存時,會首先調用該對象的finalize()方法,因此,開發(fā)人員不需要關心也不需要知道對象所占的內存空間何時會被釋放。
- Java提供對注釋文檔的內建支持,而C++沒有。
- Java包含一些標準庫,用于完成特定的任務。例如,Java提供了用于訪問數(shù)據(jù)庫的JDBC庫,用于實現(xiàn)分布式對象的RMI等標準庫。而C++則依靠一些非標準的、由其他廠商提供的庫。
- Java具有反射機制,能夠在程序運行時進行自我檢查,同時也允許對其內部的成員進行操作。C++沒有提供這樣的特性。
- Java為解釋性語言,其運行過程為:程序源代碼經(jīng)過Java編譯器編譯成字節(jié)碼,然后由JVM解釋執(zhí)行。而C++是編譯型語言,源代碼經(jīng)過編譯和鏈接后生成可執(zhí)行的二進制代碼。因此,Java的執(zhí)行速度比C++慢,但是Java能夠跨平臺執(zhí)行,而C++不能。
- Java是純面向對象語言,所有代碼(包括函數(shù)、變量等)必須在類中實現(xiàn),除基本數(shù)據(jù)類型(包括int、float等)外,所有類型都是類。此外,Java語言中不存在全局變量或全局函數(shù),而C++兼具面向對象和面向過程編程的特點,可以定義全局變量和全局函數(shù)。
- Java語言中沒有指針的概念,這有效防止了C++語言中操作指針可能引起的系統(tǒng)問題,從而使程序變得更加安全。
- Java字符串類作為Java語言的一部分定義,而不是作為外加的延伸部分,在整個系統(tǒng)中建立字符串和訪問字符串元素的方法是一致的。C++不支持字符串變量,使用“Null”終止符代表字符串的結束。
總的來說,Java其實是由C++發(fā)展而來,保留了C++的大部分內容,其編程方式類似于C++,但是摒棄了C++的諸多不合理之處,從根本上解決了C++的固有缺陷。使得Java句法更清晰,規(guī)模更小,更易學,同時更具健壯性、安全性和平臺無關性。
C++的哪些特性是Java不能取代的?
想要了解兩種語言未來的發(fā)展趨勢,就不得不探討其不可替代性。針對“C++的哪些特性是Java不能取代的”這一話題,國內程序員小燦(化名)有話要說:
“我的工作是游戲服務端的開發(fā)。沒有真正做過服務端的人,很難體會到那種成就感——看著你寫的程序,運行在一臺普通的電腦上,然后可以支撐上千人流暢地游戲。”
根據(jù)其工作經(jīng)歷,他指出,你可以預測要用到的內存,可以預測需要的網(wǎng)絡流量,可以想象出,每一份數(shù)據(jù)如何在服務器和客戶之間流淌,可以描繪得出,每一個int,它在內存中是怎樣分布的。
“真的是優(yōu)雅,像一個無限次可導的映射一樣優(yōu)雅”,正如小燦所說,“那種感覺就是,你能控制一切。C++仿佛一把鋒利的屠龍刀,像切黃油般劃開惡龍那堅韌的鱗甲,讓你優(yōu)雅得將一條龍分解掉?!?/p>
另一位程序員“West”認為是性能,他表示,一般來說,雖然Java花了很多年時間努力使自己的性能接近C或者C++,但Java與原生應用還是存在一定的性能差距,這種差距對于普通的應用并不明顯,但對于性能要求較高的應用來說,就有點明顯了。
他強調,3D游戲通常都要挖掘硬件能力到極限,這類游戲就是配備當時最好的硬件還顯不夠,那么Java對性能的影響就不能忽視了。所以其實現(xiàn)在就算是Android這樣的Java為主的平臺,其上的很多游戲仍然是使用C++寫的。
C++和Java到底選哪個?
這兩種語言:前者難學、難上手,但競爭小一些,內卷比Java好得多。后者好學一點,也比較容易上手學,但競爭大,內卷嚴重。
你說學哪個,主要還是看你自己。
開發(fā)者說
寫在最后
事物的發(fā)展都是循序漸進的,編程語言亦是如此。無論如何,兩種編程語言都在不斷的演進和升級中得到優(yōu)化。對于從事不同工作的程序員來說,C++和Java也各自有其妙處。至于C++在未來是否會超越Java的位置,我們拭目以待!
參考鏈接:
https://www.icode9.com/content-1-700319.html
https://www.tiobe.com/tiobe-index/