爲什麼是C語言?


對的,開門見山的說,我就是要向你推銷C語言!我是C語言推銷者,麥辣!

我知道你可能是一個Web開發者,整天只與SQL,CSS,HTML和Javascript打交道,或者你可能一直幸福地沉浸在Java的甜蜜世界,每天品嚐着各種設計模式的蜜糖。但是我還是想搖醒你,喂,醒醒,C語言來了!


Dennis Ritchie

"什麼?C語言?你說的是那個上個世紀70年代初,由Dennis M. Ritchie發明的那種老古董語言嗎?省省吧老哥,這個老古董級的系統編程語言,你還來推銷個啥呀?洗洗睡吧!"我估計被我搖醒的人,有90%可能會這麼回答我。是的,這對於我的確是一種打擊。但是我的目標是要做最偉大的C語言推銷員,我不會被這點困難嚇倒的。

是的,老弟,C語言來了,該醒醒了。確切地說,是C語言又回來了。我知道你上大學的時候可能上過C語言的課程,使用的是“經典”的譚浩強的教材(有些同學可能就跨過C直接上C++了)。我知道你學的時候就覺得這種語言一點都不美,也不fashion,頂頂枯燥。是這樣嗎?然後,從你畢業以後就一直在作很fashion的web 開發,用的是Java或PHP,以及SQL,CSS,Javascript等等這些很時尚的語言,至於C這個東西,在你印象中,它要麼屬於實驗室,要麼屬於那些埋頭苦幹的、呆頭呆腦的系統程序員。對嗎?

OK,就是這樣想的,我知道了。如果你做開發只是想搞一些很潮的程序玩一玩,那麼你確實不是我的銷售對象,現在就可以走開了。而如果你立志於做一位professional的程序設計者,那麼就依然是我的目標,請你別走開,精彩繼續。我相信我可以打動你。

其實,關於C語言的話題,已經有很多名家大俠都提到過了。比如Joel Spolsky的一篇《學校只教Java的危險性》就談到了這個問題。同時,TIOBE編程語言排行榜上,C已經重回榜首(筆者第一次作此文時,C還在第三名)。這些都是其他人的觀點,我不予置評(其實我很贊成Joel的觀點)。我今天,就想用我自己的觀點來打動你。開始:

是的,C很古老,但是這一點都不妨礙你需要他。讓我用武林的道理來打個比方。

凡是對武林有所瞭解的人都知道,中國的習武者,在習武之初都會練習蹲馬步。絕對沒有人會喜歡蹲馬步,會說它真有趣。但是,想要成爲職業武者的你,絕對繞不過這一關。電影少林寺裏,覺遠和尚在被師傅傳授真正的武功之前,一直跟隨師兄弟一起挑水做飯達一年之久。挑水做飯看似粗俗,其實是絕好的基本功訓練,力量基礎、身體協調性、平衡能力、體力。這些基本功完了之後,就是拳腳功夫的練習。然而,不論是鏢局裏的鏢師,山寨裏的土匪還是武林盟主,他們在現實搏擊中幾乎總是會使用一種兵刃,拳腳相搏倒是少數。這就造成了一種假象,似乎我只要精煉一種稱手的兵器就可以了。是嗎?

有點武學常識的人都會回答“不”。那些剛纔回答“是”的,你可以下課回家了。一定還有人可能會疑惑或反駁:“麥辣你別忽悠了,你不就是說要練好基本功嘛?這個我們都懂,但是憑啥基本功就非C不可呢?”。哈,非常感謝你,你已經在替我做廣告了。是的,在理論上來講不是非C不可,我不能這麼武斷地下結論,但是我可以告訴你,C是一個非常難得的、天然就可以用於這個目的的絕佳語言,它具備了其他語言所沒有的優勢,這個道理就像是“金銀天然是貨幣”一樣。讓我們仔細地掰扯掰扯。

圖靈

馮諾依曼

