C++與Java“相愛相殺”:一個步步緊逼,一個節節敗退

語言: CN / TW / HK

作者 | 莫奇

審校 | 千山

2022年6月TIOBE編程語言排行榜正式發佈。不出意外的是,Python繼續穩居榜首,C語言、Java、C++、C#分列第2-5位。相比去年同期,C++的佔有率大幅提升,而Java的熱度和流行度似乎正在逐步減弱。從目前的的趨勢來看,C++超越Java的可能性正在增加。

2020年6月TIOBE編程語言排行榜(前20名)

  PART 01  

  C++步步緊逼 

  Java節節敗退    

在新的一期榜單中,TIOBE官方也用“C++即將超越Java”的醒目標題,點出了這一重大變化。眾所周知,Java一直被奉為編程語言中的常青樹,但是隨着其他語言的追趕,Java的地位正遭受着巨大沖擊,業界甚至發出了“Java老矣,尚能飯否”的質疑聲。

在5月的榜單中,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#不相上下,且沒有垃圾收集器的性能損失。

此外,我們注意到,從2022年4月到6月的TIOBE編程語言排行榜來看,C++的佔有率一直在上升,而Java的佔有率卻在不斷下降。

如下圖所示,C++語言在4-6月的增速分別為1.14%、1.01%、2.26%,而Java的增速依次是-0.41%、-0.74%、-1.07%。

從演進趨勢來看,C++正在迎頭趕上,而Java卻是節節敗退。

  PART 02  

  Java源於C++ 

    兩者差異卻很大       

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

讓我們將時間拉回至三十年前,Sun公司的一位工程師James Gosling帶領其團隊基於C++,對其進行改造。他們去掉了C++一些不實用的功能和特性,又結合嵌入式系統的實時性要求,開發出一款面向對象的Oak語言。

經過三年的迭代和升級,又恰逢互聯網崛起之際,Oak華麗變身並更名為Java。此後,由於其具備面向對象、“寫入一次,隨處運行”的可移植性等特點,Java迅速名聲大振。

事實上,Java由C++衍生而來,且Java語言的對象模型幾乎就是C++對象模型的簡化版。但是二者之間還是存在着明顯的差異的。

  PART 03  

 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根本就不包含結構和聯合,所有的內容都封裝在類裏面。

  PART 04  

  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句法更清晰,規模更小,更易學,同時更具健壯性、安全性和平台無關性。

  PART 05  

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

想要了解兩種語言未來的發展趨勢,就不得不探討其不可替代性。針對“C++的哪些特性是Java不能取代的”這一話題,國內程序員小燦(化名)有話要説:

“我的工作是遊戲服務端的開發。沒有真正做過服務端的人,很難體會到那種成就感——看着你寫的程序,運行在一台普通的電腦上,然後可以支撐上千人流暢地遊戲。”

根據其工作經歷,他指出,你可以預測要用到的內存,可以預測需要的網絡流量,可以想象出,每一份數據如何在服務器和客户之間流淌,可以描繪得出,每一個int,它在內存中是怎樣分佈的。

“真的是優雅,像一個無限次可導的映射一樣優雅”,正如小燦所説,“那種感覺就是,你能控制一切。C++彷彿一把鋒利的屠龍刀,像切黃油般劃開惡龍那堅韌的鱗甲,讓你優雅得將一條龍分解掉。”

另一位程序員“West”認為是性能,他表示,一般來説,雖然Java花了很多年時間努力使自己的性能接近C或者C++,但Java與原生應用還是存在一定的性能差距,這種差距對於普通的應用並不明顯,但對於性能要求較高的應用來説,就有點明顯了。

他強調,3D遊戲通常都要挖掘硬件能力到極限,這類遊戲就是配備當時最好的硬件還顯不夠,那麼Java對性能的影響就不能忽視了。所以其實現在就算是Android這樣的Java為主的平台,其上的很多遊戲仍然是使用C++寫的。

  PART 06  

C++和Java到底選哪個?

這兩種語言:前者難學、難上手,但競爭小一些,內卷比Java好得多。後者好學一點,也比較容易上手學,但競爭大,內卷嚴重。

你説學哪個,主要還是看你自己。

  PART 07  

  開發者説  

  PART 08  

寫在最後 

事物的發展都是循序漸進的,編程語言亦是如此。無論如何,兩種編程語言都在不斷的演進和升級中得到優化。對於從事不同工作的程序員來説,C++和Java也各自有其妙處。至於C++在未來是否會超越Java的位置,我們拭目以待!

參考鏈接:

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

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

51CTO技術社羣招募啦

結識技術大咖,提升IT技能

暢談開發夢想,拓展人脈資源

參與話題討論,贏取互動好禮

掃碼添加小助手,立即加入社羣

點擊此處“ 閲讀全文 ”查看更多精彩內容