探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


誰叫你不幸生在中國了?

——何祚庥(中國科學院院士)

這是一本給非計算機專業的大學生的C語言的書。“我不是學計算機的,為啥要學C語言?”這個問題每年在中華大地都會被問上幾百萬次。被問的對象可能是老師,也可能是師哥師姐。師哥師姐往往也就是故作明瞭的表情,複述一遍隱約記得的老師的話。而這些話多半都是比較高瞻遠矚的,例如“將來可能會用到”,“鍛鍊編程思維有好處”,“C語言是學編程的基礎”等等。這些話沒有錯,所謂“技不壓身”,多學點兒東西肯定比不學要有好處。但問題是,如果把學C語言的精力用來學學其它與專業相關度更高的東西,是不是會更好呢?既然如此,幹嘛還學C語言呢?

最實在的答案,是何祚庥院士的:“誰叫你不幸生在中國了?”

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


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

二級考試可選的語言包括C、C++、Java、Delphi、Visual Basic、Visual FoxPro和Access。為什麼偏偏要學最古老的C呢?這裡的原因複雜多樣,每個學校都有各自的解讀,就不一一列舉了。總之,中國一定是世界上“認識”C語言的人口最多的國家,二級考試功不可沒。

反正既然此課已開,不學也不行,精力已經搭上,就還是認真瞭解一下C語言吧。雖然有些無奈,但好在C語言確實是一個有趣的傢伙,而且越瞭解越覺得有趣。如果不信,請往下看……

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


遊戲、黑客和C語言

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

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

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

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

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

Unix起初是用匯編語言編寫的,那是一種更接近機器而不是人的語言。計算機能直接讀懂的語言叫機器語言,它所有的語句都是由“0”和“1”兩個數字構成的,根本就不是給人看的。當最後一個機器語言程序員瘋掉以後,人們終於開始琢磨怎麼讓計算機認識人語。基本思路是做一個翻譯程序,直接把人語翻譯成機器語言。這種翻譯程序被命名為“編譯器”。但是直接理解人語太難了,直到現在還沒能實現,所以就折中一下,設計一種儘量接近人語,還能被精確翻譯為機器語言的語言。這種語言就是我們常說的編程語言,學編程的過程,其實就是學用編程語言說話給編譯器聽的過程。第一種編程語言肯定是最接近機器而遠離人類的,它就是彙編語言。雖然看上去有幾分像人語,比如加法叫“ADD”,減法叫“SUB”,但它的語法完全是機器的,每一行語句都和一條機器指令嚴格對應,這個特點使得針對一種計算機編寫的彙編程序不能在另一種計算機上使用,因為這兩種計算機的機器語言是不同的。用專業術語來說,彙編語言缺少“可移植性”。

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


Unix的優雅加上Space Travel的吸引力,使很多人希望他們的計算機上也能安裝Unix,玩玩Space Travel。於是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做貢獻,極大地促進了它們的發展。

從上面的故事,我們可以發現他倆的很多可愛之處:做事情以興趣為出發點,並不在乎未來會怎樣;極富鑽研精神,信奉“自己動手,豐衣足食”;樂於分享,不計回報。他們的這些特點正是正宗“黑客精神”的集中體現。他倆也被奉為黑客圈子裡的英雄,甚至是開山鼻祖,大家都尊稱他倆為ken和dmr(必須小寫)。幾十年過去了,黑客圈子裡再沒有第二個人敢叫“ken”,這個英語圈裡司空見慣的名字。

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

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


C語言,不老的傳說

最受歡迎的歌一定是被聽得最多的,最受歡迎的語言一定是被用得最多的。C語言現在用得多嗎?在業界,一般的答案是:如果一件事可以用X語言做,就一定不要用C語言做。

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

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

TIOBE在2016年8月公佈的程序設計語言受歡迎程度的趨勢圖(最新的統計圖請訪問上面網址)。可以看到,C語言始終處於前兩位,而且最近大有再次奪回第一位的勢頭。

能不用就不用,還如此受歡迎,這就有些讓人費解了。dmr曾經說過一句話:“C詭異離奇,缺陷重重,並獲得巨大成功。”因為詭異且有缺陷,所以會被儘量避免使用,取而代之的是彌補了這些缺陷的語言;因為確實獲得了巨大成功,所以它至今仍大受歡迎。一個成功的例證是,圖x-x中列舉的當今最受歡迎的10種語言,除去C語言,剩下的9種中,有7種都直接使用、間接引用或部分借鑑了C語言的語法(比如,它們語句的結尾都要有一個“;”),只有Visual Basic和Python的語法裡找不到C的影子。憑這等世界第一的影響力,受到歡迎也就在情理之中了,儘管它是那麼的讓人愛恨交織。

C語言的愛與恨

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

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

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


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

C語言教給我們的事

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

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

在對程序的運行效率有苛求的地方,比如嵌入式領域,C語言也是首選。不過,嵌入式系統現在的硬件性能也已經足夠強大,而功能要求越來越高,所以C語言的生存空間正在縮小。

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

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


應用面如此窄,學它能有多大用處呢?

如果單純從“用不上”這個角度得出“學C語言沒有用”的結論,是有失公允的。即便對計算機及相關專業而言,C語言的“用處”也不算大。學習C語言的意義在於,它為我們打開一扇瞭解計算機的窗口。在幾乎做任何事情都離不開計算機的今天,越瞭解計算機也就意味著越能利用好計算機。

美國卡內基梅隆大學計算機科學系前系主任周以真教授在2006年發表了一篇著名的文章——《計算思維》。文中談到“計算機科學的教授應當為大學新生開一門稱為‘怎麼像計算機科學家一樣思維’的課,面向非專業的,而不僅僅是計算機科學專業的學生”,這是因為“機器學習已經改變了統計學。……計算生物學正在改變著生物學家的思考方式。類似地, 算博弈理論正改變著經濟學家的思考方式,納米計算改變著化學家的思考方式,量子計算改變著物理學家的思考方式”,所以“計算思維代表著一種普遍的認識和一類普適的技能,每一個人,不僅僅是計算機科學家,都應熱心於它的學習和運用”。

不過遺憾的是,我們現在還很少有學校開設這樣的課程。所以程序設計課在某種程度上肩負了傳播計算思維的責任。這也是對於不需要使用C語言的學生而言,最大意義之所在。

總之,不管你該不該學C,適不適合學C,既然這門課已經開了,而且有不錯的老師帶領,那麼就好好抓住這個機會吧,別把時間浪費了。也許一個學期之後,你會發現自己在程序設計方面的天賦,進而在這方面努力,最後成為一名受人尊敬的程序員呢。

題外

想要在程序員生涯內有更高的成就的話,最最重要的是儘可能的提升自己的編程能力,並且,與其想著怎麼去提升,不如從現在開始動手動腦,如果對於C/C++感興趣,或者想要提升你的C/C++編程能力,可以關注+私信小編【C/C++編程】有一些視頻希望可以幫助到你,學習不怕從零開始,就怕從不開始。

探究:編程語言那麼多,為什麼偏偏是 C 語言成了大學的必修課?


分享到:


相關文章: