原文:Introduction: The Cartesian Dream Of Chtml
譯者:飛龍python
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.git
勒內·笛卡爾,《第一哲學沉思錄》程序員
若是有一段引述用來描述C語言編程的話,那就是它了。對於大多數程序員,C是極其可怕並且邪惡的。他就像是惡魔、撒旦,或者一個使用指針的花言巧語和對機器的直接訪問來破壞你生產力的騙子洛基。因而,一旦這位計算界的路西法將你纏住,他就會使用邪惡的「段錯誤」來毀掉你的世界,而且揭露出與你交易中的騙局而嘲笑你。github
然而,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協議,你能夠在保留署名和出處的前提下以非商業目的自由轉載。