導言:C的笛卡爾之夢
原文:Introduction: The Cartesian Dream Of C
譯者:飛龍
Whatever I have up till now accepted as most true and assured I have gotten either from the senses or through the senses. But from time to time I have found that the senses deceive, and it is prudent never to trust completely those who have deceived us even once.
勒內·笛卡爾,《第一哲學沉思錄》
如果有一段引述用來描述C語言程式設計的話,那就是它了。對於大多數程式設計師,C是極其可怕而且邪惡的。他就像是惡魔、撒旦,或者一個使用指標的花言巧語和對機器的直接訪問來破壞你生產力的騙子洛基。於是,一旦這位計算界的路西法將你纏住,他就會使用邪惡的“段錯誤”來毀掉你的世界,並且揭露出與你交易中的騙局而嘲笑你。
然而,C並不應由於這些現實而受到責備。你的電腦和控制它的作業系統才是真正的騙子,而不是朋友。它們通過密謀來向你隱藏它們的真實執行邏輯,使你永遠都不真正知道背後發生了什麼。C程式語言的失敗之處只是向你提供接觸背後真正工作原理的途徑,並且告訴了你一些難以接受的事實。C會向你展示痛苦的真像(紅色藥丸),它將幕布拉開來向你展示一些神奇的原理。C即是真理。
既然C如此危險,為什麼還要使用它?因為C給了你力量來穿越抽象的假象,並且將你從愚昧中解放出來。
你會學到什麼
這本書的目的是讓你足夠熟悉C語言,並能夠使用它編寫自己的軟體,或者修改其他人的程式碼。這本書的最後,我們會從一本叫做“K&R C”的名著中選取實際的程式碼,並且用你學過的知識來做程式碼審查。你需要學習下面這些東西來達到這一階段:
-
C的基本語法和編寫習慣。
-
編譯,
make
檔案和連結。 -
尋找和預防bug。
-
防禦性程式設計實踐。
-
使C的程式碼崩潰。
-
編寫基本的Unix系統軟體。
截至最後一章,你將會有足夠的工具來解決基本的系統軟體、庫和其它小專案。
如何閱讀本書
這本書為那些已經掌握至少一門程式語言的人而設計。如果你還沒有接觸過程式設計,我推薦你先學習笨辦法學Python,這本書適用於真正的新手並且適合作為第一本程式設計書。一旦你學會了Python,你可以返回來開始學習這本書。
對於那些已經學會程式設計的人,這本書的開頭可能有些奇怪。它不像其它書一樣,那些書中你會閱讀一段段的文字然後編寫一些程式碼。相反,這本書中我會讓你立即開始程式設計,之後我會解釋你做了什麼。這樣更有效果,因為你已經經歷過的事情解釋起來更加容易。
由於採用了這樣的結構,下面是本書中你必須遵守的規則:
-
手動輸入所有程式碼。不要複製貼上!
-
正確地輸入所有程式碼,也包括註釋。
-
執行程式碼並保證產生相同的輸出。
-
如果出現了bug則修正它。
-
做附加題時,如果你做不出某道題,馬上跳過。
-
在尋求幫助之前首先試著自己弄懂。
如果你遵守了這些規則,完成了本書的每一件事,並且還不會程式設計C程式碼的話,你至少嘗試過了。它並不適用於每個人,但是嘗試的過程會讓你成為一個更好的程式設計師。
核心能力
我假設你來自於一種弱者的語言。這些“易用的”語言之一是Python或者Ruby,它們帶給了你草率的思維和半吊子的黑魔法。或者,你可能使用類似Lisp的語言,它假設計算機是純函式式的奇幻大陸,帶有一些為嬰兒準備的充氣牆。再或者你可能學過Prolog,於是你認為整個世界都是一個資料庫,你可以從中尋找線索。甚至更糟糕的是,我假設你一直都在用IDE,所以你的大腦佈滿了記憶體漏洞,並且你每打三個字元都要按CTRL+空格來打出函式的整個名字。
無論你的背景如何,你都可能不擅長下面四個技能:
閱讀和編寫
如果你使用IDE這會尤其正確。但是總體上我發現程式設計師做了很多“略讀”,並且在理解上存在問題。它們會略讀需要詳細理解的程式碼,並且覺得他們已經理解了但事實上沒有。其它語言提供了可以讓他們避免實際編寫任何程式碼的工具,所以面對一種類似C的語言時,他們就玩完了。你需要知道每個人都有這個問題,並且你可以通過強迫自己慢下來並且仔細對待閱讀和編寫程式碼來改正它。一開始你可能感到痛苦和無聊,但是這樣的次數多了它也就變得容易了。
專注細節
每個人都不擅長這方面,它也是劣質軟體的罪魁禍首。其它語言讓你不會集中注意力,但是C要求你集中全部注意力,因為它直接在機器上執行,並且機器比較挑剔。C中沒有“相似的型別”或者“足夠接近”,所以你需要注意,再三檢查你的程式碼,並假設你寫的任何程式碼都是錯的,直到你能證明它是對的。
定位差異
其它語言程式設計師的一個關鍵問題就是他們的大腦被訓練來指出那個語言的差異,而不是C。當你對比你的程式碼和我練習中的程式碼時,你的眼睛會跳過你認為不重要或者不熟悉的字元。我會給你一些策略來強制你觀察你的錯誤,但是要記住如果你的程式碼並不完全像書中的程式碼,它就是錯的。
規劃和除錯
我喜歡其它較簡單的語言,因為我可以想怎麼寫就怎麼寫。我將已有的想法輸入進直譯器,然後可以立即看到結果。你可以把你的想法試驗出來,但是要注意,如果你仍然打算“試驗程式碼使其能夠工作”,它就行不通了。C對於你來說稍困難,因為你需要規劃好首先建立什麼。的確,你也可以進行試驗,但是比起其他語言,你必須在C中更早地嚴肅對待程式碼。我會教給你在程式設計之前規劃程式核心部分的方法,這對於使你成為更好的程式設計師十分有幫助。即使一個很小的規劃,都會使接下來的事情變得順利。
學習C語言會使你變成更好的程式設計師,因為會強制你更早、更頻繁地解決這些問題。你不會再草率地編寫半吊子的程式碼,程式碼也會能夠正常工作。C的優勢是,它是一個簡單的語言,你可以自己來弄清楚,這使得它成為用於學習機器,以及提升程式設計師核心技能的最佳語言。
C比其它語言都要難,而這是由於C並不對你隱藏細節,它們在其它語言中都試圖並且未能被掩蓋。
協議
原書在完稿之後可以自由分發,並且能在亞馬遜上購買。該中譯版本遵循CC BY-NC-SA 4.0協議,你可以在保留署名和出處的前提下以非商業目的自由轉載。