在當代程序設計領域,絕大多數主流的程序設計師是工作在馮.諾依曼體系結構的計算機上的。這個體系是對圖靈機理論的一個很完美的實現。請允許我在這裏對圖靈和馮兩位大師膜拜一次。在這個體系中,系統的基本層次是:硬件、固件、系統軟件(含OS)、應用軟件。從編程角度而言,可以認爲是機器語言、彙編語言、C語言(中級)、高級語言(Java,   C++, C#,  Perl,  Python…)。那麼,我推銷C語言的理由是:

第一、C語言,根據我個人的觀點,是純軟件層的最後一層皮膚,它仍舊同時保持着程序設計的邏輯性和藝術性(美感)。從C語言再往下到達彙編層以後,邏輯性仍在,然而藝術性已經大大地折損了,你不得不面對“寄存器”這樣的硬邦邦、冷冰冰的東西,你不得不稱呼的你代碼爲“指令”。在這時,邏輯性的東西逐漸被大量的物理性的東東所浸泡住。從彙編返回來,你就會突然發現,原來C語言是這麼的優美、簡潔,竟然能夠同時保持了邏輯性和藝術性。譯器用最少的魔術,保留了最多的系統層本質性的東西。讓你在能夠窺探系統本質結構的同時,避免接觸大量過於瑣碎的物理元素。你需要知道內存這回事,但是不需要有芯片的意識,你只要知道“結構體”、“地址”和“字節”就可以了。你需要實施選擇和循環控制,你只要認識if和while這樣的英文就可以了,不需要理解“jump”這樣生硬的概念。練習編程基本功,一定要對計算機系統結構有準確、深刻的理解。在這一點上,C語言提供了藝術性的支撐,不多、不少,非常地恰到好處,至少我認爲還沒有其他語言可以做到。C通過這樣的抽象,既展示了足夠多的系統結構,又掩蓋了足夠多的瑣碎細節,並且封裝了各個平臺的差異。後來者,像C++,Java,C#這樣的語言則掩蓋了更多的系統結構,提供了更多的語法糖,至少,像“對象(object)”這樣的東西就是純粹的語法糖。它本身是好東西,但是你不能眼裏只有這種糖而不知其背後的機制。總而言之,C語言能夠使軟件設計師恰到好處地以藝術地眼光,充分地感受系統層面的本質概念和原理,這是軟件設計師基本功的必備要素。如果你打算和我爭論“軟件設計師是否一定要懂得系統結構”這樣的話題,就稍稍跑題了,甚至我們已經出現了觀念上的分歧了,就此打住吧。作爲一個職業程序員,你應該有足夠的勇氣打開蓋子,看看到底盒子裏有什麼,有些什麼under the hood。

第二、C語言,部分地由於第一個原因,它提供了足夠的思維訓練給程序員。包括變量類型,字符串的處理,數據結構的操控,流程的操控,還有大名鼎鼎的、讓人又愛又恨的指針操控。Joel也說過,C語言非常適合用於甄別程序員的水平,我想這是非常有道理的。特別是對於C中指針的操控,更是必備的硬功夫。沒有指針的語言,是不適合作這樣的事情的。那些語言也是好的語言,但是對於訓練基本功是不合格的。它們會讓你三下兩下就弄好了一個鏈表,而你都還不知道是怎麼回事。我一直認爲,結構體和指針,是C語言最精華的部分。它們不僅抽象地地表達了馮諾依曼體系的本質,也投射出圖靈機的本質。對編程者而言,是最好的思維訓練。可以不誇張地講,C語言就是程序員的“腰馬功夫”。有人說C++也可以,是的C++當然可以,因爲它是C的超集,但是C++對於基本功訓練,過分複雜了。

第三、C語言,據我看是目前各主流平臺上、主流軟件的第一位的支撐性語言。你所使用的軟件,要麼是C語言直接寫成,要麼是運行在C開發的操作系統或虛擬機上,要麼是藉助於大量默默工作在底層的C寫成的各種庫。有人說,“No,我不用C這麼低級的語言,我用C++,我OO啦”。聽着那麼像阿貴的語氣呢。那好,阿貴,我問你,主流C++編譯器是什麼寫的?一個具備了這麼重要地位的關鍵性支撐語言,你可以忽視它嗎?當你在C語言中有了足夠的浸泡經歷之後,你會發現這世界其實沒那麼複雜。那些日復一日變化的、層出不窮的新技術,其實,都只是在馮諾依曼機器上開出的另一朵帶有迷惑性的花兒而已,根還在你手裏。你不再有疑惑,而只是輕輕一笑。

好了,我推銷C語言的主要理由說完了。有人還是會反駁,比如說“我只要精通我開發用的語言就可以了”。呵呵,這句話在我聽來,就好像是說“嘿,我只要練好雙節棍就可以了,蹲馬步就省了吧,因爲我是棍不離身的。還有,李小龍就是用雙節棍的嘛,多厲害啊”。是的,李小龍大師確實是用雙節棍地,但是葉問要求李大師蹲馬步的時候你看到了嗎?還有,你以爲雙截棍耍的次數多了就可以精通了嗎?熟練和精通是兩回事,耍的漂亮和熟練,頂多算是街舞,那是周杰倫不是李小龍。這不是功夫。有些功夫大師,一生中不曾練習過多少兵刃,但是每一樣兵刃拿起來都可以瞬間制勝,即使沒有兵刃,他徒手可以開碑斷石。這纔是功夫,因爲他已經掌握了功夫的奧祕,他自己身體的奧祕,形式不再重要,至少我這麼認爲。就算我將來使用的武器是激光槍,我也還是會紮紮實實地練好拳腳功夫,除非有一天我可以用意念來搏擊了。

微軟的一位招聘負責人被記者問到爲什麼應聘微軟的開發人員都要面試C語言試題時,他說“我們認爲C語言是開發人員的基本功,實際工作未必時時處處用到,但是你必須過這一關我們才認爲你是一個合格的微軟開發者”。我想,這句話應該夠分量。

最後,我之所以志願成爲C語言的推銷者,並非爲了經濟利益和忽悠人,沒人會爲了這件事情給我酬勞,包括Dennis大師。我用這個來忽悠你也一點意思沒有。很簡單,我自己基於C的編程經歷,感覺到自己從C的身上吸取了太多的營養而非常信服、非常驚訝於世間有這麼優秀的語言,同時又看到那麼多後來人被各種煙幕彈所迷惑而視C爲無物,並深陷於其他語言其中甜蜜無比的樣子感到深深的惋惜。

其實,我根本就是一個不合格的推銷者,因爲我壓根兒就沒想推銷,我只是想推醒你,然後把C分享給你。

唉,兄弟/姐妹,醒醒啦!C來了。

注:本文與編程語言優劣話題完全無關

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章