C, Dennis Ritchie的不朽遺產

白龍發表於2012-10-08

Dennis Ritchie悼辭
貝爾實驗室,Dennis Ritchie日
新澤西默裡山,2012-9-7

今天,我們聚集於此,悼念Dennis Ritchie,緬懷他在軟體方面開創的深遠貢獻。

幾乎所有人都聽說過“軟體”一詞,但只有少數人知道軟體是什麼,如何工作,世上有多少軟體。在哥倫比亞大學的電腦科學入門課程上,我用這樣一個問題作為開場白:今天世上有多少軟體在服役?要充分考慮到各方面的軟體系統,包括工業,政府,學術,社會,不要重複計算了。你們認為創造所有這些系統需要寫多少行程式碼?

過了一會兒,一些勇敢的學生舉起手說“一百萬”。又有其他學生說“不,我想應該更多一點,大概一千萬”。接著我會提到,光微軟的windows xp作業系統就有四千五百萬行原始碼,我看到的文章說幾年前SAP的商業應用程式環境的程式碼估計已經超過了二億五千萬行。

舉了幾個大型軟體系統的例子後,我最終會說沒人會知道這個問題的確切答案,但可以估算出目前世界上在執行的程式碼至少有一萬億行。我的理由如下:假定世界上大概有五百萬程式設計師,具有職業水準的程式設計師的平均產出是--每年大約有2500到5000行經過測試,具有文件的程式碼。這樣看的話,每年會產出幾十億行新程式碼。程式設計師們已經寫了幾十年的軟體,很容易得出總共會有成千上萬億行程式碼。丟棄舊有軟體是非常困難的,這樣遺留的程式碼數量會越來越龐大。

不過軟體的社會影響力遠不如它應得的,偉大的軟體創造者的社會影響力就更遠遠不如了。可以做個小實驗,google名字“Dennis MacAlistair Ritchie”得到97000個結果,作為對比,“Justin Drew Bieber” google得到的結果卻有兩千萬。

為了瞭解Dennis的貢獻對社會的巨大影響,可以先看看他在C和Unix上的工作。首先我們先追述一下歷史,C語言是Dennis在70年代早期建立的,是他和Ken Thompson在開發Unix作業系統時的一部分工作成果。當C編譯器可用之後,C就迅速地成為Unix上開發軟體的首選語言。

短短几年內,C成了開發的通用語言,甚至在Unix作業系統之外也是如此。比如,微軟的Windows作業系統也是用C語言實現。事實上,現今世上許多緊要關鍵的軟體系統都是用C寫的。沒有Dennis的發明,你現在打不了電話,坐不了飛機,開不了車。我收到來自於工作在NASA的Gerard Holzmann的筆記,其中的內容可作為C的偉大之處的顯著證明。Gerard說:剛剛著陸在蓋爾隕石坑的NASA好奇號火星車,有著令人驚歎的空中起重機下降操縱系統,它是由380000行ISO標準C控制的。Dennis的發明走出了貝爾實驗室的Unix工作室,來到了火星的蓋爾隕石坑,這期間過了40年。

另一個衡量Dennis在軟體方面的影響力可以參看在C語言之後,有多少種重要的新程式語言是直接繼承C或者受到了C的強烈影響。大約在Dennis發明C十年後,Bjarne Stoustrup加入了貝爾實驗室,並在C語言中加入了物件導向和類,從而建立了C++。我想可以很確定的說大多數的軟體系統中有很多都是用C或C++寫的,或者說是同時使用了這兩者。

但C++並不是唯一一個受到C影響的程式語言。其他今天非常流行的計算機語言--C#、Java、Javascript、Object-C、PHP,它們都是脫胎於C。事實上,我可以大膽的說,現今世上幾乎所有人們用的主要軟體系統都是用C或受C影響的語言寫的。

從個人經歷來說,我在程式語言及編譯器的研究及教學興趣受到了Dennis的重要影響。舉個例子,1977年Brian KernighanPeter Weinberger和我開發了一種名為Awk的資料解析語言。Awk程式是一系列模式-動作語句組成。模式是正規表示式和數字的布林組合,動作是C風格的語句。

