當(dāng)前位置:首頁 > 公眾號精選 > 大魚機器人
[導(dǎo)讀]01 為什么C語言不會過時 評價任何一門編程語言,都是招人罵的。永遠是這樣。就像是春寒料峭的季節(jié), 街上穿棉襖和穿單衣的擦肩而過,雙方一定是同時在心里出現(xiàn)了兩個字:“傻逼!”這個在心理學(xué)上有個專業(yè)的名字:叫做“二逼”現(xiàn)象! 那我為啥還要做這個挨罵


01

為什么C語言不會過時


評價任何一門編程語言,都是招人罵的。永遠是這樣。就像是春寒料峭的季節(jié), 街上穿棉襖和穿單衣的擦肩而過,雙方一定是同時在心里出現(xiàn)了兩個字:“傻逼!”這個在心理學(xué)上有個專業(yè)的名字:叫做“二逼”現(xiàn)象!

那我為啥還要做這個挨罵的事呢?作為《C語言點滴》《drop of knowledge of C++》書籍的作者,《C語言新思維,第二版》的譯者。我覺得我有責(zé)任系統(tǒng)的介紹一下這本語言,他的特點,還有他的未來。這個問題對很多剛剛踏入程序猿這個行業(yè)的新手至關(guān)重要。因為他們有深深的擔(dān)憂,萬一C語言就像Fortran,perl語言那樣過時了怎么辦?

先上一個表,這個就是著名的TIOBE語言排行榜。目前它是一個最權(quán)威的一個語言流行度的排行榜,從這個排行榜上看,你會得到一個最直觀的結(jié)論。Java和C都在下降,而下降的部分被第三名以后的語言所瓜分。

而就在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è)備軟件中。




對所有的編程語言,他們的最后的目的其實就是兩種:提高硬件的運行效率和提高程序員的開發(fā)效率。

遺憾的是,這兩點是不可能并存的!你只能選一樣。在提高硬件的運行效率這一方面,C語言沒有競爭者!舉個簡單的例子,實現(xiàn)一個列表,C語言用數(shù)組int a[3],經(jīng)過編譯以后變成了(基地址+偏移量)的方式。對于計算機來說,沒有運算比加法更快,沒有任何一種方法比(基地址+偏移量)的存取方法更快。


C語言已經(jīng)把硬件的運行效率壓縮到了極致。
這種設(shè)計思想帶來的問題就是易用性和安全性的缺失。例如,你不能在數(shù)組中混合保存不同的類型,否則編譯器沒有辦法計算正確的偏移量。同時C語言對于錯誤的偏移量也不聞不問,這就是C語言中臭名昭著的越界問題。


C語言自詡的“相信程序員”都是漂亮的說辭,它的唯一目的就是快,要么飛速的運行,要么飛速的崩潰。C語言只關(guān)心程序飛的高不高,不關(guān)心程序猿飛的累不累。就是這樣!

現(xiàn)在來看看那些非C的語言,他們的長處都在于提高程序員的開發(fā)效率上。或者支持動態(tài)的列表,或者支持安全的列表。但是加入任何的中間層,加入任何的安全檢驗,它不可能比(基地址+偏移量+無檢驗)的方式更快。這個世界上不存在“開發(fā)容易,運行快”的語言,開發(fā)容易畢竟來源于對底層的一層一層又一層的包裝。 


現(xiàn)在回答兩個最普遍的問題:
硬件這么便宜了,有必要讓軟件更快嗎?有這種疑問的人大部分都是網(wǎng)吧的固定客戶,他們理解的計算機只在電腦城,他們理解的計算只是游戲和播放硬盤中的小電影。不要玩?zhèn)€游戲開個掛就樂得不行不行的,別忘了還有全實景仿真,還有3D渲染,還有自動駕駛。

人在開車的時候,每秒要收集60個不同的物體,然后根據(jù)這60個物體的不同組合和反映來做20個最重要的決定。然后從這20多個決定中選一個執(zhí)行。所以就算用上最快的硬件,自動駕駛現(xiàn)在還不敢說能像人那樣開車。就算是自動駕駛成功了,下一步還要自動飛行呢?因為我們老早就預(yù)言了:你咋不上天呢!

所以說:計算速度永遠是不夠的!因為新的應(yīng)用會越來越復(fù)雜,越來也實時。對了!我還忘了一個更重要的限制:計算的能耗!NASA飛行器上的CPU最多就是32位的,說出來你可能不信,國際空間站上沒有一個CPU是64位的,我猜一個最主要的原因是航天員不愛看硬盤小電影吧。

