C語言會不會過時
關於C會不會過時,從幾年前就有人開始在討論,現在,Java,python之流蜂擁四起,一幫人更是覺得C語言地位岌岌可危:“隨着時間的推移,linux將會是唯一一個活着的完全用C語言寫的項目”,“C沒有錢途,找工作都得java、jsp。 ” “雖然C語言太難,但搞嵌入式搞智能硬件的要吧。”,所以説,C語言會不會過時呢?
為什麼C語言不會過時?
評價任何一門編程語言,都是招人罵的。 永遠是這樣。就像是春寒料峭的季節, 街上穿棉襖和穿單衣的擦肩而過,雙方一定是同時在心裏出現了兩個字:“傻 逼!”這個在心理學上有個專業的名字:叫做“二逼”現象!
那我為啥還要做這個捱罵的事呢?作為《C語言點滴》《drop of knowledge of C++》書籍的作者,《C語言新思維,第二版》的譯者。我覺得我有責任系統的介紹一下這本語言,他的特點,還有他的未來。這個問題對很多剛剛踏入程序猿這個行業的新手至關重要。因為他們有深深的擔憂,萬一C語言就像Fortran,perl語言那樣過時了怎麼辦?
先上一個表,這個就是著名的TIOBE語言排行榜。目前它是一個最權威的一個語言流行度的排行榜,從這個排行榜上看,你會得到一個最直觀的結論。Java和C都在下降,而下降的部分被第三名以後的語言所瓜分。
對所有的編程語言,他們的最後的目的其實就是兩種:提高硬件的運行效率和提高程序員的開發效率。遺憾的是,這兩點是不可能並存的!你只能選一樣。在提高硬件的運行效率這一方面,C語言沒有競爭者!舉個簡單的'例子,實現一個列表,C語言用數組int a[3],經過編譯以後變成了(基地址+偏移量)的方式。對於計算機來説,沒有運算比加法更快,沒有任何一種方法比(基地址+偏移量)的存取方法更快。C語言已經把硬件的運行效率壓縮到了極致。這種設計思想帶來的問題就是易用性和安全性的缺失。例如,你不能在數組中混合保存不同的類型,否則編譯器沒有辦法計算正確的偏移量。同時C語言對於錯誤的偏移量也不聞不問,這就是C語言中臭名昭著的越界問題。C語言自詡的“相信程序員”都是漂亮的説辭,它的唯一目的就是快,要麼飛速的運行,要麼飛速的崩潰。C語言只關心程序飛的高不高,不關心程序猿飛的累不累。就是這樣!
現在來看看那些非C的語言,他們的長處都在於提高程序員的開發效率上。或者支持動態的列表,或者支持安全的列表。但是加入任何的中間層,加入任何的安全檢驗,它不可能比(基地址+偏移量+無檢驗)的方式更快。這個世界上不存在“開發容易,運行快”的語言,開發容易畢竟來源於對底層的一層一層又一層的包裝。就像是這個世界上根本就不存在“我就看看,什麼也不買”,不存在“我就抱抱,什麼也不幹”。
現在回答兩個最普遍的問題:硬件這麼便宜了,有必要讓軟件更快嗎?有這種疑問的人大部分都是網吧的固定客户,他們理解的計算機只在電腦城,他們理解的計算只是遊戲和播放硬盤中的小 電影。不要玩個遊戲開個掛就樂得不行不行的,別忘了還有全實景仿真,還有3D渲染,還有自動駕駛。人在開車的時候,每秒要收集60個不同的物體,然後根據這60個物體的不同組合和反映來做20個最重要的決定。然後從這20多個決定中選一個執行。所以就算用上最快的硬件,自動駕駛現在還不敢説能像人那樣開車。就算是自動駕駛成功了,下一步還要自動飛行呢?因為我們老早就預言了:你咋不上天呢!所以説:計算速度永遠是不夠的!因為新的應用會越來越複雜,越來也實時。對了!我還忘了一個更重要的限制:計算的能耗!NASA飛行器上的CPU最多就是32位的,説出來你可能不信,國際空間站上沒有一個CPU是64位的,我猜一個最主要的原因是航天員不愛看硬盤小 電影吧。
另外一個流行的疑問是:我可以發明一種同樣快的語言,但是沒有C語言那麼多的坑。想法是可以的,而且還真巧有這個語言,真巧它的名字叫D語言,真巧沒有太多的人用!這是因為一個基本的事實。現在有太多,太多太多的C代碼,他們大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你沒有看錯,這些操作系統的內核都是C,我雖然不確定C在Window中所佔的比例,但是我相信微軟的人不會傻到用C#去全部改寫一個操作系統的內核。你想讓這些人去用你的全新的語言,這就不是“有點”很傻,很天真了!而且有些代碼,我們根本就不能改!NASA一個簡單的5個CPU飛控軟件編寫完畢後,要進行一種“全覆蓋”測試。如果CPU A壞了會發生什麼?如果CPU A,B壞了呢?如果CPU A,C壞了呢。。。。?如果你願意,你可以做個簡單的數學組合。測試完畢後,別説重寫,就算加個註釋都不行。因為主管payload的大媽會非常嚴肅的質問你,為什麼你上報的東西數量增加了,但是質量沒有增加?你需要和她詳細的解釋:硬件和軟件是不同的,硬件是那種摸起來硬硬的東西,但是軟件不是那種摸起來軟軟的東西。看着大媽鄙夷的眼神,這個時候你會非常後悔自己手欠加入的哪一行註釋。你還別不當真,這個是NASA的真實故事。
哪為什麼C語言還下降這麼多呢?很簡單,有些任務本身就不是C語言的。我上學的時候還用C語言編過窗口界面呢?然後很快微軟的人就推出了MFC,就是一大堆宏把底層的C windowAPI包裝了起來。再後來這個技術也過時了。因為微軟的人認識到,帶有窗口的應用程序説到底不是C語言的本職工作,再這麼一層一層包下去就有露餡的危險,於是他們發明了一個全新的語言C#來負責這個任務。Java也是這樣,突出網絡,易用,安全,跨平台。無論是Java, c#還是python, 他們都有意避開提高硬件的運行效率這個問題,因為這個問題上沒辦法和C競爭,也無法撼動Linux, Unix,GNU tool這些已有C代碼的位置。剩下的就只是提高程序員的開發效率上大作文章。這對C語言是好事,把自己不善長的東西去掉,讓自己跑的更快!
伴隨着嵌入和實時系統的興起,AI,機器人,自動駕駛等。這些都是C語言的核心應用,而且在這種應用上面,C語言沒有競爭者。所以我感覺C語言會穩定在自己核心的應用中,並開始逐步回升。但是Java語言我個人不樂觀。小型和靈活性上,Python更勝一籌。一行python代碼後,你根本不知道自己還是不是duck類型?平台領域,每個平台都推出自己專屬的語言。Windows會繼續支持C#,蘋果偏愛Swift, Android推出Kotlin,Google用go。Java宣稱自己可以自由到每家做客,但是無論是到誰家,都會發現客廳裏面坐着一個親兒子,這個時候自己這個乾兒子多多少少有點尷尬。所以我猜測,最後Java會穩定在對跨平台有嚴格要求的,大型非實時應用上。
最後説點閒話,C++不會淘汰C語言。有了對象後你會發現再簡樸的對象也耗費資源,而且有了對象以後,總是不由自主的去想繼承這個事,一但繼承實現了,你會發現繼承帶來的麻煩遠超過你的想象。Java的發明人James被問到如果可以從新設計Java語言的話,第一個要做什麼事?他説:“去掉對象”!作為一個已婚,有兩個孩子的程序猿,我感同身受。如果大家感興趣,我可以再寫一個博客,聊聊C++和C的真實區別所在。
如果你看到這裏,還什麼都沒記住。那就只記住一點:沒人能預測未來。
-
2017全國計算機二級《C語言》考試題及答案
在備考複習階段,需通過大量試題練習,加深對考點的理解和掌握。以下是本站小編搜索整理的一份全國計算機二級《C語言》考試題及答案,供參考練習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!一、選擇題1).我們所寫的每條C語句,經過編譯最...
-
關於C語言精選模擬練習題
C語言是一個有結構化程序設計、具有變量作用域(variablescope)以及遞歸功能的過程式語言。下面是小編為大家整理的關於C語言精選模擬練習題,歡迎參考~5:請編寫一個函數fun,它的功能是:比較兩個字符串的長度,(不得調用c語言提供的`求字符串長度的函數),函數返回較長...
-
2017年計算機二級C語言考前訓練題及答案
計算機二級對於很多考生來説還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級C語言考前訓練題及答案,希望對大家有幫助!考前訓練題一1:第1題m個人的成績存放在score數組中,請編寫函數fun,它...
-
初學C語言的人最常問的幾個問題
C語言是一門通用計算機編程語言,應用廣泛。對於新手來説學習C語言並不是那麼容易,下面是C語言初學者最常問的幾個問題,歡迎閲讀!1.多久能學會編程?這是一個沒有答案的問題。每個人投入的時間、學習效率和基礎都不一樣。如果你每天都拿出大把的時間來學習,那麼兩三...