有人說C語言過時了,要學就學Python,怎麼反駁他?

林色芬


個人認為,這實際上反映了編程語言(教學)史上兩大學派--C和Lisp學派經久不息的爭論.

C學派和Lisp學派分別代表了自底向上(from bottom to up)和自頂向下(from top to bottom)兩種教學方式."自底向上"派觀點認為,應當從計算機底層的知識開始教起,然後一步一步提高程序的抽象層次直至達到應用程序水平,所以在學習二進制之前,應該先具有邏輯電路的相關知識;在編寫任何嚴肅的程序以前,必須先掌握內存架構和內存分配相關知識,是一個從具體到抽象的過程.而另外一派的觀點則截然相反:應當先教授抽象的程序,這些程序是用什麼語言寫的不重要,甚至這些程序只不過是偽代碼,只能"在心靈中執行",程序的思想不依賴於我們有沒有計算機,然後在實現的過程中再教授具體的東西(譬如,如果我們要實現一個排序算法,應該採用什麼數據結構,這些數據結構用C語言的結構體如何實現,內存如何管理等等),是一個從抽象到具體的過程(所以Lisp非常適合這一目的,因為Lisp本來可看做一種符號語言,在紙上也能執行演算).

這兩種爭端在別的學科中也有,比如在數學中有布爾巴基學派(對應著"自底向上").兩種方法各有優越性,最後也是殊途同歸:C學派最後也會教授程序抽象和結構化程序設計,而Lisp學派也會涉及到計算機底層的細節(譬如內存分配,大概會從垃圾回收器來入手,而不是從C學派所用策略).只不過就目前的趨勢來看,"自頂向下"一派似乎更有優勢一些.

其實也沒什麼奇怪的,考慮到計算機的普及,越來越多非專業人士也有編程的需要,這些並不關心任何計算機實現的細節,他們僅僅希望將手頭的任務完成,他們需要一門編程語言來實現他們頭腦中的想法,編程語言抽象層次越高越好,因為這樣就越接近他們的想法,實現的難度也就下降.例如抽象數據結構(Abstract DataStructure),一個人只需要知道這個數據結構上的接口(例如Python的List可以append,extend等等),就可以使用這個結構,而無須擔心這個List到底在堆上還是在棧上,實現的時候是單鏈表還是鏈表加上數組等等.

注意,這並不是說(像這個回答下一些人表達的觀點),採用"自頂向下"方法的人,就比採用"自底向上"方法的人,要"低級"一些.只不過這些人不必做某事,不代表他們不能做某事.

一個使用Python的人,一樣可以學習內存分配的相關知識(或者Java在這裡更加合適),只不過,他並不像在C語言中那樣要頻繁使用到這個內存分配的知識,因為垃圾回收使得手動內存分配這件事情變得沒有必要.這也不是說內存分配知識在動態語言中毫無必要,只不過在動態語言中,內存分配的相關知識的運用,並不在於進行手動分配這一點上,而在於如何與編譯器的內存優化(局部變量放在棧上,逃逸變量檢測)和垃圾回收器協作.同樣的,Python沒有顯式的指針,不代表在Python不能學習指針這個概念,在動態語言中,引用是和指針對應的概念(引用是隱式的指針,動態語言的變量和靜態語言的變量不是一回事).

換句話說,如果上述底層實現的知識對於一個人而言是必要的(不管這個人是出於好奇還是什麼緣故),那麼從理論上說,他可以從Python出發來獲得這些知識,只不過實際上有一些因素限制了這一點,那就是絕大多數的較為底層的應用和教材都是用C語言寫的(也還有一些是用Java或者偽代碼之類的寫的),由於C的設計比別的語言更加simple(不像例如Rust之類的基於LLVM的語言,優化就有好幾層,編譯以後代碼都嚴重變形了),可以更好在課堂上教授(例如彙編代碼更加好閱讀等等,類型系統更加簡單).

所以這又產生了一個新的問題:任何試圖瞭解更多的人(尤其是操作系統和網絡編程的這些知識)都不可能繞過C語言(不管是考慮到歷史還是教育因素等等).但這並不能證明C語言沒有過時(當然也不能證明C語言就過時了).

如果"過時"的含義是從編程語言設計的角度說的,不是從編程語言流行程度的角度說的.從某種意義上看,C語言和Python語言都"過時"了(當然Python還是比C年輕),因為他們都差不多是上個世紀80,90年代的產物了,至多隻能反應當時的編程語言的設計水平,也就是面向對象風靡的時刻,而像近幾年出現的Typescript等編程語言才能算是比較"先進",從這個角度說,沒有吸收最新編程語言研究成果的C語言確實就已經"過時"了.不過這種"過時"並不說C語言就不好,只不過是說對於這種編程語言,大家都已經研究透徹了,所以大家在著手設計更加複雜,更加抽象的編程語言.簡單的語言包含在更加複雜的語言之中,這並不代表簡單的語言過時.舉例而言,正則表達式比圖靈完備的語言簡單,但是日常編程的時候程序員仍然大量使用正則表達式,但這也並不代經常使用的正則表達式就要比更少使用的更加強大LL(1)優越一些。

說了那麼多,就想指出一件事情:如果我們抽象的看待編程語言,那麼C語言是完全包含在Python之中的,因此理論上,任何使用C的教材可以改成用Python來寫(但是這種改寫實際上至多發生在程序員的心靈之中,不會有人真的幹這種事情),因此Python程序員無須因為Python比C更好寫而感到自不如人或者低人一等.從編程語言設計的角度上(和上手難易度)說,C語言確實比不上現在出現的新語言,但是從實際的使用上看,C語言還是比較比較主流的選擇.