另外一個流行的疑問是:我可以發(fā)明一種同樣快的語言,但是沒有C語言那么多的坑。想法是可以的,而且還真巧有這個語言,真巧它的名字叫D語言,真巧沒有太多的人用!這是因為一個基本的事實?,F(xiàn)在有太多,太多太多的C代碼,他們大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你沒有看錯,這些操作系統(tǒng)的內(nèi)核都是C,我雖然不確定C在Window中所占的比例,但是我相信微軟的人不會傻到用C#去全部改寫一個操作系統(tǒng)的內(nèi)核。你想讓這些人去用你的全新的語言,這就不是“有點”很傻,很天真了!

而且有些代碼,我們根本就不能改!NASA一個簡單的5個CPU飛控軟件編寫完畢后,要進行一種“全覆蓋”測試。如果CPU A壞了會發(fā)生什么?如果CPU A,B壞了呢?如果CPU A,C壞了呢。。。。?如果你愿意,你可以做個簡單的數(shù)學(xué)組合。測試完畢后,別說重寫,就算加個注釋都不行。因為主管payload的大媽會非常嚴肅的質(zhì)問你,為什么你上報的東西數(shù)量增加了,但是質(zhì)量沒有增加?你需要和她詳細的解釋:硬件和軟件是不同的,硬件是那種摸起來硬硬的東西,但是軟件不是那種摸起來軟軟的東西。看著大媽鄙夷的眼神,這個時候你會非常后悔自己手欠加入的哪一行注釋。你還別不當(dāng)真,這個是NASA的真實故事。

哪為什么C語言還下降這么多呢?很簡單,有些任務(wù)本身就不是C語言的。我上學(xué)的時候還用C語言編過窗口界面呢?然后很快微軟的人就推出了MFC,就是一大堆宏把底層的C windowAPI包裝了起來。

再后來這個技術(shù)也過時了。因為微軟的人認識到,帶有窗口的應(yīng)用程序說到底不是C語言的本職工作,再這么一層一層包下去就有露餡的危險,于是他們發(fā)明了一個全新的語言C#來負責(zé)這個任務(wù)。

Java也是這樣,突出網(wǎng)絡(luò),易用,安全,跨平臺。無論是Java, c#還是python, 他們都有意避開提高硬件的運行效率這個問題,因為這個問題上沒辦法和C競爭,也無法撼動Linux, Unix,GNU tool這些已有C代碼的位置。剩下的就只是提高程序員的開發(fā)效率上大作文章。這對C語言是好事,把自己不善長的東西去掉,讓自己跑的更快!

伴隨著嵌入和實時系統(tǒng)的興起,AI,機器人,自動駕駛等。這些都是C語言的核心應(yīng)用,而且在這種應(yīng)用上面,C語言沒有競爭者。所以我感覺C語言會穩(wěn)定在自己核心的應(yīng)用中,并開始逐步回升。(碼農(nóng)翻身注:趙老師預(yù)料對了,果然回升了。)

但是Java語言我個人不樂觀。小型和靈活性上,Python更勝一籌。一行python代碼后,你根本不知道自己還是不是duck類型?平臺領(lǐng)域,每個平臺都推出自己專屬的語言。Windows會繼續(xù)支持C#,蘋果偏愛Swift, Android推出Kotlin,Google用go。Java宣稱自己可以自由到每家做客,但是無論是到誰家,都會發(fā)現(xiàn)客廳里面坐著一個親兒子,這個時候自己這個干兒子多多少少有點尷尬。所以我猜測,最后Java會穩(wěn)定在對跨平臺有嚴格要求的,大型非實時應(yīng)用上。
 

最后說點閑話,C++不會淘汰C語言。有了對象后你會發(fā)現(xiàn)再簡樸的對象也耗費資源,而且有了對象以后,總是不由自主的去想繼承這個事,一但繼承實現(xiàn)了,你會發(fā)現(xiàn)繼承帶來的麻煩遠超過你的想象。Java的發(fā)明人James被問到如果可以從新設(shè)計Java語言的話,第一個要做什么事?他說:“去掉對象”!作為一個已婚,有兩個孩子的程序猿,我感同身受。如果大家感興趣,我可以再寫一個博客,聊聊C++和C的真實區(qū)別所在。

