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技能

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

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

掃碼新增小助手,立即加入社群

點選此處“ 閱讀全文 ”檢視更多精彩內容