另外兩種領域專用語言在貝爾實驗室的更早些時候就建立出來了,它們有著相同的模式-動作正規化。在70年代中期,Michael LeskEric Schmidt開發了Lex語言,用來建立文字解析工具及編譯器的詞法分析前端。與此同時,Steve Johnson設計了Yacc語言,用來建立編譯器的語法分析器及其他語言的翻譯工具。Lex和Yacc都用了C風格的語句來描述動作語義,甚至之後幾十年這兩個工具依然是現代編譯器課程的主要內容。

我在哥倫比亞大學計算機語言及編譯器課程中,讓學生五人一組,每組都要設計和實現一個具有創造性的新語言。這些小組用Lex和Yacc來生成他們的語言直譯器。因為使用這兩個工具來生成一個可工作的編譯器非常簡單,學生們可以把精力用來進行語言的創新性設計,而不是甩開工具花費大量時間去實現一個毫無新意的語言。

舉個例子,上個學期這個編譯器課程上出現了一門很有趣的語言,叫做W2W,就是穿什麼(what to wear)。W2W使用者要到根據衣櫥服裝生成的資料庫中找衣服。她要寫段W2W程式來描述她的穿衣風格。W2W程式編譯好後執行時讀取第二天的天氣預報,給出整套服裝的建議 。由於專注在語言的設計層面,這門課在哥倫比亞很受歡迎,每學期都會有100多名學生來上課。

在期末的時候,學生需要寫專案報告,其中要包含"經驗教訓"這個章節。這個章節中最好的評述之一來自一位學生,他寫下“在這門課程中,我們意識到自己的幼稚和自大,多年來對C語言有想當然的誤解,深入類C語言的經歷讓我們認識到其中蘊含的價值,上此課真是個正確的決定。”

再說說作業系統。Unix系統是Dennis Ritchie和Ken Thompson一起編寫的,它在作業系統中的影響力不亞於C語言在計算機語言社群中的影響力。引用1972年6月Dennis和Ken所說“...Unix的裝機量達到10了,預期會更多。”今天有數以億計的Unix系統在世界上工作,Unix也是每年數十億美元的工業。今天用的主要非微軟作業系統有Google的Android,Apple的OS X,無數版本的Linux和BSD,某種意義上說它們本質上都是Unix。公平的說,今天的全球資訊網路基礎設施,離開那些繼承了Dennis和Ken發明的原始Unix的作業系統是不能運轉的。

有人可能會問為什麼Unix和C有著這麼大的影響力。這不是因為同時期沒有與他們競爭的作業系統和計算機語言。事實上,Ken在被要求停止Multics作業系統(貝爾實驗室,通用電氣,麻省理工聯合開發)上的工作後,才在1969年寫出了Unix第一版。那時C剛開始成長,美國國防部開始主持設計一門通用性的計算機語言ADA,適用於所有的軟體開發者。ADA只火了一陣子,現在只是苟延殘喘,遠不能與C的通用性或者說廣泛性相比。

那到底為何Unix和C這麼成功?這個問題已經有很多研究,我想它們成功的理由有不少。一個很重要的理由就是Bell實驗室研究院的開明管理風格,它讓科學家們投身於有前景的長期研究中,很少進行細枝末節的管控。另一個理由,個人覺得是最重要的一個,就是Dennis和Ken卓越的軟體品位。當搞軟體的第一次碰到或者讀到Unix和C時,他們會有會心的感覺--“耶,作業系統就該這樣子,系統級程式語言還能是別的樣子麼。”自從第一個小巧的實現可用後,他們迅速開始使用Unix和C,同時教同事和學生使用。第三個理由,Unix誕生於Unix工作室,那兒有一小群天才研究者與Dennis和Ken一起工作,他們貢獻了很多創意和批評意見,重要的是用Unix系統本身去開發軟體。