如果你看到這里,還什么都沒記住。那就只記住一點:沒人能預(yù)測未來。


全世界只需要五臺電腦 -IBM創(chuàng)始人 

640K內(nèi)存足夠了 -微軟創(chuàng)始人 

沒必要在家里用電腦-DEC創(chuàng)始人 

如果再有人對你說C語言已經(jīng)過時了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。

網(wǎng)友對于C語言這樣評價

1、航空、軍工領(lǐng)域不是大眾所能接觸的;

2、現(xiàn)在很多工業(yè)領(lǐng)域也很多使用64位處理器吧(人工智能技術(shù)的成熟和普及)3、消費領(lǐng)域就更不用說了;

4、作為普通程序猿,主要還是工業(yè)領(lǐng)域或者消費應(yīng)用領(lǐng)域,c語言適合底層開發(fā),c++的對象其實也沒有多么耗資源,c++對象模型這本書有詳細介紹,雖然有些過時,但是設(shè)計理念基本還是延續(xù)著。c、c++會繼續(xù)有一席之地。但是這個范圍是不是會繼續(xù)縮小到一個極點也不好說。淘汰,我個人看法應(yīng)該不會。

5、范圍縮小了,小眾了,可能工資回報也不會大幅變化。

6、會不會有更適合底層開發(fā)、比c更有優(yōu)勢的語言出現(xiàn)。這個敢說,但是前段時間使用了一下rust語言,還是讓我眼前一亮。而且大廠也在關(guān)注這門語言,畢竟是后來設(shè)計的,會總結(jié)前人的經(jīng)驗,可能會更佳優(yōu)秀。越往上層應(yīng)用,開發(fā)平臺和語言越是封裝很好、使用很方便、更佳接近人類的思維方式(以前的開發(fā)語言很像是控制計算機的具體指令,慢慢的在發(fā)展)


02

為什么 C 語言仍然占據(jù)統(tǒng)治地位?


于一種計算機行業(yè)的技術(shù)來說尤其如此。自1972年誕生以來,C語言一直保持生龍活虎的狀態(tài),時至今日它仍然是我們用來搭建軟件世界的基礎(chǔ)建筑材料之一。

但有時一種技術(shù)能夠長期存在,只是因為人們還沒有來得及發(fā)明新的東西來取代它而已。在過去的幾十年里,出現(xiàn)了許多其他語言——其中一些明確地被設(shè)計用于挑戰(zhàn)C的主導(dǎo)地位,有些語言試圖憑借自己的人氣慢慢瓦解C語言的統(tǒng)治地位。

為C需要被替換掉的觀點爭辯是簡單的。編程語言研究和軟件開發(fā)實踐都暗示了如何比C更好地去做事。但歷經(jīng)數(shù)十年的研究和開發(fā),C語言的地位卻依舊穩(wěn)固。很少有其他語言能夠在性能、裸機兼容性或通用性等方面擊敗它。不過,2018年C是如何與那些明星編程語言競爭的呢,其中細節(jié)仍值得一看。


C vs. C ++


當(dāng)然了,C最常被拿來與C ++進行比較,正如其名稱本身所暗示的那樣,C++作為對C語言的擴展而被創(chuàng)建出來。C ++和C之間的差異可以概括為C++更加廣泛(褒)或更加寬泛(貶),具體取決于這個問題你是問的C還是C++程序員。(笑)

雖然C ++的語法等方面仍然是類C的,但它提供了許多在原生的C中本不可用的非常實用的功能:命名空間(namespace),模板(template),異常(exception),自動內(nèi)存管理(automatic memory management)等等。需要頂級性能的項目,例如涉及數(shù)據(jù)庫,機器學(xué)習(xí)系統(tǒng)的項目通常是用C ++編寫的,以便項目能盡可能地榨取以及利用到每一點性能。

此外,與C相比,C ++在持續(xù)地更加積極地擴展。即將推出的C ++ 20會帶來更多功能供開發(fā)者享用,包括模塊,協(xié)同程序,同步庫,以及概念,這些使模板更易于使用。C standard的最新版本只進行了少量更新,并側(cè)重于保持向后兼容性。

