C 语言还值得学习吗?C 语言会过时吗?C 语言解惑
C 語言還值得學嗎?
答案是肯定的。
第一,學習C有助于更好的理解C++,Java,C#,Perl以及其他基于C的特性的語言。第一開始就學習其他語言的程序員往往不能很好的掌握繼承自C語言的基本特性。
第二,目前仍有許多C程序,我們需要讀懂并維護這些代碼。
第三,C語言仍廣泛應用于新軟件的開發,特別是在內存或處理能力受限的情況下以及需要使用C語言簡單特性的地方。
C 語言會過時嗎?
對所有的編程語言,他們的最后的目的其實就是兩種:提高硬件的運行效率和提高程序員的開發效率。遺憾的是,這兩點是不可能并存的!你只能選一樣。在提高硬件的運行效率這一方面,C語言沒有競爭者!舉個簡單的例子,實現一個列表,C語言用數組int a[3],經過編譯以后變成了(基地址+偏移量)的方式。對于計算機來說,沒有運算比加法更快,沒有任何一種方法比(基地址+偏移量)的存取方法更快。C語言已經把硬件的運行效率壓縮到了極致。這種設計思想帶來的問題就是易用性和安全性的缺失。例如,你不能在數組中混合保存不同的類型,否則編譯器沒有辦法計算正確的偏移量。同時C語言對于錯誤的偏移量也不聞不問,這就是C語言中臭名昭著的越界問題。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的真實區別所在。
如果你看到這里,還什么都沒記住。那就只記住一點:沒人能預測未來。
--------------------------
全世界只需要五臺電腦 -IBM創始人
640K內存足夠了 -微軟創始人
沒必要在家里用電腦-DEC創始人
--------------------------
如果再有人對你說C語言已經過時了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。
C 語言的前世今生
1. 起源
C語言是貝爾實驗室的 Ken Thompson, Dennis Ritchie 等人開發的 UNIX 操作系統的“副產品”。
與同時代的其他操作系統一樣,UNIX 系統最初也是用匯編語言寫的。用匯編語言編寫的程序往往難以調試和改進,UNIX 操作系統也不例外。Thompson 意識到需要用一種高級的編程語言來完成 UNIX 系統未來的開發,于是他設計了一種小型的 B語言。Thompson 的 B語言是在 BCPL語言(20世紀60年代中期產生的一種系統編程語言)的基礎上開發的,而 BCPL語言又可以追溯到最早(且影響深遠)的語言之一——Algol 60語言。
1970年,貝爾實驗室為 UNIX 項目爭取到了一臺 PDP-11 計算機。當 B語言經過改進并能夠在 PDP-11 計算機上成功運行后,Thompson 用 B語言重新編寫了部分 UNIX 代碼。
到了1971年,B語言已經明顯不適合 PDP-11 計算機了,于是 Ritchie 著手開發 B語言的升級版。最初他將新開發的語言命名為 NB語言(意味New B),但是后來新語言越來越偏離 B語言,于是他將其改名為 C語言。
到1973年,C語言已經足夠穩定,可以用來重新編寫 UNIX 系統了。
2. 標準化
C語言在20世紀七十年代(尤其是1977年到1979)持續發展。這一時期出現了第一本有關 C語言的書。Brian Kernighan 和 Dennis Ritchie 合作編寫的 The C Programming Language 于1978年出版,并迅速成為 C程序員必讀的“圣經”。由于當時沒有 C語言的正式標準,這本書就成為了事實上的標準,編程愛好者把它稱為“K&R”或者“白皮書”。
隨著C語言的迅速普及,一系列問題也接踵而至。首先, K&R 對一些語言特性描述得非常模糊,以至于不同編譯器對這些特性會做出不同的處理。而且,K&R 也沒有對屬于 C語言的特性和屬于 UNIX 系統的的特性進行明確的區分。更糟糕的是,K&R 出版后 C語言仍然在不斷變化,增加了一些新特性并除去了一些舊特性。很快,C語言需要一個全面,準確的最新描述開始成為共識。
C89/C90
1983年,在美國國家標準協會(ANSI)的推動下(ANSI 于此年組建了一個委員會稱為 X3Jll),美國開始制定本國的 C語言標準。
1988年完成并于1989年12月正式通過的 C語言標準成為 ANSI 標準 X3.159-1989。
1990年,國際標準化組織(ISO)通過了此項標準,將其作為 ISO/IEC 9899:1990 國際標準(中國國家標準為 GB/T 15272—1994)。
我們把這一C語言版本稱為 C89 或 C90,以區別原始的 C語言版本。
委員會在制定的指導原則中的一條寫道:保持 C 的精神。委員會在描述這一精神時列出了一下幾點:
- 信任程序員
- 不要妨礙程序員做需要做的事
- 保持語言精煉簡單
- 只提供一種方法執行一項操作
- 讓程序運行更快,即使不能保持其可移植性
在最后一點上,標準委員會的用意是:作為實現,應該針對目標計算機來定義最合適的某特定操作,而不是強加一個抽象,統一的定義。在學習 C語言的過程中,許多方面都反映了這一哲學思想。
C99
1995 年,C語言發生了一些改變。
1999年通過的 ISO/IEC 9899:1999 新標準中包含了一些更重要的改變,這一標準所描述的語言通常稱為 C99
此次改變,委員會的用意不是在C語言中添加新的特性,而是為了達到新的目標。
其他方面的改變則更為保守,如,盡量讓C90,C++兼容,讓語言在概念上保持簡單。
雖然改標準已經發布了很長時間,但并非所有編譯器都完全支持C99的所有改動。因此,你有可能發現 C99 的一些改動在自己的系統中不可用,或者需要改變編譯器的設置才可用。
C11
2011年,C11標準問世。
那些基于 C 的語言,你知道嗎?
- C++:包含所有C的特性
- Java:基于C++,所以也繼承了C的許多特性
- C#:由C++于java發展起來的較新的語言
- Perl:最初是一種簡單的腳本語言,在發展過程中采用了C的許多特性
- Python
- …
C 語言的優缺點
與其他任何一種編程語言一樣,C語言也有自己的優缺點。這些優缺點都源于該語言的最初用途(編寫操作系統和其它系統軟件)和它自身的基礎理論體系。
- C語言是一種底層語言 為了適應系統編程的需要,C語言提供了對機器級概念(例如,字節和地址)的訪問,而這些都是其他編程語言試圖隱藏的內容。
- C語言是一種小型語言 與許多其他編程語言相比,C語言提供了一套更有限特性集合。(在K&R第二版的參考手冊中僅用49頁就描述了整個C語言。)為了使特性較少,C語言在很大程度上依賴一個標準函數的“庫”。
- C是一種包容性語言 C假設用戶知道自己在干什么,因此它提供了比其他許多語言更廣闊的自由度。此外,C語言不像其他語言那樣強制進行詳細的錯誤檢查。
1. C語言的優點
C語言的眾多優點解釋了C語言為何如此流行。
-
高效 高效性是C語言與生俱來的優點之一。發明C語言就是為了編寫那些以往由匯編語言編寫的程序,所以對C語言來說,能夠在有限的內存空間快速運行就顯得至關重要。
-
可移植 當程序必須在多種機型(從個人計算機到超級計算機)上運行時,常常會用C語言來編寫。
原因一:C語言沒有分裂成不兼容的多種分支。這主要歸功于C語言早期與UNIX系統的結合以及后來的ANSI/ISO標準。
原因二:C語言編譯器規模小且容易編寫,這使得它們得以廣泛應用。
原因三:C語言的自身特性也支持可移植性(盡管它沒有阻止程序員編寫不可移植的程序)。
-
功能強大 C語言擁有一個龐大的數據類型和運算符集合,這個集合使得C語言具有強大的表達能力,往往寥寥幾行代碼就可以實現許多功能。
-
靈活 C語言最初設計是為了系統編程,但沒有固有的約束將其限制在此范圍內。C語言現在可以用于編寫從嵌入式系統到商業數據處理的各種應用程序。
-
標準庫 C語言的突出優點就是它具有標準庫,該標準庫包括了數百個可以用于輸入/輸出,字符串處理,儲存分配以及其他實用操作的函數。
-
與UNIX的集成 C語言在與UNIX系統(包括Linux)結合方面特別強大。事實上,一些UNIX工具甚至假設用戶是了解C語言的。
2. C語言的缺點
- C語言容易隱藏錯誤 C語言的靈活性使得用它編程出錯的概率極高。在用其他語言時可以發現的錯誤,C語言的編譯器卻無法檢查到。更糟糕的是,C語言還包含大量不易察覺的隱患。
- C程序可能難以理解 C程序的簡明扼要與靈活性,可能導致程序員編寫出除了自己別人無法讀懂的代碼。
- C程序可能難以修改 如果在設計中沒有考慮到維護的問題,那么C編寫的大型程序可能很難修改。現代的編程語言通常提供“類”和“包”之類的語言特性,這樣的特性可以把大的程序分解成許多更容易管理的模塊。遺憾的是,C語言恰恰缺少這樣的特性。
3. 高效的使用C語言
要高效的使用C語言,就需要利用C語言優點的同時盡量避免它的缺點,一下給出一些建議。
- 學習如何規避C語言的缺陷
- 使用軟件工具使程序更可靠
- 利用現有的代碼庫 使用C語言的一個好處是其他許多人也在使用C。把別人編寫好的代碼用于自己的程序是一個非常好多主意。C代碼通常被打包成庫(函數的集合)。獲取適當的庫既可以大大減少錯誤,也可以節省很多編程工作。
- 采用一套切合實際的編碼規范 良好的編碼習慣和規范易于自己和他人對自己代碼的閱讀和修改。
- 避免“投機取巧”和極度復雜的代碼。C語言鼓勵使用編程技巧。但是,過猶不及,不要對技巧毫無節制,最簡單的解決方案往往也是最難理解的。
- 緊貼標準 大多數編譯器都提供不屬于 C89/C99 標準的特征和庫函數。為了程序的可移植性,若非確有必要,最好避免這些特性和庫函數。
為什么 C 語言難學?
不同與JAVA和python,C語言面臨的任務幾乎都是要求實時,高速或者是嵌入的。例如醫療,軍事,飛控,航天,金融等領域。舉個栗子,NASA大部分軟件要基于三個不同的時鐘系統,自轉(公轉)時間,CPU的晶振時間和原子鐘時間。一秒要分成500份,基于2毫秒的基礎進行操作同步;同時用全球的原子鐘時間均值對所有時鐘系統調整。在這種環境下,JAVA那種“大約一分鐘以后”的虛擬機管理方式一定是不行的。 所以我在NASA工作所接觸的軟件,幾乎都是C語言編寫的。可想而之,這種軟件的開發難度,當你閱讀這種程序代碼的時候,你說C語言太難了,這是否有點不公平?
其次是開發環境難。C語言一開始就和UNIX(LINUX)有不解之緣,它們是伴生的系統。所以要想發揮C語言的全部威力,最好的開發環境就是UNIX(LINUX)系統。但是問題來了,UNIX(LINUX)系統里的各種開發工具,每一個都不是省油的燈。它們設計的最初目的就是效率,而不是易學性。再舉個栗子,gcc的各種編譯開關就很復雜了,make系統為了解決gcc的部分問題,自己隨之帶來了更大的問題。git目的就是幫你保存歷史備份,但是你會發現你經常會串改歷史,或者干脆迷失在歷史中。就連最簡單的一個編輯器VIM,頭一個月內,你最多的使用體驗就是“恨不得拽自己的頭發把自己提溜起來。”
好吧,外面的世界太兇險!讓我們回到Windows媽媽哪里。雖然Windows的大部分內核都是C語言寫的,但是它對C語言的支持缺最差。Why?如果你用Window的編譯器去編譯C語言,你會發現變量必須要寫到函數的開頭。它是唯一一個只支持到C89標準的編譯器。Windows本身不想去搶這份實時,高速,嵌入的市場,老老實實做消費電子市場就好,這種市場要求開發容易,發布快。所以C#語言和后面的.Net平臺才是它發展的重心。像玩LEGO那樣的編程,你需要做的就是把一個個控件拽到窗口上,用鼠標來編程!所以還是算了吧,畢竟你也不想你在做飛機的時候,飛機上控制降落的電腦突然藍屏了吧!所以如果你是一個C程序員,你唯一能做的就是在linux下使用哪些臭名昭彰的難學的工具。這筆賬難到也要算到C語言的頭上嗎?
最后是底層難。這必須要要聊聊C語言兩個最受詬病的特性,位操作和指針。這兩個概念本身很簡單。但是通過這兩個概念,它把很多底層操作系統的知識和體系結構的知識都暴露了出來。指針指向地址后,馬上引入了一大堆內存管理知識。什么是堆?什么是棧?這個地址在內存的那個區域?這個區域可以修改嗎?這個區域自動回收嗎?指針指向函數后,又引入了一堆操作系統知識,什么是回調函數啊?什么是事件驅動啊?以及位操作后面的二進制,溢出,浮點數精度等等一系列的問題。我用手指指向了一本《相對論》,然后就有人跑過來對我說,你這個手指頭太難了!
如果編程只是你的業余愛好,使用那種語言真的無所謂。大部分初學者面臨的任務規模下,三種語言的開發難度都差不多。 就是打個招呼,英語的“hello”,中文的“你好”,或者是日語的‘牙買碟’,我實在看不出這有什么難度上的區別。但是如果你立志要當一名高水準的程序員,C語言你是逃避不開的。或者編程序是你的飯碗,你也要認真考慮一下C語言。語言的易學性在就業上是一把雙刃劍。如果一個公司招聘C程序員,你第一個反應就是他為什么不去招聘滿大街的JAVA程序員?你面臨的一定不是什么圖書管理系統,也一定不是一個什么網站。想明白了這一點,就完全有理由要一個高價錢!
C語言很難,要逃避這種難,卻很難!C語言很簡單,要理解這種簡單,卻不簡單(文章排比對賬,我只服自己!)
C 語言所有知識點的開源項目:
https://github.com/hairrrrr/C-CrashCourse 歡迎 star ~
學習 C 語言,領取 C 語言資料,微信搜【不會編程的程序圓】
關于 C 語言的問題,歡迎和我交流
參考資料:
趙巖的博客(http://zhaoyan.website/blog)
《C 語言程序設計 —— 現代方法》
總結
以上是生活随笔為你收集整理的C 语言还值得学习吗?C 语言会过时吗?C 语言解惑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人开发者只要一行代码接入微信支付和支付
- 下一篇: K8S Pod该如何监控