所以Unix和C的成功讓其他系統的研究者感到沮喪和嫉妒也就不奇怪了。1989年Richard Gabriel寫了一篇有著矛盾修辭題目的文章”壞就是好“,來解釋為什麼強調簡單和彈性設計的Unix/C在市場上勝過了強調一致和完整性設計的MIT。Gabriel的”壞就是好“的說明有時稱為”新澤西風格“。在新澤西,我們更願意說”小即美妙“。

當我在1967年首次加入貝爾實驗室時,Richard Hamming,海明碼的發明者,在第一個星期就來到我的辦公室,跟我說”阿爾,要想成為偉大的科學家,不僅要做出好的成果,還要教會其他人用你的成果。“我想早期的優質可用的指南和手冊也是Unix和C成功的關鍵理由。在Doug McIlroy的堅持下,早期的Unix系統擁有的線上手冊讓Unix很容易學習和使用。

接下來說說K&R。在頂尖的創造性軟體開發者當中,Dennis是個優秀的科技作家,他能夠將複雜的軟體概念以簡單清晰,生動的方式呈現給初學者。他和Brian Kernighan合著的書”The C Programming Language“,我覺得不僅是學習程式語言也是學習程式設計的最好教科書。此書常簡稱為K&R。除了初步定義了C語言,它還教授初學者如何編寫優雅可用的C程式,做到這些僅僅用了不到300頁的篇幅。

我前面提到的程式語言及編譯器課程也大大受益於K&R。作為語言實現成果的一部分,我要求每個小組的學生寫一篇基於K&R第一章的指南,參照附錄A寫語言的參考手冊。一旦我堅持讓各小組在實現他們的語言之前先寫指南和語言參考手冊,就沒有小組會在期末時交不出一個可用的編譯器。

Dennis和Ken在程式語言和作業系統的深遠貢獻讓他們獲得了電腦科學的最高榮譽。1983年,Dennis和Ken贏得了ACM圖靈獎,這是電腦科學的技術成就方面的最具聲望的獎項。1998年,他們獲得了美國總統克林頓授予的國家技術獎章,2011年獲得資訊與通訊技術日本國際獎

我向哥倫比亞大學的一個教員同事問過有沒有一種計算機新科學發展的潛在影響力在計算機領域能夠與Unix/C媲美,他說沒有,唯一能想到的能有如此廣泛的影響力的新事件就是彗星撞地球。

我很榮幸為Dennis說上幾句來獻上我的敬意。我發覺Dennis是個非常內向,謙遜的人。但只要跟他談論起來,他的體貼,廣泛的興趣,親切的舉止會深深吸引你。

當2000年貝爾實驗室在北京創立新研究實驗室時,Dennis和我到幾所中國高校進行講演。在北京大學,Dennis做了Unix和C的演說,熱情的學生觀眾擠破了教室,就像是來看搖滾巨星演出。講演末尾,一個激動不已的學生問Dennis:您發明了Unix和C是很久以前的事情了,請問在那以後您還做出什麼成果嗎?Dennis毫不介意的回答:知道麼,這是我第一次被問這個問題,我得考慮下這個問題的答案。

Dennis表達自己的見解時直言無忌。1994年有人寫了“Unix痛恨者手冊”,斥責了Gabriel的“壞就是好”哲學。Dennis為此書寫了反擊序言,結果真的被收錄在這本書中。

Dennis的反擊序言是這樣結尾的“這是我的比喻:你們的書涼拌著各色合理見解。就像大便一樣,這裡都是些未消化的殘餘,供養那些以此為生的生物。它不是可口的甜餅:它散發著傲慢與嫉妒的惡臭。祝你們好胃口!”

Dennis還有著絕妙的諷刺幽默感。有一次他被問到:以你的經驗,程式設計新手需要花多長時間才能真正成為熟練的C開發者並能寫出重要的產品程式碼?

Dennis回答:我不知道。我從沒去學過C。

對軟體世界來說,Dennis就是天才。對有幸能夠了解他的人,他是一個受人尊敬的智者。

Dennis,我們永遠懷念你。

Alfred V.Aho
Lawrence Gussman講席教授
電腦科學系
哥倫比亞大學

原文見 http://www.cs.columbia.edu/~aho/Talks/12-09-07_DMR.pdf

相關文章