事實上,C ++中的所有附加功能同樣也可能成為累贅。而且是很大的累贅。您使用的C ++專屬功能越多,引入的復(fù)雜度就越高,對結(jié)果的修正就越困難。將自己局限于僅一個C ++子集的開發(fā)人員可以避免許多開發(fā)中嚴重的坑和額外負擔(dān)。但是有些團隊想要從根兒上防范C ++的過度復(fù)雜性。堅持使用C能迫使開發(fā)人員將自己局限于一個子集。例如,Linux內(nèi)核開發(fā)團隊就直接避開了C ++。

選C而不選C++對您——以及任何將會維護你代碼的開發(fā)人員——來說都是可行的,通過采用強制簡約主義來避免與C ++的復(fù)雜性糾纏。當(dāng)然,C ++擁有豐富的高級功能,這是有它自己的道理的。但如果極簡主義更適合當(dāng)前和未來的項目——以及負責(zé)項目的團隊——那么還是選C更明智一些。


C vs. Java


幾十年了,Java仍然是企業(yè)軟件開發(fā)的主力軍之一——并且也是寬泛而言的開發(fā)的主力軍之一。許多最重要的企業(yè)軟件項目都是用Java編寫的——包括絕大多數(shù)Apache Software Foundation項目——而Java仍然是開發(fā)企業(yè)級需求項目的可行語言。


Java的語法從C和C ++中借鑒了很多東西。但是,與C不同的是,Java默認情況下不會編譯為本機代碼。相反,Java運行時環(huán)境,JVM,JIT(實時)編譯Java代碼以在目標環(huán)境中運行。在適當(dāng)?shù)那闆r下,JIT編譯后的Java代碼可以接近甚至超過C的性能。


Java背后的“一次編寫,隨處運行”的理念也允許Java程序在目標架構(gòu)上進行相對較少的調(diào)整即可運行。相比之下,雖然C已被移植到許多架構(gòu)中,但任何給定的C程序仍可能需要重新量身定做才能在,打個比方,Windows與Linux,兩種不同的os之間正常運行。


這種可移植性和強大性能的結(jié)合,以及龐大的軟件庫和框架組成的生態(tài),使Java成為構(gòu)建企業(yè)應(yīng)用程序的首選語言。


Java輸給C的地方是一個Java從未打算競爭的領(lǐng)域:靠近底層結(jié)構(gòu)運行,或直接與硬件打交道。C代碼被編譯成機器代碼,由進程直接執(zhí)行。Java被編譯成字節(jié)碼,這是一種隨后會被JVM解釋器轉(zhuǎn)換為機器代碼的中間代碼。此外,盡管Java的自動內(nèi)存管理在大多數(shù)情況下都是個優(yōu)點,但C更適合于必須充分利用有限內(nèi)存資源的情況。


也就是說,在某些方面,Java在速度方面可以接近于C。JVM的JIT引擎在運行時根據(jù)程序行為優(yōu)化例程,允許進行許多類型的優(yōu)化,而這些優(yōu)化是在未提前編譯的C中無法實現(xiàn)的。雖然Java運行時自動執(zhí)行內(nèi)存管理,但一些較新的應(yīng)用程序可以解決這個問題。例如,Apache Spark部分地通過使用繞過JVM的自定義內(nèi)存管理代碼來優(yōu)化內(nèi)存中處理。


C vs. C#和.Net


在推出近二十年后,C#和.Net 框架仍然是企業(yè)軟件世界的主要組成部分。有人說C#和.Net是微軟對Java的回應(yīng)——一個托管代碼編譯器系統(tǒng)和通用運行庫——C和Java之間的許多種對比也適用于C和C?;?Net之間。


與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運行時進行即時編譯,并使用運行時信息進行優(yōu)化。JIT編譯允許對無法在C中執(zhí)行的運行著的.Net程序進行各種就地優(yōu)化。


與C一樣,C#和.Net提供各種直接訪問內(nèi)存的機制。堆,棧和非托管系統(tǒng)內(nèi)存都可以通過.Net API和對象訪問。開發(fā)人員可以使用.Net中的unsafe模式來實現(xiàn)更高的性能。


但這些都不是沒有代價的。托管對象和unsafe對象不能被任意交換,并且它們之間的編組會降低性能。因此,要最大化.Net應(yīng)用程序的性能需要將托管和非托管對象之間的變動保持在最低限度。


如果您無法承擔(dān)托管與非托管內(nèi)存之間變動造成的性能損失,或者.Net運行時對于目標環(huán)境(例如,內(nèi)核空間)來說是一個糟糕的選擇,或者可能根本不可用,那么C就是你所需要的。與C#和.Net不同,C被默認可以解鎖對內(nèi)存的訪問權(quán)。


