• 紀念 C 語言

    -回復 -瀏覽
    樓主 2020-07-25 08:44:53
    舉報 只看此人 收藏本貼 樓主

    前些天讀到一篇很傷感的文章《與 C 語言長別離》,翻譯自傳奇黑客 Eric Raymond。他可能是這個世界上最精通 C 語言的人之一,每周都要寫很多 C 代碼,卻發現“已經記不清楚上一次創建一個新的 C 語言項目是在什么時候了”。


    C 語言一直是我最喜歡的語言,因為再沒有任何語言像它一樣給程序員最大的自由和信任(請忽略匯編語言)。至今偶爾查看 TIOBE 的語言排名(https://www.tiobe.com/tiobe-index),還會首先看看 C 語言。細心的讀者也會發現,我幾乎每篇文章的頭圖,都是一段 C 語言代碼。但是,它早已不是我最喜歡用的語言。自從不再做航天項目,我也沒再創建過一個 C 語言項目(C 語言課上用的不算)。


    傷感的情緒,把我拉回到了 8 年前。蘇小紅老師正籌備一本新的 C 語言教材,第一章的任務給了我,令我非常糾結。感性上,我希望越多人學 C 語言越好;而理性上,我認為 C 語言是最不適合入門的語言。這導致我不知道第一章是應該“勸學”,還是“勸不學”。


    最終成文,糾結處處彌漫。這對銷量肯定不是好事,我已做好被拒稿的準備。


    蘇老師確實是拒絕的。查了下當時的郵件記錄,7 天,來來回回 20 封,才有了結論。感謝蘇老師的開明和擔當,下面的文字已經被近 80 所高校的學生讀過了。所以,也感謝下這些高校開明的 C 語言老師。


    以下文字節選自高等教育出版社蘇小紅版《C語言程序設計》2013年第3版的第1章。





    1? 為什么要學C語言

    &內容導讀

    本章力圖從一個客觀的角度講述學習C語言的意義,為不同需求的讀者設計不同的學習目標。

    1.1 引言

    “為什么要學C語言?”這個問題每年在中華大地都會被問上幾百萬次。不同學校、不同專業、不同的人都可能會給出不同的回答。但是,很多學生,尤其是有獨立思考精神的學生,往往會對得到的回答表示懷疑。這種懷疑直接導致的后果就是學習目的不明確,進而學習興趣不足,再繼續就是不愛學習了。為什么會這樣?根源在于,學習C語言的真正理由并沒有被揭示出來,因為很多人擔心,如果說了真話,學生會更不愛學習。但是,本書想冒一個險,賭上銷量,說出真話。這么做,是因為我們相信,真誠永遠好過虛假。

    讓我們先來了解一下C語言的傳奇身世,再解釋為什么要學C語言的問題。

    1.2 游戲、黑客和C語言

    1969年的美國貝爾實驗室,是當時科技界的夢工廠,集結著世界上最富創造力的科學家和工程師,其中還包括數位諾貝爾獎獲得者。他們一起創造了無數影響著全人類的發明。比如數碼相機的核心——CCD就是那一年在貝爾實驗室誕生的。

    這幫家伙的成就貌似高不可攀,但其實也都是凡人,在某些方面和我們也是非常相似的。比如當他們見到一臺強大的計算機時,心里最先想到的也是用它來玩游戲。那個時代,計算機是大型機構才能擁有的奢侈品,在這上面玩游戲實在暴殄天物。但誰在乎呢,追求快樂是最重要的,所以他們為了痛快地玩游戲而沒少動腦筋。

    那時候是沒有商業游戲的,想有游戲玩,首先要發揮DIY(Do It Yourself)精神,自己編。自己編的游戲被別人喜歡,是當時最有面子的事情。有一個叫Ken Thompson(以下尊稱為ken)的工程師,26歲,游手好閑,看到阿波羅11號載人登月成功,覺得挺酷,自己也想試試,就設計了一個叫“Space Travel”的游戲。在游戲中,玩家駕駛著宇宙飛船,在虛擬的太陽系里穿梭,欣賞美景的同時,還可以在各個行星、衛星表面降落。這個游戲先是在Multics系統上編寫,后來又在GECOS系統上重寫。能運行這兩個系統的機器都是笨重的大型機,雖然運算能力出眾,但顯示效果很差,而且機時費非常高,玩一次,公司要支付75美元(當時美國人均月收入大約200美元)。這要是被老板發現了,可不是鬧著玩的。于是他伙同28歲的同事,Dennis M. Ritchie(以下尊稱為dmr),滿大樓地尋找免費的“游戲機”。功夫不負有心人,還真被他們找到了一臺。

    PDP-7小型機,DEC制造,擁有當時最先進的圖形處理能力。彼時計算機的主要用途是數據處理,圖形能力并不太重要,所以PDP-7更多的時候是靜靜地躺著,很少被使用,直到ken和dmr這對骨灰級的玩家發現了它。

    站立者為dmr,端坐者為ken,

    體積最大者為PDP-11

    1-1 kendmr在工作或娛樂中

    游戲可以開始了。然而,游戲的運行需要操作系統的支持。PDP-7當時還是“裸機”,沒有能在其上運行的操作系統。偉大的DIY精神再次發揮作用,他倆挽起袖子開始為PDP-7編寫操作系統,并給這個系統起了一個名字——Unix。直到今天,Unix仍然是最被信任的操作系統,它既支撐著軍隊、政府、電力、電信和銀行等大型機構的關鍵業務,也是蘋果Mac系列電腦的動力之源,甚至iPhone、iPod Touch的魅力也部分拜其所賜。

    Unix起初是用匯編語言編寫的,那是一種更接近機器而不是人的語言。計算機能直接讀懂的語言叫機器語言,它所有的語句都是由“0”和“1”兩個數字構成的,根本就不是給人看的。當最后一個機器語言程序員瘋掉以后,人們終于開始琢磨怎么讓計算機認識人語?;舅悸肥亲鲆粋€翻譯程序,直接把人語翻譯成機器語言。這種翻譯程序被命名為“編譯器”。但是直接理解人語太難了,直到現在還沒能實現,所以就折中一下,設計一種盡量接近人語,還能被精確翻譯為機器語言的語言。這種語言就是我們常說的編程語言。學編程的過程,其實就是學用編程語言說話給編譯器聽的過程。第一種編程語言肯定是最接近機器而遠離人類的,它就是匯編語言。雖然看上去有幾分像人語,比如加法叫“ADD”,減法叫“SUB”,但它的語法完全是機器的,每一行語句都和一條機器指令嚴格對應。不同機器的機器指令是不一樣的,所以針對一種計算機編寫的匯編程序不能在另一種計算機上直接使用,必須重寫(Space Travel就被重寫過很多次。玩個游戲真不容易)。用專業術語來說,匯編語言缺少“可移植性”。

    Unix的優雅加上Space Travel的吸引力,使很多人希望他們的計算機上也能安裝Unix。于是ken和dmr決定改用高級語言編寫Unix,這樣它就可以在更多類型的機器上運行。

    除了機器語言和匯編語言以外,幾乎所有編程語言都被統稱為高級語言。它的特點是更接近人語,而與機器語言基本沒有瓜葛。不同的高級語言編譯器可以把同樣的高級語言程序翻譯成適應不同機器的指令,因而高級語言大多具有好的可移植性。

    故事講到這里,該書的主角——C語言,隆重登場了。決定使用高級語言后,在語言的選擇上,ken和dmr遇到了麻煩。當時可供選擇的高級語言有很多,包括直到現在還在被使用的BASIC和Fortran等。這些語言都是面向應用程序編寫而設計的,層次有些太高,距離機器太遠,都假想自己是在一個操作系統上運行,所以不適合用來開發操作系統。DIY基因再次發揮作用,他倆決定自己設計一種適合編寫Unix高級語言。那一年是1972年,ken繼續完善Unix,dmr設計新語言,兩人一起開發編譯器。因為該語言以ken早年設計的B語言為基礎,所以就自然而然地命名為——C語言。

    1983年,因為Unix和C語言的巨大成功,ken和dmr共同獲得了計算機界的最高獎——圖靈獎。玩游戲玩到這等境界,古今很難再找出第三人。

    Unix和C,得中其一,便富可敵國。然而,他倆從一開始就沒有去想申請專利、商標、軟件著作權等法律保護,而是把所有的一切,包括最寶貴的源代碼,都隨心所欲地散發。對他們來說,自己寫的程序有人使用,就是最大的快樂,也是最大的財富。這種隨心所欲恰好使得很多機構和個人都具有了自如地為Unix和C添加代碼、做各種貢獻的條件,因而又極大地促進了它們的發展。

    從上面的故事,我們可以發現kendmr的很多可愛之處:

    · 做事情以興趣為出發點,并不在乎未來會怎樣;

    ·?極富鉆研精神,喜歡迎接挑戰;

    ·?樂于分享,不計回報。

    這些特點正是正宗“黑客精神”的集中體現。這里筆者覺得很有必要澄清一下什么是“正宗”的黑客,以免給兩位前輩抹黑。

    黑客是計算機和互聯網的締造者,是一種獨特的文化。在“黑客”這個名詞還沒有為大眾熟知之前,計算機高手都喜歡自稱為黑客,并以被其他黑客承認為榮。他們不斷地挑戰技術極限,以無償分享自己的成果為樂,創造出一個又一個的傳奇。計算機安全領域一直是黑客云集的地方,他們喜歡通過令人匪夷所思的手段,潛入別人的系統,在硬盤寫下“某某到此一游”,然后揚長而去,充分享受別人的目瞪口呆帶來的成就感。比如ken就在最早散發的Unix中留下了后門,而且還牛哄哄地告訴別人這個后門的存在。大家都以為有代碼就能搞掉一切后門,但所有人都無功而返。當然,無論ken還是其他黑客,最后都會告訴對方漏洞在哪,以及該如何防范。這么做一方面是出于好心,另一方面是,他們喜歡欣賞別人得知實情后的目瞪口呆的表情。

    后來出現一些急功近利或別有用心的人,他們利用黑客找到的漏洞去破壞別人的系統,盜竊別人的數據,以期達到不可告人的目的。這種人居然也自稱“黑客”,而且曝光率非常高,于是在大眾眼中,“黑客”一詞已成為專門黑機器搞破壞的人的代名詞。這種結果讓人痛心,但也無奈。希望讀者能理解,本書中談到的“黑客”都是指頗有俠義精神的正宗黑客。

    Ken ThompsonDennis M. Ritchie被奉為黑客圈子里的英雄,開山鼻祖。大家都尊稱他們為ken和dmr(必須小寫)。幾十年過去了,黑客圈子里再沒有第二個人敢叫“ken”,雖然這是一個在英語圈里司空見慣的名字。

    Unix和C至今仍是年輕黑客被圈子接受前必須苦練的三大技藝之一和之二(之三是隨便一種腳本語言)。由黑客設計,被黑客推崇,所以C語言自身也處處閃耀著黑客精神的光芒。這種光芒使它能夠永葆青春。

    1.3 C語言,不老的傳說

    最受歡迎的歌一定是被聽得最多的,那么最受歡迎的語言一定是被用得最多的。C語言現在用得多嗎?在業界,一般的答案是:

    如果一件事可以用X語言做,就一定不要用C語言做。

    這里的X可以代指任何語言。天啊,這好像是在說“如果可以聽X的歌,就一定不要聽周杰倫的歌”。這是在評價周杰倫還是曾軼可???

    編程語言是最受歡迎的?每個人都有自己的主觀看法。還是用客觀的數據說話吧。

    1-2TIOBE20133月公布的程序設計語言受歡迎程度的趨勢圖(最新的統計圖請訪問上面網址)??梢钥吹?,C語言始終處于前兩位且大有再次奪回第一位的勢頭。

    (圖片來源:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

    1-2 20133月統計的10大最流行編程語言的流行趨勢圖

    能不用就不用,還如此受歡迎,這就有些讓人費解了。dmr曾經說過一句話:“C詭異離奇,缺陷重重,并獲得巨大成功。”因為詭異且有缺陷,所以會被盡量避免使用,取而代之的是彌補了這些缺陷的語言;因為確實獲得了巨大成功,所以它至今仍大受歡迎。到底有多成功,再看一次圖1-2,它列舉的當今最受歡迎的10種語言,除C語言以外的9種中,有6種都直接使用、間接引用或部分借鑒了C語言的語法(比如,它們語句的結尾都要有一個“;”),只有VisualBasic、PythonRuby的語法里找不到C的影子。憑這等世界第一的影響力,受到歡迎也就在情理之中了。但為什么卻被盡量避免使用呢?那是因為它讓人愛恨交織。

    1.4 C語言的愛與恨

    C語言設計原則的第一條是:信任程序員。對程序設計語言了解不多的人,不會覺得這句話怎樣。但對真正的程序員來說,憑這句話就足以對C語言愛一輩子,愛得死去活來。

    C語言一夫當道的年代,計算機相當昂貴,但速度比不上現今的手機,內存都以KB為單位計算。所以,那時候對程序最基本的要求就是效率。C語言完全滿足人們對效率的苛求,精心設計的代碼可以極大地節約資源,又不像匯編語言那樣難用,所以受到程序員的歡迎。后來,硬件越來越便宜,性能越來越高,程序的運行效率已經不是追求的主要目標,安全性、穩定性和是否易于維護等變得重要起來,C語言的弊端便顯現了。

    C語言給程序員最大的發揮空間,讓他們可以自由地在代碼中揮灑激情和創意,從不去質疑這些代碼是否合理,因為它“信任程序員”,相信程序員的決定一定是正確的,即便有錯誤,也一定能自己修正。無限制的自由,在某些人的手中是創造力的源泉,而在另外一些人手中,卻能成為混亂的根源。隨著軟件系統規模的膨脹,需要的程序員越來越多,而經驗豐富的比例越來越小,軟件出現錯誤的概率就越來越大。每一個低級的錯誤都可能會引發大災難。很多人把這種亂象產生的原因歸罪于C給程序員的自由,開始懷疑它,甚至恨它,卻從不反省自己糟糕的編碼能力。于是有人說,給這匹野馬加上韁繩吧,別讓它再恣意狂奔。但是C拒絕鎖鏈,于是很多語言穿上C的外衣,自己掛上鎖鏈,站了出來。它們看上去很像C,所以大家很容易接受。它們掛著鎖鏈,所以它們不再信任程序員,而是指手畫腳地告訴程序員,這件事情該怎么做,那件事情不能怎么做。如果程序員不聽它們的,它們就拒絕工作。這樣亂象解除了,開發速度加快了,多人合作容易了,錯誤減少了,對程序員能力的需求降低了,因而工資也降低了,老板開心了,業界繁榮了。平心而論,“一件事情可以用X語言做,就一定不要用C語言做”確實是一個很好的策略,盡管程序員會失去一些自由,但在合法的范圍內仍有一定的空間可以發揮創造力,而且這些創造力很少創造出負面效果,能讓老板、程序員、用戶皆大歡喜。但程序員,尤其是受人尊敬的程序員,他們的血液中天生就充滿著不安分,向往自由的黑客生活,所以他們會一邊撫摸著身上的傷疤,一邊懷念那個魯莽卻無往不利的老將軍,懷念在他手下無拘無束的日子,懷念被他激發出的無盡潛能。這個老將軍是程序員心中永遠的戰神。

    1.5 C語言教給我們的事

    現在,還需要使用C語言的地方大概只限于下面個領域:

    1.???C語言仍然是編寫操作系統的不二之選。它為操作系統而生,能更直接地與計算機底層打交道,精巧、靈活、高效。最重要的,操作系統的開發者都是最頂尖的程序員,他們有充足的能力和經驗駕馭C語言。

    2.???在對程序的運行效率有苛求的地方,比如現在最火爆的“云計算”領域,云平臺做為基礎架構,對性能的要求非常高,那么C語言是首選了,因為C語言是目前執行效率最高的高級語言。

    3.???在需要繼承或維護已有的C代碼的地方,還需要C語言。有很多影響深遠的軟件和程序庫最早都是用C開發的,所以還要繼續應用C。但是,它們中的很多已經開始使用其它語言重寫,那些C的代碼早晚有一天會被拋棄。

    4.???因為學過C語言的人最多,熟悉C風格語法的人更多,所以C語言成為思想交流的首選媒介語言。比如,書籍里如果必須要出現程序,最常見的是C程序;在涉及到編程能力考查的筆試、面試時,C語言通常都是必考的。

    坦率地說,C語言的應用面是有些窄,市場需求量不大。不過因為真正能駕馭C語言人數量很少,小于市場需求,所以,C程序員的薪水還是蠻高的。圖1-3CSDN統計的2012年中國各編程語言開發者的收入范圍分布。

    (圖片來源:http://www.programmer.com.cn/14918/)

    1-32012年中國各編程語言開發者的收入范圍分布

    由圖1-3可以看出,C語言程序員的待遇是比較高的。而且,這種情況一直很穩定。但對于并不想成為開發高手,或者興趣不在底層開發的人來說,學它能有多大用處呢?如果單純從“用不上”這個角度得出“學C語言沒有用”的結論,是有失公允的。即便對計算機及相關專業而言,C語言的“用處”也不算大。學習C語言的意義并不在于使用它,而在于它可以讓我們了解很多基本的道理。

    這里不妨根據未來的職業需求,把讀者分為三類:

    1.?????不需要編程;

    2.?????需要編程,但不使用C語言;

    3.?????需要編程,且要使用C語言。

    對第三類讀者,沒什么好說的,不僅要好好學,而且要精深地學。熟練的C語言程序員拿到的工資是所有程序員里最高的。別看學過C語言的人很多,但真正會用它的,相當少。

    對第二類讀者而言,學習C語言最大的好處是可以更直接地體會計算機最基本的工作模式和方式。換而言之,就是能了解一些計算機底層的原理。這是在其它高級語言中很難體會到的。這些原理雖然也不常直接用到,但它們潛移默化的影響是驚人的,總是能在關鍵時刻發揮作用。另一個好處是C語言很適合入門。這并不是C語言自身決定的,而是中國龐大的C語言教育體系決定的。關于C語言的書籍、資料、論壇、習題和教輔系統等是最多的,而且無一例外都是面向程序設計的初學者。相比之下,其它語言的很多教材是假定讀者已經有了一定的編程經驗,不介紹或只簡單介紹那些通用的基本概念、理論與思維,直接跳到語言自身的特性。當然,像Java、C++等語言也有很好的面向初學者的教材,直接學習它們可以了解更新更好的編程思想,距離實際應用更近,成效更顯著。好在大多數主流編程語言都是從C語言一脈相承的,使得從C入門后,再學其它語言,并不會感到困難。

    C語言給第一類讀者的最大好處對第二、第三類讀者同樣有效,那就是C語言會為我們打開一扇了解計算機的窗口。在幾乎做任何事情都離不開計算機的今天,越了解計算機也就意味著越能利用好計算機。

    美國卡內基梅隆大學計算機科學系前系主任周以真教授在2006年發表了一篇著名的文章——《計算思維》。文中談到“計算機科學的教授應當為大學新生開一門稱為‘怎么像計算機科學家一樣思維’的課,面向非專業的,而不僅僅是計算機科學專業的學生”,這是因為“機器學習已經改變了統計學?!嬎闵飳W正在改變著生物學家的思考方式。類似地,計算博弈理論正改變著經濟學家的思考方式,納米計算改變著化學家的思考方式,量子計算改變著物理學家的思考方式”,所以“計算思維代表著一種普遍的認識和一類普適的技能,每一個人,不僅僅是計算機科學家,都應熱心于它的學習和運用”。不過遺憾的是,我們現在還很少有學校開設這樣的課程。所以程序設計課在某種程度上肩負了傳播計算思維的責任。這也是對于不需要編程的學生而言,最大意義之所在。通過學習編程,了解什么是抽象、遞歸、復用、折中等等計算思維,能在各行各業中更有效地利用計算機工具解決復雜問題。

    此外,絕對不應該忽略“二級”的意義。大學里除了要拿到“畢業證”和“學位證”以外,還要過“四級”和“二級”,否則可能會被扣發兩證,或找工作受阻,難以“落戶”等。這里的二級指的是“全國計算機等級考試二級”,是一個面向“程序員”,“考核計算機基礎知識和使用一種高級計算機語言編寫程序及上機調試的基本技能”的考試。雖然社會只需少量會編程的人,但莫名其妙的是幾乎所有的大學生都想(或被要求)過二級,導致程序設計課程成為了必修課。

    二級考試可選的語言包括C、C++、Java、Delphi、Visual Basic、Visual FoxPro和Access。為什么偏偏要學最古老的C呢?大概也是因為關于它的教育體系最成熟吧。不管怎樣,既然這門課已經開了,而且有不錯的老師帶領,那么就好好抓住這個機會吧,別把時間浪費了。以平穩通過二級考試為底線,以領會計算思維為目標,也許一個學期之后,你會發現自己在程序設計方面的天賦,進而在這方面努力,最后成為一名受人崇拜的黑客呢。

    1.7 本章小結

    C語言,黑客精神的產物,令人癡迷。但只有少數的人會成為黑客,所以對大多數人來說,學習C語言最重要的是領會程序設計的要旨,領會計算思維。但這些不是幾句話、幾頁紙、幾次課就能講得透的,需要在不斷的程序設計實踐中用心體會。多多編程,編得多了,自然就精熟了。




    2014 年我在知乎回答《C 語言和 Python,該從哪個入門編程?》時說出了更大的實話。感興趣的可以點擊閱讀原文。


    我要推薦
    轉發到
    牛彩官网