摘要: C 語言確實顯得有些老舊。最近一著作權威性的 C 語言還是 1988年 發布的;在接近 30 年的時間裡,這個語言的作者一直都沒有對它進行過更新,可見它有多過時了(這裡有誤。2011 年 12 月 8 日,國際標準組織(ISO)和國際電子電機委員會(IEC) 旗下的 C 語言標準委員會(ISO/IEC JTC1/SC22/WG14)正式發布了 C11 標準。
C 語言確實顯得有些老舊。最近一著作權威性的 C 語言還是 1988年 發布的;在接近 30 年的時間裡,這個語言的作者一直都沒有對它進行過更新,可見它有多過時了(這裡有誤。2011 年 12 月 8 日,國際標準組織(ISO)和國際電子電機委員會(IEC) 旗下的 C 語言標準委員會(ISO/IEC JTC1/SC22/WG14)正式發布了 C11 標準。C11 標準是 C 語言標準的第三版,前一個標準版本是 C99 標準。)現在,一說到必須有所瞭解的程式設計語言,大家都會想到 Rust、Go 或是 Clojure,卻很少有人會想到 C 語言。
但是我的同事 Myles 和我都不是追求潮流的人,因此我們堅持讓所有學生都熟練掌握 C 語言。
之所以要求學生學習這門古老的程式設計語言,我們有下面 4 個理由:
在灣區的 web 和移動初創企業之外的地方,C 語言依然是一個被廣泛應用的程式設計語言;
許多現代程式設計語言都受到了 C 語言的影響;
C 語言能讓你像電腦一樣思考;
在編寫軟體的時候,你現在所使用的大部分工具,都是使用 C(或C++)語言所開發的。
對於第一條理由,如果你就是想在灣區的 web 或是移動初創企業找一份工作的話,你可以忽略它。但是第二條原因是你無法迴避的。而大多數工程師,都應該重視第三條理由,要想做好電腦工作,你就必須要理解電腦的思考方式。對於第四條理由,它也是非常難以忽略的。
掌握 C 語言,意味著你可以更好的理解你所使用的各種工具。例如,對於 web 開發人員來說,他們必須要透徹的理解瀏覽器、作業系統以及所使用的各種語言,而這一切都是以 C 語言為基礎的。
我們的大多數學生,在使用直譯式語言的時候,都會同時使用那些用 C 語言所編寫的流行的實施工具。我們經常做這樣一個聯絡:讓學生們編寫一個 Python 位元組碼解譯器,從而讓他們更好的理解堆棧式機器和直譯式語言;在進行這個練習的時候,學生需要仔細閱讀 CPython 的部署。另外,Ruby 的實施參考也是用 C 語言編寫的,還有大部分 JavaScript 部署,他們是用 C++ 編寫的。
在學習 hashmaps 和動態數組的時候,我們有兩種方式:第一,自己進行部署,使用一種能讓我們具體對記憶體布局進行思考的語言;第二,閱讀相關優秀的部署執行個體。學生要想理解 Python 列表或是 Ruby 數組的工作方式,我們同樣有兩種方式:第一,讓他們從頭自己編寫一個版本;第二,閱讀標準庫部署的資源——在沒有接觸過 C 語言的情況下,要想徹底理解這些概念,基本上是不可能的事情。
如果不掌握 C 語言,要想瞭解作業系統也會變得更加困難。我們現在所使用的大部分作業系統,都是用 C 語言編寫的,C 語言的標準庫與 syscall 介面緊密相連,而且大部分與作業系統相關的概念都需要你先熟悉 C 語言。
在電腦網路方面,雖然對 C 語言不熟練並不會影響你的日常工作,但是那些要想瞭解作業系統 TCP/IP 堆棧的從業者,會逐漸意識到 C 語言的重要性。
最後再來說說資料庫,關KVStore for Redis,訊息佇列和其他分布式作業系統技術,要想獲得較高的效能,它們都需要你對 C 語言有所瞭解。
很多軟體工程師可能對 C 語言並不瞭解,在某一個狹小領域內的日常工作,或許並不需要你掌握基礎知識。但是我們要求學生必須要打好基礎,而 C 語言就是電腦科學工作的先決條件。如果你也有著較高的目標,那麼我建議你暫時擱置那些潮流語言,花幾個周末的時間去學學看上去有些過時的 C 語言。
原文連結