C vs. Go


Go的語法很大程度上借鑒了C——花括號作為定界符,語句以分號結(jié)束,等等。精通C的開發(fā)人員通常可以毫不費力地直接使用Go,甚至算上Go的獨有功能,如命名空間和包管理,對開發(fā)人員來說也并不困難。


代碼可讀性是Go的指導(dǎo)設(shè)計目標之一:讓開發(fā)人員可以輕松掌握任何Go項目,并在短時間內(nèi)熟練掌握代碼庫。C代碼庫可能很難理解,因為它們很容易聚集大量專屬于某個項目或某個團隊的宏和和#ifdef。Go的語法及其內(nèi)置的代碼格式以及項目管理工具旨在避免這種結(jié)構(gòu)性問題。


Go還提供了諸如goroutine和channel之類的附加功能,用于處理并發(fā)性和組件之間的消息傳遞的語言級別的工具。C需要開發(fā)者手動完成或由外部庫提供,但Go提供了開箱即用的這些功能,使得構(gòu)建需要這些功能的軟件變得更加容易。


Go與C最深層次的不同之處在于內(nèi)存管理方面。默認情況下,Go的對象會被自動管理并自動進行回收。對于大多數(shù)編程工作來說,這非常方便。但這也意味著任何需要確定性處理內(nèi)存的程序都會更難編寫。


Go確實包含了用于繞過Go的某些類型處理安全性的unsafe包,例如使用Pointer類型讀取和寫入任意內(nèi)存。但unsafe會附帶一個warning說用它編寫的程序“可能是不可移植的,并且不受Go 1兼容性指南的保護。”


Go非常適合構(gòu)建命令行實用程序和網(wǎng)絡(luò)服務(wù)等,因為這些很少用到太過細致的操作。但是,如果是低級設(shè)備驅(qū)動程序,內(nèi)核空間操作系統(tǒng)組件以及其他需要嚴格控制內(nèi)存布局和管理的任務(wù),那么就最好用C來創(chuàng)建。


C vs. Rust


在某些方面,Rust是對C和C ++創(chuàng)建的內(nèi)存管理難題的回應(yīng),也是對這兩種語言的許多其他缺點的回應(yīng)。Rust編譯為本機機器代碼,因此就性能而言,它被認為與C相當(dāng)。但默認情況下,內(nèi)存安全才是Rust的主要賣點。


Rust的語法和編譯規(guī)則可幫助開發(fā)人員避免常見的內(nèi)存管理錯誤。如果程序有一個不符合Rust語法的內(nèi)存管理問題,它就不會被編譯。剛接觸這種語言的新手,特別是以前用C語言的開發(fā)者,由于C語言為這類bug提供了充足的容錯空間,所以他們接觸Rust的第一步是學(xué)習(xí)如何安撫編譯器。但Rust的支持者認為,這種短期的痛苦有一個長期的回報:更安全的,不會減緩速度的代碼。


Rust還通過其工具改進了C語言。默認情況下,項目和組件管理是Rust提供的工具鏈的一部分,與Go相同。有一種默認的,推薦的方法來管理包,組織項目文件夾,以及處理C需要單獨處理的其他許多事情,每個項目和團隊以不同的方式處理它們。


然而,在Rust中被吹捧為優(yōu)勢的東西對于C開發(fā)者來說可能并沒有太大吸引力。Rust的編譯時安全功能無法禁用,因此即使是最小的Rust程序也必須符合Rust的內(nèi)存安全限制。默認情況下,C可能不太安全,但在必要時它更靈活,更寬容。

另一個可能的缺點是Rust語言的大小。即使考慮到標準庫,C的功能也相對較少。Rust功能集非常龐大并且還在不斷增長。與C ++一樣,較大的Rust功能集意味著更強大的功能,但也意味著更高的復(fù)雜度。C是一種較小的語言,但更容易在頭腦中進行建模,因此可能更適合那些對Rust來說太小,不值得大動干戈的項目。


C vs. Python


當(dāng)今,每當(dāng)談?wù)撥浖_發(fā)時,Python似乎總是能出現(xiàn)在對話中。畢竟,Python是“對所有項目的第二佳語言”,毫無疑問是最通用的語言之一,擁有數(shù)千個第三方庫。


Python強調(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運行時進行內(nèi)存管理,因此開發(fā)人員不必擔(dān)心分配和釋放內(nèi)存的細節(jié)。但同樣,開發(fā)人員的輕松也是以運行時性能為代價的。編寫C程序需要嚴格關(guān)注內(nèi)存管理,但生成的程序通常是純機器速度的黃金標準。


但是,在二者的血脈中,Python和C共享一個深層的關(guān)系:Python運行時參考是用C語言編寫的。這允許Python程序包裝用C和C ++編寫的庫。第三方庫的Python生態(tài)系統(tǒng)的很多重要模塊,例如機器學(xué)習(xí)方面的庫,其核心是C代碼。


如果開發(fā)速度比執(zhí)行速度更重要,并且如果程序的大多數(shù)高性能部分可以被隔離到獨立組件中(而不是遍布整個代碼),那么純Python或Python和C庫的混合使得會是比單獨使用C更好的選擇。否則的話,C仍然是老大。


03

C語言為何值得去學(xué)


1. 嵌入式領(lǐng)域,C語言依然是首選語言,嵌入式并沒有因為其他上層語言的發(fā)展而沒落,現(xiàn)在嵌入式依然還在其自身的領(lǐng)域展現(xiàn)強大的生命力。手機,電視機,機頂盒,空氣凈化器等等電子產(chǎn)品都是其領(lǐng)域范疇,從長遠看短時間內(nèi)不可能被消失。而且智能機器人的崛起,C語言的使用頻率又開始加大了。


2. 操作系統(tǒng)內(nèi)核代碼還是C語言為主打,
就語言的靈活性以及執(zhí)行的效率來看C語言還是最合適的語言,而且在系統(tǒng)層次的代碼,C語言還是首選語言。而且現(xiàn)在很多流行語言的底層絕大部分的C語言構(gòu)建完成。從這個層面講C語言是永遠不會過時的,頂多算是應(yīng)用范圍變窄,但其作用依然強大。


3. C語言的職位比例相對應(yīng)用級語言是低了點,但是整個軟件行業(yè)在發(fā)展,絕對的C語言編程職位并沒有減少。
而且對于有志于成為架構(gòu)師層次的程序員來說,C語言還是必修課,構(gòu)建軟件框架還是需要對底層有所了解。


退一步來講,即使覺得C語言方面的職位比例低一些,不好找工作,可以先從C語言入手,把自己的知識體系建立起來,編程語言屬于工具范疇,熟悉一種工具的使用,很容易觸類旁通,切換到別的語言也相對輕松些,而且給整個職業(yè)生涯起了個好頭,打好了基礎(chǔ)為更上一層樓做足準備。


C語言之所以流行這么年,生命力這么旺盛和本身鮮明的高效,方便靈活掛鉤。即使在上層語言使用概率變低,并不妨礙在系統(tǒng)級別繼續(xù)發(fā)揮作用。任何一種語言都有其存在的社會價值所在。C語言還是值得作為入門語言深刻的學(xué)習(xí)。


4.C/C++程序員的收入沒有受到影響,依據(jù)100offer的后臺數(shù)據(jù)顯現(xiàn),現(xiàn)在經(jīng)過100offer入職的程序員年薪最高達47W,最低22.4W,C/C++程序員的收入與其它編程言語的崗位相比處于相等狀況,沒有呈現(xiàn)下風(fēng)。


跟著C++逐步變成某些特定公司和特定項目所需的言語后,高檔C++程序員的收入也會更具有競爭性。

5.在整個游戲產(chǎn)業(yè)和嵌入式上依然是主流。首先是游戲范疇,Milo Yip表示——程序員有必要運用C++結(jié)構(gòu)/庫,如大多數(shù)游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),盡管有些C/C++庫供給別的言語的綁定,但通常原生的API性能最佳、最新。


其次是東西范疇,無論是網(wǎng)絡(luò)安全仍是殺毒軟件,C/C++仍是干流言語。


知乎紅人vczh說:「我在上大學(xué)的時分簡直就只學(xué)習(xí)C/C++,后來實習(xí)的時分去了微軟,成果到了那里才知道,那個組是不必C/C++的,怎么辦?憑借著C++帶給我的富裕的功底,我準時完結(jié)了老板給我的"兩個星期內(nèi)學(xué)會C#和WCF基礎(chǔ)知識"的作業(yè),順暢開端作業(yè)?!?/span>


