c語言排名為什麼高(C語言的地位難以動搖)
2023-05-19 19:02:26 2
作者: 布加迪
在過去的50年裡,出現了幾十種新的語言,他們表現得多麼出色?有些在挑戰C的統治地位,而其他則想逐漸削弱它。
幾十年來,C語言一直是佔主導地位的程序設計語言。Linux、Windows、Mac和許多其他作業系統的內核中都可以看到它。C語言幾乎可以寫任何程序,在程序設計語言中的地位,倍受推崇。它甚至可能是有史以來最有影響力的語言。它的語法啟發了許多其他語言,包括Cpp、Csharp、Java、JavaScript、Go、Perl等等。
自1972年以來,C編程設計語言已經成為構建軟體的主力語言之一。但在過去的50年裡,出現了幾十種新的語言,而它們的後代的表現又如何呢?有些在挑戰C的統治地位,而其他則在想逐漸削弱它。
撼山易,撼C難。在性能、裸機兼容性和流行性方面,很少有語言能夠打敗C語言。不過,與一些主要語言相比,C語言的性能如何還是有必要的。本文提供了一個詳細的與C ,Java,C#,GO,Python和最新的語言Carbo與C語言的對比分析。
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代碼被編譯成機器碼,由進程直接執行。Java被編譯成字節碼,這是一種中間代碼,JVM解釋器將其轉換成機器碼。此外,雖然Java的自動存儲管理通常是一個優勢,但C更適合於必須優化有限內存資源使用的程序,因為它的初始佔用很小。
C和GO
Go語法在很大程度上借鑑了C語言,用花括號作為分隔符和以分號結尾的語句只是兩個例子。精通C語言的開發人員通常可以無學習成本使用Go,即使在考慮新的Go特性(如名稱空間和包管理)時也是如此。
確保代碼的可讀性是Go的指導性設計目標之一:讓開發人員在很短的時間內熟悉Go項目並熟悉代碼庫。C代碼庫可能很難分析,因為它通常會變成一堆特定於項目或團隊的宏和#ifdefs。Go的語法和內置的代碼格式和項目管理工具的設計就是為了防止這一根本問題。
Go還具有其他特性,如go routine和channels,用於處理組件之間的並發和消息傳遞的語言級工具。C語言需要手動控制這些函數或由外部庫提供,但Go直接提供了這些函數,因此構建需要這些函數的軟體要容易得多。
Go和C之間最大的根本區別是存儲管理。默認情況下,Go對象會被自動管理和垃圾收集。這對於大多數編程工作來說是非常方便的。但這也意味著,任何需要對內存進行確定性處理的程序都將更難寫。
Go確實包含了一些不安全的包來規避Go的一些類型處理安全機制,比如讀取和寫入使用指針類型的任意內存。但不安全的同時也要注意:用它編寫的程序「可能不是可移植的,不受Go1兼容性指南的保護。」
Go非常適合構建命令行實用程序和網絡服務等程序,因為它們很少需要如此細粒度的操作。但是底層設備驅動程序、內核空間作業系統組件以及其他需要嚴格控制內存布局和管理的任務最好用C語言創建。
Python與C語言
如今,當涉及到軟體開發時,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和 的方式,Carbon擁有簡單的語法、現代化的工具和代碼組織技術,以及C&C程式設計師長期面臨的問題的解決方案。它還被設計為提供與C 代碼庫的互操作性,因此可以增量地遷移現有的代碼。所有這些都是受歡迎的,因為與最近開發的語言相比,C和C 的工具和過程曾經是原始的和初級的。
那麼缺點是什麼呢?目前,Carbon是一個試點項目,尚未準備好生產。
甚至沒有一個實用的編譯器,只有一個在線代碼瀏覽器。Carbon成為C或C 的實際替代品還需要一段時間,如果有的話。