C 語言為什么不會過時?
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
整理:表哥有話講? 作者:趙巖 / Serdar 等

就在 5 月,時隔 5 年,C 語言再次領(lǐng)先 Java,榮登 TIOBE 編程語言排行榜第一!
排名前十的分別是:
C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL 和 R。
有沒有發(fā)現(xiàn)亮點?沒錯, 第一易主了,C 語言反超了 Java 。要知道,C 語言上次第一還是在 5 年前,是什么原因讓其 “東山再起” 了呢?
時隔五年,C 語言重回榜首。
據(jù) TIOBE CEO Paul Jansen 的猜測,“這聽起來可能很不可思議,但是某些編程語言確實可以從這種情況中受益。"
嵌入式語言(C 和 C++ 等)越來越流行,因為它們被用于醫(yī)療設(shè)備軟件中。

C 語言自詡的 “相信程序員” 都是漂亮的說辭,它的唯一目的就是快,要么飛速的運行,要么飛速的崩潰。C 語言只關(guān)心程序飛的高不高,不關(guān)心程序猿飛的累不累。就是這樣!
現(xiàn)在回答兩個最普遍的問題:硬件這么便宜了,有必要讓軟件更快嗎?有這種疑問的人大部分都是網(wǎng)吧的固定客戶,他們理解的計算機(jī)只在電腦城,他們理解的計算只是游戲和播放硬盤中的小電影。不要玩?zhèn)€游戲開個掛就樂得不行不行的,別忘了還有全實景仿真,還有 3D 渲染,還有自動駕駛。
?
02、為什么 C 仍占據(jù)統(tǒng)治地位?
Java 的語法從 C 和 C ++ 中借鑒了很多東西。但是,與 C 不同的是,Java 默認(rèn)情況下不會編譯為本機(jī)代碼。相反,Java 運行時環(huán)境,JVM,JIT(實時)編譯 Java 代碼以在目標(biāo)環(huán)境中運行。在適當(dāng)?shù)那闆r下,JIT 編譯后的 Java 代碼可以接近甚至超過 C 的性能。
Java 背后的 “一次編寫,隨處運行” 的理念也允許 Java 程序在目標(biāo)架構(gòu)上進(jìn)行相對較少的調(diào)整即可運行。相比之下,雖然 C 已被移植到許多架構(gòu)中,但任何給定的 C 程序仍可能需要重新量身定做才能在,打個比方,Windows 與 Linux,兩種不同的 os 之間正常運行。
這種可移植性和強(qiáng)大性能的結(jié)合,以及龐大的軟件庫和框架組成的生態(tài),使 Java 成為構(gòu)建企業(yè)應(yīng)用程序的首選語言。
Java 輸給 C 的地方是一個 Java 從未打算競爭的領(lǐng)域:靠近底層結(jié)構(gòu)運行,或直接與硬件打交道。C 代碼被編譯成機(jī)器代碼,由進(jìn)程直接執(zhí)行。Java 被編譯成字節(jié)碼,這是一種隨后會被 JVM 解釋器轉(zhuǎn)換為機(jī)器代碼的中間代碼。此外,盡管 Java 的自動內(nèi)存管理在大多數(shù)情況下都是個優(yōu)點,但 C 更適合于必須充分利用有限內(nèi)存資源的情況。
也就是說,在某些方面,Java 在速度方面可以接近于 C。JVM 的 JIT 引擎在運行時根據(jù)程序行為優(yōu)化例程,允許進(jìn)行許多類型的優(yōu)化,而這些優(yōu)化是在未提前編譯的 C 中無法實現(xiàn)的。雖然 Java 運行時自動執(zhí)行內(nèi)存管理,但一些較新的應(yīng)用程序可以解決這個問題。例如,Apache Spark 部分地通過使用繞過 JVM 的自定義內(nèi)存管理代碼來優(yōu)化內(nèi)存中處理。
與 Java(以及某種程度上來說 Python 也是如此)一樣,.Net 提供跨各種平臺的可移植性和龐大的集成軟件生態(tài)系統(tǒng)??紤]到.Net 世界中有多少面向企業(yè)的開發(fā),這些都是不小的優(yōu)勢。當(dāng)您使用 C?;蛉魏纹渌?Net 語言開發(fā)程序時,您可以使用為.Net 運行時編寫的大量工具和庫。
.NET 另一個類似 Java 的優(yōu)勢是 JIT 優(yōu)化。C#和.Net 程序可以按照 C 語言提前編譯,但它們主要由.Net 運行時進(jìn)行即時編譯,并使用運行時信息進(jìn)行優(yōu)化。JIT 編譯允許對無法在 C 中執(zhí)行的運行著的.Net 程序進(jìn)行各種就地優(yōu)化。
與 C 一樣,C#和.Net 提供各種直接訪問內(nèi)存的機(jī)制。堆,棧和非托管系統(tǒng)內(nèi)存都可以通過.Net API 和對象訪問。開發(fā)人員可以使用.Net 中的 unsafe 模式來實現(xiàn)更高的性能。
但這些都不是沒有代價的。托管對象和 unsafe 對象不能被任意交換,并且它們之間的編組會降低性能。因此,要最大化.Net 應(yīng)用程序的性能需要將托管和非托管對象之間的變動保持在最低限度。
如果您無法承擔(dān)托管與非托管內(nèi)存之間變動造成的性能損失,或者.Net 運行時對于目標(biāo)環(huán)境(例如,內(nèi)核空間)來說是一個糟糕的選擇,或者可能根本不可用,那么 C 就是你所需要的。與 C#和.Net 不同,C 被默認(rèn)可以解鎖對內(nèi)存的訪問權(quán)。
代碼可讀性是 Go 的指導(dǎo)設(shè)計目標(biāo)之一:讓開發(fā)人員可以輕松掌握任何 Go 項目,并在短時間內(nèi)熟練掌握代碼庫。C 代碼庫可能很難理解,因為它們很容易聚集大量專屬于某個項目或某個團(tuán)隊的宏和和 #ifdef。Go 的語法及其內(nèi)置的代碼格式以及項目管理工具旨在避免這種結(jié)構(gòu)性問題。
Go 還提供了諸如 goroutine 和 channel 之類的附加功能,用于處理并發(fā)性和組件之間的消息傳遞的語言級別的工具。C 需要開發(fā)者手動完成或由外部庫提供,但 Go 提供了開箱即用的這些功能,使得構(gòu)建需要這些功能的軟件變得更加容易。
Go 與 C 最深層次的不同之處在于內(nèi)存管理方面。默認(rèn)情況下,Go 的對象會被自動管理并自動進(jìn)行回收。對于大多數(shù)編程工作來說,這非常方便。但這也意味著任何需要確定性處理內(nèi)存的程序都會更難編寫。
Go 確實包含了用于繞過 Go 的某些類型處理安全性的 unsafe 包,例如使用 Pointer 類型讀取和寫入任意內(nèi)存。但 unsafe 會附帶一個 warning 說用它編寫的程序 “可能是不可移植的,并且不受 Go 1 兼容性指南的保護(hù)。”
Go 非常適合構(gòu)建命令行實用程序和網(wǎng)絡(luò)服務(wù)等,因為這些很少用到太過細(xì)致的操作。但是,如果是低級設(shè)備驅(qū)動程序,內(nèi)核空間操作系統(tǒng)組件以及其他需要嚴(yán)格控制內(nèi)存布局和管理的任務(wù),那么就最好用 C 來創(chuàng)建。
Rust 的語法和編譯規(guī)則可幫助開發(fā)人員避免常見的內(nèi)存管理錯誤。如果程序有一個不符合 Rust 語法的內(nèi)存管理問題,它就不會被編譯。剛接觸這種語言的新手,特別是以前用 C 語言的開發(fā)者,由于 C 語言為這類 bug 提供了充足的容錯空間,所以他們接觸 Rust 的第一步是學(xué)習(xí)如何安撫編譯器。但 Rust 的支持者認(rèn)為,這種短期的痛苦有一個長期的回報:更安全的,不會減緩速度的代碼。
Rust 還通過其工具改進(jìn)了 C 語言。默認(rèn)情況下,項目和組件管理是 Rust 提供的工具鏈的一部分,與 Go 相同。有一種默認(rèn)的,推薦的方法來管理包,組織項目文件夾,以及處理 C 需要單獨處理的其他許多事情,每個項目和團(tuán)隊以不同的方式處理它們。
然而,在 Rust 中被吹捧為優(yōu)勢的東西對于 C 開發(fā)者來說可能并沒有太大吸引力。Rust 的編譯時安全功能無法禁用,因此即使是最小的 Rust 程序也必須符合 Rust 的內(nèi)存安全限制。默認(rèn)情況下,C 可能不太安全,但在必要時它更靈活,更寬容。
Python 強(qiáng)調(diào)的,以及它與 C 最不同的地方,是有利于開發(fā)速度而不是執(zhí)行速度。一個可能需要一個小時才能用另一種語言寫出來的程序 —— 比如 C—— 可能用 Python 幾分鐘內(nèi)就能寫好。另一方面,該程序在 C 中執(zhí)行可能需要幾秒鐘,但需要一分鐘才能在 Python 中運行完。(一個很好的經(jīng)驗法則:Python 程序通常比它們對應(yīng)的 C 語言程序運行速度慢一個數(shù)量級。)但是對于現(xiàn)代硬件上的許多工作,Python 已經(jīng)足夠快了,這是它如今廣泛應(yīng)用的一個重要原因。
另一個主要區(qū)別是內(nèi)存管理。Python 程序完全由 Python 運行時進(jìn)行內(nèi)存管理,因此開發(fā)人員不必?fù)?dān)心分配和釋放內(nèi)存的細(xì)節(jié)。但同樣,開發(fā)人員的輕松也是以運行時性能為代價的。編寫 C 程序需要嚴(yán)格關(guān)注內(nèi)存管理,但生成的程序通常是純機(jī)器速度的黃金標(biāo)準(zhǔn)。
但是,在二者的血脈中,Python 和 C 共享一個深層的關(guān)系:Python 運行時參考是用 C 語言編寫的。這允許 Python 程序包裝用 C 和 C ++ 編寫的庫。第三方庫的 Python 生態(tài)系統(tǒng)的很多重要模塊,例如機(jī)器學(xué)習(xí)方面的庫,其核心是 C 代碼。
如果開發(fā)速度比執(zhí)行速度更重要,并且如果程序的大多數(shù)高性能部分可以被隔離到獨立組件中(而不是遍布整個代碼),那么純 Python 或 Python 和 C 庫的混合使得會是比單獨使用 C 更好的選擇。否則的話,C 仍然是老大。
2. 操作系統(tǒng)內(nèi)核代碼還是 C 語言為主打,就語言的靈活性以及執(zhí)行的效率來看 C 語言還是最合適的語言,而且在系統(tǒng)層次的代碼,C 語言還是首選語言。而且現(xiàn)在很多流行語言的底層絕大部分的 C 語言構(gòu)建完成。從這個層面講 C 語言是永遠(yuǎn)不會過時的,頂多算是應(yīng)用范圍變窄,但其作用依然強(qiáng)大。
3. C 語言的職位比例相對應(yīng)用級語言是低了點,但是整個軟件行業(yè)在發(fā)展,絕對的 C 語言編程職位并沒有減少。而且對于有志于成為架構(gòu)師層次的程序員來說,C 語言還是必修課,構(gòu)建軟件框架還是需要對底層有所了解。
退一步來講,即使覺得 C 語言方面的職位比例低一些,不好找工作,可以先從 C 語言入手,把自己的知識體系建立起來,編程語言屬于工具范疇,熟悉一種工具的使用,很容易觸類旁通,切換到別的語言也相對輕松些,而且給整個職業(yè)生涯起了個好頭,打好了基礎(chǔ)為更上一層樓做足準(zhǔn)備。
C 語言之所以流行這么年,生命力這么旺盛和本身鮮明的高效,方便靈活掛鉤。即使在上層語言使用概率變低,并不妨礙在系統(tǒng)級別繼續(xù)發(fā)揮作用。任何一種語言都有其存在的社會價值所在。C 語言還是值得作為入門語言深刻的學(xué)習(xí)。
知乎紅人 vczh 說:「我在上大學(xué)的時分簡直就只學(xué)習(xí) C/C++,后來實習(xí)的時分去了微軟,成果到了那里才知道,那個組是不必 C/C++ 的,怎么辦?憑借著 C++ 帶給我的富裕的功底,我準(zhǔn)時完結(jié)了老板給我的 "兩個星期內(nèi)學(xué)會 C# 和 WCF 基礎(chǔ)知識" 的作業(yè),順暢開端作業(yè)?!?/span>
當(dāng)然,這只是 vczh 的個人經(jīng)歷,不具有普遍性,但不可否認(rèn)的是 C/C++ 仍具有不可代替性。某家創(chuàng)業(yè)公司 CTO 在接受采訪時表示:「即使有許多人唱衰 C/C++,但在今世,仍有許多許多項目的目標(biāo)渠道暫時只供給 C/C++ 編譯器的支撐,僅從這一點而言,C/C++ 是不可能完全消逝的?!?br>
04、除了 C,需要掌握多種語言嗎?
想要掌握多種編程語言的 9 個理由
能用多種方式來解決同樣的問題,掌握不同的編程語言意味著擁有更多的選擇。畢竟,當(dāng)你只有錘子時,一切看起來都像是釘子。 更有競爭力,擁有更多的就業(yè)機(jī)會。學(xué)習(xí)第二門編程語言,有時能加倍工作機(jī)會的數(shù)量。然而,這取決于你學(xué)習(xí)的語言種類。但無論怎么說,你將會有更多的合適機(jī)會,從而增加求職能力。 表明你具備學(xué)習(xí)新語言的能力。潛在的雇主會認(rèn)為你并非是死板或者慣守成規(guī)的人。 學(xué)習(xí)是很有趣的。學(xué)習(xí)新的事物會讓你的頭腦保持興奮。這將有助于你在新領(lǐng)域的成長和提高。 緊跟當(dāng)前的技術(shù)發(fā)展趨勢。了解哪個行業(yè)在獨領(lǐng)風(fēng)騷,就可以永遠(yuǎn)站在潮流的尖端,你的技能便不會過時。 這將提醒你為什么應(yīng)該熱愛你的 “主” 語言,或者如何將事情做得更好。有時候,只有嘗試過新語言,才會知道主語言是何等的優(yōu)秀。你會更加欣賞自己最愛的語言。與此同時,新語言可能會有一些驚人的特性,讓你深覺相見恨晚。 有助于成為一個更加優(yōu)秀的程序猿。學(xué)習(xí)新的語言,有助于提高在所有語言之間通用的技能,例如:設(shè)計和架構(gòu)算法,或處理不同的數(shù)據(jù)結(jié)構(gòu)。 針對工作選擇最佳的工具。尺有所短寸有所長 - 有的語言更善于處理某些特定方面的事情。掌握了多種語言,你可以在工作中選用最佳的工具 表明你的學(xué)習(xí)能力強(qiáng)。沒有任何事情比掌握第二語言更能證明你的學(xué)習(xí)能力。
不想掌握多種編程語言的 9 個理由
掌握一種語言更容易。通常,集中精力和全心投入才能精通某一事物。如果不斷地在多種語言之間進(jìn)行切換,那么真正精通一門語言的概率就會降低。掌握一種語言也有助于你集中精力。 大多數(shù)人只需要一份工作,大部分公司只使用一種語言。在你被錄用后,掌握多種語言不一定會有所幫助。有時候,只要掌握項目所用的語言就夠了。 總有一些東西值得學(xué)習(xí);有時候,這意味著要更深入地學(xué)習(xí)一種語言。 大多數(shù)情況下,專家能提更高的薪資要求,因為人們更愿意為專家支付更多的薪水。John Sonmez 在其視頻《 I’m Not Sure I Want To Be A Specialist》中談到為什么多面手并不總是最好的。 即便僅掌握一種語言,仍然可以被認(rèn)為是一個偉大的開發(fā)者。是否是偉大的開發(fā)者與你掌握多少種語言無關(guān)。關(guān)鍵在于你創(chuàng)造的是什么。因為只涉及一種語言,所以你可以花更多的時間進(jìn)行創(chuàng)造。 你只需要學(xué)習(xí)有限的軟件開發(fā)工具。大多數(shù)語言只有為數(shù)不多的一些工具。切換語言往往意味著要切換工具。只掌握一種語言,你就可以更快地掌握相關(guān)的工具。這將有助于提高工作效率。 更易于定位自己的市場。因為只掌握一種語言,基本上你只會朝這個方向安頓下來(即使不是出于自己的選擇)。 你可以憑借任何一種語言解決大多數(shù)軟件問題。不管有多少人告訴你,大多數(shù)語言可以用于解決任何問題。如果解決問題是你的主要目標(biāo)(本應(yīng)當(dāng)是),掌握更多的語言并不一定有助于實現(xiàn)這個目標(biāo)。 深入理解一件事比表面了解十件事更好。
這并非是一個非黑即白的問題。和其他問題一樣,最好的解決辦法是取中間值:總有一片灰色地帶。如果你是一個初學(xué)者,那么學(xué)習(xí)一種語言,并將其應(yīng)用到前十多個項目中會比較容易。但此之后,建議你成為一個「T 形」軟件開發(fā)者。
什么是「T 形」軟件開發(fā)者?
所謂「T 形」軟件開發(fā)者在某一個特定的區(qū)域擁有很深的造詣,而且是一種語言的專家,T 字母中的垂直線代表了這一點;此外,他們會繼續(xù)廣泛學(xué)習(xí)另一種技能,T 字母中的水平線代表了這一點。
那么,這與軟件開發(fā),特別是編程語言的學(xué)習(xí),有什么關(guān)系呢?我的建議是精通一種編程語言,這將成為你以后的生計,并用于解決大部分問題。你應(yīng)該盡你所能掌握這門語言。在此基礎(chǔ)上,可以學(xué)習(xí)最適合工作的第二種語言或技能。
在成為 T 形開發(fā)者的歷程中,你將靈活地掌握多種語言,同時具備某個領(lǐng)域?qū)<业膬?yōu)點。
應(yīng)該掌握哪種編程語言?
一個常見的問題是,應(yīng)當(dāng)學(xué)習(xí)哪種語言。或者說,假如你是初學(xué)者,應(yīng)當(dāng)首先學(xué)習(xí)哪種語言。通常,我會選擇有一定歷史的語言作為主要語言。這種語言應(yīng)當(dāng)用于多個行業(yè),并且有廣泛的使用群體和大量的開發(fā)工具。符合這些標(biāo)準(zhǔn)的語言包括但不限于:C、C++、Java、JavaScript、C#、Python、Go 等等。
TIOBE 軟件基于這些標(biāo)準(zhǔn)持續(xù)跟蹤軟件語言的流行性,并編入索引中。你可以點擊 TIOBE Index 查看完整的編程語言列表。索引會每月更新,前 20 名中的大多數(shù)語言都是不錯的選擇。未來 10 年,這些語言還會流行嗎?我不確定。不過至少在未來幾年內(nèi)還是很可能保持流行的,我想,這對任何準(zhǔn)備著手的項目都是夠用的。
說實話,關(guān)于是否需要掌握更多的語言,其實并沒有絕對正確或錯誤的答案,不談需求選語言都是耍流氓,最后的決定還是取決于你的需求。
https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html
http://zhaoyan.website/blog/index.php/2017/07/15/future/
https://dzone.com/articles/do-you-need-to-know-more-than-one-language
評論
圖片
表情