當(dāng)然,這只是vczh的個人經(jīng)歷,不具有普遍性,但不行否認的是C/C++仍具有不行代替性。某家創(chuàng)業(yè)公司CTO在承受采訪時表示:「即使有許多人唱衰C/C++,但在今世,仍有許多許多項目的目標渠道暫時只供給C/C++編譯器的支撐,僅從這一點而言,C/C++是不行能完全逝世的?!?br>

從應(yīng)用范疇來說,C/C++適用于高性能計算、嵌入式體系、開發(fā)服務(wù)器軟件、游戲、實時體系等,所以,短期內(nèi)能完全代替C++言語并不存在。


C/C++在體系、圖形、網(wǎng)絡(luò)等許多范疇都是不行代替的,它的光芒年月讓它的逝世速度得以減少。


當(dāng)某一種編程言語在市場需要顯著比另一種言語更強時,強需要言語中的缺陷則簡單被淡化,闌珊的言語則不斷被人挑出致命硬傷。這種編程言語之間的比較并不公平,且沒有意義。

編程言語都是用來表達思想和完結(jié)需要的東西,跟著年代的開展,不一樣言語在不一樣范疇都做出了取舍,代替盡管存在,但不是必定景象。C/C++的需要跟著年代開展會不行避免地越來越少,但不行能完全不見,C/C++程序員也具有不行代替性,在市場上照舊有著競爭性。


04

除了C語言,需要掌握多種編程語言嗎?


簡述


我剛剛斷送了自己的職業(yè)生涯,沒錯,很多人都這樣對我說。


同事得知我即將離開公司的消息,大多數(shù)對此表示理解。但讓他們困惑的是,我目前就職的公司是一家Windows商店,用C#.net編寫代碼,而我要入職的崗位要求在Linux環(huán)境下進行開發(fā),以Java為主要的編程語言。他們認為編程語言的改變會讓我丟失多年經(jīng)驗,許多人都贊同他們的觀點。


編程語言很多,數(shù)以百計。有些很常見,例如:Java、C#、PHP、Ruby、Python、和JavaScript,而有些則比較邊緣化或是新興的,例如:Awk、Go、Julia、Rust。面對如此多的選擇,我們又該關(guān)注那種語言呢?因此,我開始思考這個問題 - 你真的需要掌握不止一種編程語言嗎?

想要掌握多種編程語言的9個理由


  1. 能用多種方式來解決同樣的問題,掌握不同的編程語言意味著擁有更多的選擇。畢竟,當(dāng)你只有錘子時,一切看起來都像是釘子。
  2. 更有競爭力,擁有更多的就業(yè)機會。學(xué)習(xí)第二門編程語言,有時能加倍工作機會的數(shù)量。然而,這取決于你學(xué)習(xí)的語言種類。但無論怎么說,你將會有更多的合適機會,從而增加求職能力。
  3. 表明你具備學(xué)習(xí)新語言的能力。潛在的雇主會認為你并非是死板或者慣守成規(guī)的人。
  4. 學(xué)習(xí)是很有趣的。學(xué)習(xí)新的事物會讓你的頭腦保持興奮。這將有助于你在新領(lǐng)域的成長和提高。
  5. 緊跟當(dāng)前的技術(shù)發(fā)展趨勢。了解哪個行業(yè)在獨領(lǐng)風(fēng)騷,就可以永遠站在潮流的尖端,你的技能便不會過時。
  6. 這將提醒你為什么應(yīng)該熱愛你的“主”語言,或者如何將事情做得更好。有時候,只有嘗試過新語言,才會知道主語言是何等的優(yōu)秀。你會更加欣賞自己最愛的語言。與此同時,新語言可能會有一些驚人的特性,讓你深覺相見恨晚。
  7. 有助于成為一個更加優(yōu)秀的程序猿。學(xué)習(xí)新的語言,有助于提高在所有語言之間通用的技能,例如:設(shè)計和架構(gòu)算法,或處理不同的數(shù)據(jù)結(jié)構(gòu)。
  8. 針對工作選擇最佳的工具。尺有所短寸有所長 - 有的語言更善于處理某些特定方面的事情。掌握了多種語言,你可以在工作中選用最佳的工具
  9. 表明你的學(xué)習(xí)能力強。沒有任何事情比掌握第二語言更能證明你的學(xué)習(xí)能力。