其實這種糾結並不只是你有,還有800多萬的小夥伴在陪你一起糾結。


讓我來說,答案很簡單:選你感興趣的!我們都知道,興趣是好老師,所以培養興趣很重要。而如果你不確定自己對哪個語言更感興趣,那麼可以參考下面的方案:

如果你想做技術,走技術路線,那毫無疑問先學C語言百利而無一害。

如果還不確定以後的路想怎麼走,那無所謂先學Python還是C,隨緣吧。

如果確定了不想走技術路線,那麼請先從Python開始。

其實,從兩種語言入門,各有各的好處。

從C語言開始入門的話,它的語法結構比較嚴謹,把C語言學透徹了,再學其他的語言就簡單多了,可謂是一通全通。C語言是一種面向過程的語言,而Python是一種面向對象的解釋型計算機程序設計語言。先了解什麼是面向過程,然後去了解什麼是面向對象,這樣學習更有效率。

從Python入門,也有它的道理。Python入門程序比較簡單,在前期也比C語言容易學一些。學習C語言就比較枯燥,很難迅速見到成效,可能會摧毀你的學習積極性。先學習Python,雖然可能對底層實現方面瞭解比較模糊,但是這方面也可以等學完Python再補上。

當然,這個問題沒有標準答案。最終,還是要靠你自己實踐,才能知道什麼最適合自己。


鐵桿軍迷


C語言效率高,適用面廣,是經典的程序設計語言,不會過時的。

優點: 簡潔緊湊、靈活方便

C語言一共只有32個關鍵字,9種控制語句,程序書寫形式自由,區分大小寫。把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像彙編語言一樣對位、字節和地址進行操作,而這三者是計算機最基本的工作單元。

運算符豐富

C語言的運算符包含的範圍很廣泛,共有34種運算符。C語言把括號、賦值、強制類型轉換等都作為運算符處理。從而使C語言的運算類型極其豐富,表達式類型多樣化。靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。

數據類型豐富

C語言的數據類型有:整型、實型、字符型、數組類型、指針類型、結構體類型、共用體類型等。能用來實現各種複雜的數據結構的運算。並引入了指針概念,使程序效率更高。另外C語言具有強大的圖形功能,支持多種顯示器和驅動器。且計算功能、邏輯判斷功能強大。

C是結構式語言

結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控制程序流向,從而使程序完全結構化。

語法限制不太嚴格,程序設計自由度大

雖然C語言也是強類型語言,但它的語法比較靈活,允許程序編寫者有較大的自由度。

允許直接訪問物理地址,對硬件進行操作

由於C語言允許直接訪問物理地址,可以直接對硬件進行操作,因此它既具有高級語言的功能,又具有低級語言的許多功能,能夠像彙編語言一樣對位、字節和地址進行操作,而這三者是計算機最基本的工作單元,可用來寫系統軟件。

生成目標代碼質量高,程序執行效率高

一般只比彙編程序生成的目標代碼效率低10%~20%。

適用範圍大,可移植性好

C語言有一個突出的優點就是適合於多種操作系統,如MS-DOS、UNIX、Microsoft Windows 以及Linux;也適用於多種機型。C語言效率高,可移植性好,並具備很強的數據處理能力,因此適於編寫系統軟件,三維,二維圖形和動畫,它也是數值計算的高級語言。

綜上,C不會過時的。


俺村的影城


c語言能做到的事情python做不到,現在很多人總強調彙編如何如何,說這樣話的一般不是已經退休的老工程師就是沒寫過彙編的,彙編的編寫本質與c沒有區別,我說的是編程思路,但是c語言可以容易實現複雜數據結構,同時通過系統調用而不是自己記憶系統調用號,大大提高了效率,時至今天用匯編寫程序的人可以說很罕見了!


大樹NB


簡單的反駁,就告訴他沒有的C哪來的python,現在主流的python還是CPython,底層是由C語言支持的。

為什麼C語言不會過時

對於所有編程語言追求的無非兩種,提高硬件到的運行效率和提高程序員的開發效率,魚與熊掌不可兼得,在提高運行效率這一方面是無可比擬的,他只關心程序是否運行的快不快,才不關心你程序員用的爽不爽,而其他編程語言都是在提高程序員的開發效率上下功夫。而且現在的操作系統內核都是C寫的,他就像是互聯網的基石,怎麼會過時.

python為什麼會這麼流行

因為python簡單易上手,而且有豐富的庫支持,用於廣,可用於爬蟲、服務端、人工智能、數據分析、運維等,尤其在人工智能上的應用,把它推向了高峰。

總結

C偏底層,所以學起來難度會很大,而python更高級,簡單容易上手,對於編程新手來說建議去學python,而且對於目前環境,需求也不少。



測試軒


python號稱21世紀的VB,python簡潔易學,相當於我們站在了巨人的肩膀上。而C語言是基礎,是編程思想最好的體現。


空空如也Z


我就是忠實信奉C和C++的,每次有人說這種問題,我就說:你大爺永遠都是你大爺……[摳鼻]


Polarix


何必計較 愛學啥學啥 一句話 關我屁事 和關你屁事


喧囂4


人家是靠安利這種東西謀生的,駁他幹嘛。有人踩了屎,巴不得後來的人也踩了,不然顯得自己很蠢,就到處宣傳這裡風光獨好,就這心理。


TonyDeng


大件仍需C語言


大灣區創師記


為什麼要反駁他。


分享到:


相關文章: