為什麼 C 語言沒有被 C++ 取代?

編程語言 C語言 編譯器 程序員 Java 西部遊星 2018-12-01
為什麼 C 語言沒有被 C++ 取代?

C 本身相對簡單,各種操作系統都能設立自己的統一 C ABI 。而 C++ 的 ABI 要求比 C 複雜很多,以至於各大編譯器提供者有長久的分歧,同系列編譯器的不同版本間不時也出現分歧。

新寫的操作系統, 要在上面搭建一個開發環境套件,首先考慮移植上去的語言幾乎一定是C。

提供的用戶態接口基本也是 C的。無它,容易,而且你C++不是兼容C嘛,我幹嘛要提供C++接口來拋棄C程序員呢(類似很多windows應用程序堅持只提供x86而不提供x64版本一樣)。操作系統動態庫的某些API對C支持較為方便,讓C幾乎成了動態庫的標準接口語言。其他語言也選擇動態庫來和其他語言交互,因為3,不得不也對C和他的ABI產生一些依賴。

綜上,從操作系統到其他非C/C++語言,整個軟件生態體系都對C語言有依賴,C++何以言取代之?Objective c++還兼容C++呢,除了從事特殊底層開發的,有幾個人用過?

為什麼 C 語言沒有被 C++ 取代?

C++ 編譯器實現太複雜,很多嵌入式平臺都只支持 C(如很多 DSP 芯片)。就算支持 C++,往往也不是所有特性都支持,最典型的就是異常和 RTTI(這個主要是為了減少二進制文件體積以及運行時佔用的內存的大小,因為這些功能在 DSP 上幾乎用不到)。

另外就是,C 作為各大操作系統的原生接口,在 ABI 兼容性方面有著不可替代的優勢。

一味地強調C++不完全兼容C就不合適了。C++對C的兼容是全方位的,不兼容的部分只是一些邊角細節。還要強調這些細節的存在,就像你在嫌一件衣服賣1000太貴的時候,旁邊的人說道:可它明明只賣998!

題主你產生疑問的一部分原因,在於你接觸IT業比較晚,沒有了解過這兩種語言的發展。早期沒有C++的時候,C語言佔據了編程語言的超過半壁江山。到C++出現的時候,大家很快開始轉移到C++等功能更強的語言,C語言的份額迅速萎縮,到了現在,已經只有系統內核,驅動,嵌入式等少數幾個領域還是C語言的天下。所以很大程度上,C語言確實是被C++取代了。

如果僅以現代的眼光看,C語言的代碼,基本上都能用C++編譯通過,語法,語義,性能都基本一致,但獨立的C語言一直頑強地生存著,這似乎就令人費解了。

這背後的原因,在於之前提到的幾個領域仍然需要C語言。在這些裡,C語言仍然有著不可替代的優勢。C的特點,是簡單,直白,功能少,性能高,程序員控制一切。在這裡,C的弱點被掩蓋,而優點能最大程度地發揮。

畢竟C最初就是為了這些場合而開發出來的。

C簡單?好事。簡單意味著編譯器容易實現,質量高,bug少。簡單還意味著大家的實現不容易產生分歧,為ABI的統一提供了便利。C功能少,總是需要自己造輪子?沒關係。做內核,做嵌入式,就算有現成的輪子,也經常不再適用,自造輪子是家常便飯。而且功能少的情況下,資源消耗也會極大地減少。整個系統可以運行在存儲空間只有4M,內存只有64K的環境下。換其他語言,運行庫就要把存儲空間撐爆了。

C開發繁瑣,效率低?這些領域的需求一般都不會變來變去,邏輯通常也不會特別複雜。

C手動管理資源,容易出錯?內核等場合下,我們本來就是要自己實現資源的管理。而且我們正是要手動控制一切,才能最大程度地精打細算。這些場合只有C最適用。包括C++在內的其他語言都嘗試過,但都無法撼動C的地位。這就是獨立的C語言仍然存在的理由。

為什麼 C 語言沒有被 C++ 取代?

主要問題是語言複雜度太高,使得人書寫難度變大,變相阻礙了語言發展。