不想掌握多種編程語言的9個理由


  1. 掌握一種語言更容易。通常,集中精力和全心投入才能精通某一事物。如果不斷地在多種語言之間進行切換,那么真正精通一門語言的概率就會降低。掌握一種語言也有助于你集中精力。
  2. 大多數(shù)人只需要一份工作,大部分公司只使用一種語言。在你被錄用后,掌握多種語言不一定會有所幫助。有時候,只要掌握項目所用的語言就夠了。
  3. 總有一些東西值得學(xué)習(xí);有時候,這意味著要更深入地學(xué)習(xí)一種語言。
  4. 大多數(shù)情況下,專家能提更高的薪資要求,因為人們更愿意為專家支付更多的薪水。John Sonmez在其視頻《 I’m Not Sure I Want To Be A Specialist》中談到為什么多面手并不總是最好的。
  5. 即便僅掌握一種語言,仍然可以被認為是一個偉大的開發(fā)者。是否是偉大的開發(fā)者與你掌握多少種語言無關(guān)。關(guān)鍵在于你創(chuàng)造的是什么。因為只涉及一種語言,所以你可以花更多的時間進行創(chuàng)造。
  6. 你只需要學(xué)習(xí)有限的軟件開發(fā)工具。大多數(shù)語言只有為數(shù)不多的一些工具。切換語言往往意味著要切換工具。只掌握一種語言,你就可以更快地掌握相關(guān)的工具。這將有助于提高工作效率。
  7. 更易于定位自己的市場。因為只掌握一種語言,基本上你只會朝這個方向安頓下來(即使不是出于自己的選擇)。
  8. 你可以憑借任何一種語言解決大多數(shù)軟件問題。不管有多少人告訴你,大多數(shù)語言可以用于解決任何問題。如果解決問題是你的主要目標(本應(yīng)當(dāng)是),掌握更多的語言并不一定有助于實現(xiàn)這個目標。
  9. 深入理解一件事比表面了解十件事更好。


這并非是一個非黑即白的問題。和其他問題一樣,最好的解決辦法是取中間值:總有一片灰色地帶。如果你是一個初學(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)域。


在成為T形開發(fā)者的歷程中,你將靈活地掌握多種語言,同時具備某個領(lǐng)域?qū)<业膬?yōu)點。


應(yīng)該掌握哪種編程語言?


一個常見的問題是,應(yīng)當(dāng)學(xué)習(xí)哪種語言?;蛘哒f,假如你是初學(xué)者,應(yīng)當(dāng)首先學(xué)習(xí)哪種語言。通常,我會選擇有一定歷史的語言作為主要語言。這種語言應(yīng)當(dāng)用于多個行業(yè),并且有廣泛的使用群體和大量的開發(fā)工具。符合這些標準的語言有:Java、C#、.NET、Ruby、Python和Swift。


TIOBE軟件基于這些標準持續(xù)跟蹤軟件語言的流行性,并編入索引中。你可以點擊TIOBE Index查看完整的編程語言列表。索引會每月更新,前20名中的大多數(shù)語言都是不錯的選擇。未來10年,這些語言還會流行嗎?我不確定。不過至少在未來四年內(nèi)還是很可能保持流行的,我想,這對任何準備著手的項目都是夠用的。

是否需要掌握多種語言取決于你的目標


想開始新的業(yè)余項目或業(yè)務(wù)?或許你只需要掌握一種語言。


想換行業(yè)或駕馭技術(shù)發(fā)展趨勢?或許你需要掌握不止一種語言。


想在企業(yè)環(huán)境中工作?或許你只需要掌握一種語言。


想工作在前沿項目?或許你需要掌握不止一種語言,因為潮流總是在變化。


說實話,關(guān)于是否需要掌握更多的語言,其實并沒有絕對正確或錯誤的答案,最后的決定取決于你。


【參考資料】


1、Serdar Yegulalp .
https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html

2、趙巖 . 
http://zhaoyan.website/blog/index.php/2017/07/15/future/

3、佚名 .
https://dzone.com/articles/do-you-need-to-know-more-than-one-language


-END-


猜你喜歡

MATLAB R2020a新鮮出爐,我來替各位嘗嘗鮮!
接線時,銅線和鋁線為什么不可以擰在一起?
學(xué)習(xí)單片機的三個步驟

 最 后  
 

若覺得文章不錯,轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!
在公眾號內(nèi)回復(fù)「 更多資源 」,即可免費獲取,期待你的關(guān)注~
長按識別圖中二維碼關(guān)注

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