C與C++、Java、C#、Go、Python、Carbon等程式語言的優缺點、差異及對比?
圖片來源:pixabay
數十年來C語言一直可謂是編程界的扛把子。Linux、Windows、Mac和許多其他作業系統的內核都能看到它的身影。C語言幾乎可以寫任何程序,在程式語言中的地位,德高望重。它甚至可能是有史以來最具影響力的語言。它的語法啟發了許多其他語言,包括Cpp、Csharp、Java、JavaScript、Go、Perl等等。
自1972年以來,C程式語言一直是構建軟體的主力語言之一。但是過去50年以來,已經湧現出數十種新語言,這些後輩語言的表現又如何?其中一些正在挑戰C的統治地位,而另一些正在不斷蠶食其地位。
撼山易,撼C語言難!在性能、裸機兼容性和普及性方面幾乎沒有語言能夠擊敗C。不過仍有必要看看C與一些主流語言相比表現如何。本文介紹了它與C++、Java、C#、Go、Python及最新的語言Carbon的詳細對比。
C與C++
C經常與C++相比較;顧名思義,C++是作為C的擴展而創建的。C++和C之間的差異很大,甚至可以說差異過大。
雖然C++在語法和方法上仍然酷似C,但提供了許多有用的功能,這些功能是C本身並不直接隨帶的:命名空間、模板、異常和自動內存管理等。一般,需要頂級性能的項目(比如資料庫和機器學習系統)通常用C++編寫,利用這些功能最大限度地發揮系統的性能。
此外,C++的步子比C邁得更大。即將發布的C++ 23帶來了更多的功能,包括模塊、協程和模塊化標準庫,以加快編譯和更多的代碼。相比之下,C標準的下一個計劃版本C2x卻沒增加多少功能,而是專注於保持向後兼容性。
問題在於,C++中的所有優點也可能是缺點。軟體功能使用的C++越多,引入的複雜性就越大,結果處理起來就變得越困難。如果開發人員只關注C++的一小部分,可以避免它的許多陷阱。甚至一些公司想要完全避免這種複雜性,比如說,Linux內核開發團隊避免C++,雖然該團隊將Rust視為未來增添內核功能的語言,Linux的大部分仍將用C語言編寫。
C與Java
Java在幾十年間依舊是企業軟體開發的主力軍,也是整個開發界的主力軍。Java語法大量借鑑了C和C++。不過與C不同,Java默認情況下並不編譯成本機代碼。相反,Java的JIT(即時)編譯器編譯Java代碼,以便在目標環境中運行。JIT引擎根據程序行為在運行時優化例程,從而實現了提前編譯的C無法實現的多種優化。在適當的情況下,JIT編譯的Java代碼可以接近甚至超過C的性能。
而且,雖然Java運行時環境自動執行內存管理,但可以繞過這種處理。比如說,Apache Spark使用Java運行時環境的「不安全」部分來直接分配和管理內存,並避免JVM垃圾回收系統的開銷,從而部分優化了內存中處理。
Java奉行「一次編寫,隨處運行」的理念,也使Java程序可以在對目標架構基本不需要調整的情況下運行。相比之下,雖然C已經移植到許多架構上,但任何特定的C程序可能仍需要定製,才可以在Windows與Linux上正常運行。
這種可移植性和強大性能的結合,加上龐大的軟體庫和框架生態系統,使Java成為構建企業應用程式的首選語言和運行時環境。
Java比不上C的一個方面是,C從不旨在競爭:它靠近硬體運行,或者直接與硬體打交道。
C代碼被編譯成機器代碼,機器代碼由進程直接執行。Java被編譯成字節碼,字節碼是中間代碼,JVM解釋器隨後將它們轉換成機器碼。此外,雖然Java的自動內存管理大體上是優點,但C更適合必須最優化使用內存資源有限的程序,因為它的初始占用空間很小。
C與Go
Go語法很大程度上歸功於C,作為分隔符的花括號和以分號結尾的語句只是兩個例子。精通C的開發人員通常可以直接上手Go,即使考慮到新的Go功能(比如命名空間和包管理)。
確保代碼可讀是Go的指導設計目標之一:讓開發人員在短時間內儘快上手Go項目,並熟悉代碼庫。C代碼庫可能很難分析,因為它往往變成某個項目和團隊所特有的一大堆宏指令和#ifdefs。Go的語法及內置的代碼格式化和項目管理工具旨在防止這種根本性問題。
Go還有諸如goroutines(協程)和channels(通道)之類的附加功能,這些語言級工具用於處理組件之間的並發和消息傳遞。C需要這類功能由手工控制,或者由外部庫提供,但Go直接就提供,因此構建需要它們的軟體要容易得多。
Go與C最大的底層區別在於內存管理。默認情況下,Go對象可實現自動管理和垃圾回收。對於大多數編程工作來說,這非常方便。但這也意味著任何需要確定性處理內存的程序都將更難編寫。
Go確實包括unsafe包,用來避開Go的一些類型處理安全機制,比如讀寫使用Pointer類型的隨意內存。但unsafe附有警告:用它編寫的程序「可能無法移植,且不受Go 1兼容性指導準則的保護。」
Go非常適合構建命令行實用程序和網絡服務等程序,因為它們很少需要這種細粒度的操作。但是低級設備驅動程序、內核空間作業系統組件以及其他需要嚴格控制內存布局和管理的任務用C來創建再好不過了。
C與Python
如今只要一談起軟體開發,Python似乎總是避不開。畢竟,Python是「第二好的語言」,無疑是用途最廣泛的語言之一,擁有成千上萬的第三方庫。
Python強調更注重開發速度而不是執行速度,這也是它與C最大的不同之處。一個程序可能需要一個小時才能用另一種語言(如C)組裝起來,但僅需幾分鐘內即可用Python組裝起來。另一方面,該程序在C中執行可能需要幾秒鐘,但在Python中運行可能需要一分鐘。
一個好的經驗法則是,Python程序運行起來通常比C程序慢一個數量級。但是對於現代硬體上的許多任務來說,Python足夠快了,這是它得到採用的關鍵。
另一個主要區別是內存管理。Python程序完全由Python運行時環境管理內存,因此開發人員不必擔心分配和釋放內存方面的細節。但開發人員的輕鬆是以「運行時性能」為代價。
編寫C程序需要嚴格注意內存管理,但由此生成的程序對純粹的機器速度而言卻堪稱標準。
談完區別,二者在底層卻有深層的聯繫:參考Python運行時環境是用C編寫的。這讓Python程序可以包裝用C和C++編寫的庫。第三方庫組成的Python生態系統有相當一部分(比如用於機器學習的第三方庫)都以C代碼作為核心。在許多情況下,這不是用C還是用Python的問題,而是涉及應用程式的哪些部分應該用C編寫、哪些部分應該用Python編寫。
如果開發速度比執行速度更重要,而且如果程序的大部分高性能部分可以被隔離到獨立的組件中(而不是分散在整個代碼中),那麼純粹的Python庫或結合Python庫和C庫都是比單獨的C更好的選擇。但在其他方面,C仍占統治地位。
C與Carbon
C和C++的另一個最近的競爭者是Carbon,這是一種目前正在大力開發的新語言。
Carbon旨在成為C和C++的現代替代品,它有簡單的語法、現代工具和代碼組織技術,以及解決C和C++程式設計師長期面臨的問題的方案。它還旨在提供與C++代碼庫的互操作性,因此可以增量遷移現有代碼。這一切都受到歡迎,因為與最近開發的語言相比,C和C++在過去的工具和流程顯得很原始很簡陋。
那麼有何缺點呢?目前,Carbon是一個試驗項目,尚未準備好用於生產環境。
甚至沒有一個切實可行的編譯器,只有在線代碼瀏覽器。Carbon還需要一段時間才會成為C或C++的實用替代品,如果真可以替代的話。
原文連結:https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html
到訪人數:(845)