表面問題是runtime,C功能更精簡,底層提供一個runtime以及配套的編譯器更方便。LLVM的出現理論上應該大大降低了這一門檻,但現實是C++依舊沒多大起色,所以我覺得這個只是表面的問題。

虛假問題是ABI。誠然C++沒有統一的ABI,但這不妨礙一個組件用C++編寫並提供純C的接口(雖然這也會失去C++的許多功能優勢,但換個角度,哪個用純C接口的庫能帶上自己語言的花式特性的啊?)。

事實上,我覺得除了底層受限的情況(如內核、嵌入式開發、資源稀缺,或者是不想依賴C++runtime),任何新項目都不應該用C去寫。

C++特性是多是複雜,但本身並不要求你使用全部特性。

用constexpr代替部分宏不好嗎?用模板代替部分宏不好嗎?

還有各種有利於開發維護的特性。

那些說C編譯出的二進制結果確定的還是醒醒吧,難道你編譯C不開優化的嗎?想要精確控制就上彙編,C的語言規範裡有說保證編譯結果與代碼一一對應嗎……

歸根到底,C++太複雜了,複雜到用戶還沒學就被嚇跑了,複雜到C用戶沒法低成本享受高方便。

完全取代是一定不可能的,但沒能成功地大量侵佔C的地盤,這還是得賴C++自己。

為什麼 C 語言沒有被 C++ 取代?

C語言的規則比較簡單,編譯結果比較確定,而C++的許多語法編譯出的結果隨著編譯器不同而有很大變化,這就容易產生不可控因素,對於一些穩定性要求很高、對內存排布敏感的情況就可能出現複雜的難以調試的bug。那可能還不如一開始就限定只用C語法。另外,C可以不鏈接任何庫,但C++不行(new和delete的默認實現無論如何都得有),這就限制了在內核中的應用。沒必要貶低C++,各有各的應用場景而已。

為什麼 C 語言沒有被 C++ 取代?

要明確C語言是C++的子集這種說法是錯誤的,也只是說“幾乎可以看作”。可以看出,其實C++和C的理念和語言特性有很大的不同。然後,為什麼C語言沒有被C++取代,這個問法也是不嚴謹的,可以說,為什麼C沒有完全被C++取代。原因主要可以歸結於兩者都是獨立的語言,且面向的場景已經有所不同。

就目前而言底層硬件依然是C的天下,雖然C++一樣可以進行這方面的工作,但是從歷史遺留原因和C語言天然的優勢,C++極難在這方面完全取而代之。

而其他方面,在C++出現後大部分使用C的場景被C++所取代,甚至連windows這類操作系統底層部分模塊也使用C++來實現,我們可以把它看作是時代進步、科技發展的必然結果。同樣的,我們可以看到現如今,很多屬於C++的陣地被Java、C#、python、go這類熱門語言攻克,但同樣不能說這些語言就能代替C++。

我們可以把C++想像成語言中的瑞士軍刀,而諸如C、Java這類語言更類似於專門的螺絲刀、平口刀。瑞士軍刀固然重要,但也許在某些工作中使用專門的工具會更加合適。同樣,我們在某些開發領域選擇語言時往往希望其可以專注一件事,而不是面面俱到、無限可能。

為什麼 C 語言沒有被 C++ 取代?

C語言和彙編語言構築了今天計算機世界的地基。足夠底層,離不開這兩者,我們天天跟C語言打交道,只是沒有意識到而已。C語言並非簡單的是C++的子集,這隻能從C++的角度來看,否則完全是另一個場景,C++之父確實要設計並取代C語言,但沒有成功,他自己也公開承認。不僅過去,現在,包括將來,C語言是不可替代的。你可以在不少領域找到理由說明C語言是如何弱勢,但也只能說說而已,在你看不見的更多地方,或者能力不及無法觸及的位置,C語言就矗立在那裡,像獨孤求敗。並不誇大C語言,也不是C語言的擁躉,我只是一個確實知道C語言很強大也很偉大的人,是的,這門編程語言值得用偉大這個詞。

為什麼 C 語言沒有被 C++ 取代?

為什麼 C 語言沒有被 C++ 取代?

相關推薦

推薦中...