C語言:丹尼斯·里奇的不朽遺產
紀念已故的丹尼斯·里奇--于丹尼斯·里奇紀念日在貝爾實驗室的演講,新澤西梅山,2012年9月7日
今天,我們齊聚此地,只為紀念丹尼斯·里奇,紀念他用軟體為社會做出的深遠貢獻。
「軟體」一詞幾乎人人都有所耳聞,但幾乎沒人真正了解軟體的含義、功用和數量。我在哥倫比亞大學講授計算機科學基礎課時,我問學生這樣一個問題作為開場白:當今世界在役的軟體有多少套?工業界、政府機構、學術界和整個社會使用的所有的軟體系統在內都算上,但相同的系統只算一次。你們認為製造這些軟體系統需要寫多少行源代碼?
不一會兒,幾個學生踴躍舉手說:「100萬行」。接著另一個學生說:「不對,我覺得不止這麼多。大概有1000萬行。」於是我提醒大家,僅僅微軟Windows XP操作系統的代碼量就超過了4500萬行;而我幾年前看過的一篇文章中說,SAP公司開發的商業應用環境代碼量超過了2億5000萬行。
舉過這些大型軟體系統的例子,我總結道:這個問題其實沒人能給出一個準確的答案,但我可以估算一下,世界上運行的軟體代碼總量至少有1萬億行。我的推理如下:假設世界上大約有500萬個程序員,整個業界的平均生產力大約是每年2500至5000行已測試並備份的代碼。因此,每年有數百億行新代碼誕生。由於程序員已經前赴後繼地寫了幾十年軟體,於是容易算出總代碼行數已達數千億行。又由於棄用舊軟體是很難棄用的,所以遺產系統的代碼量只會愈加龐大。
整個社會不但不知道軟體的含義和數量,甚至不了解有哪些偉大的軟體開發者。我做了個試驗:谷歌「Dennis MacAlistair Ritchie」(譯者註:丹尼斯·里奇的全名),得到97000個條目;相比之下,谷歌「Justin Drew Bieber」(譯者註:賈斯汀·比博的全名)得到的條目超過了2000萬個。
對於丹尼斯為社會的貢獻之大、影響之巨,我在此管中窺豹,僅重點講一下他在C語言和Unix操作系統方面的工作。首先讓我們簡要回顧一下這段歷史。20世紀70年代初,丹尼斯發明了C語言,這只是他和肯·湯普森合作開發的Unix操作系統的其中一部分工作。當C編譯器推出後,C語言迅速成為Unix系統上開發軟體的不二之選。
數年之內,C語言發展成了一門通用的編程語言,甚至用於Unix系統之外。比如,微軟的Window系統就是用C實現的。事實上,今天世界上仍有諸多完成關鍵任務的軟體系統是用C編寫的。如果沒有丹尼斯的發明,你打不了電話,開不了飛機,也開不了汽車。C語言是一份不朽遺產。我剛從宇航局現役研究員傑拉德·霍爾茲曼那裡收到的一個便箋,就是這一論斷的最佳例證之一。他說:剛剛登上火星蓋爾隕坑的好奇號漫遊車,它的空中吊車降落桿非常厲害,其控制程序就是由380萬ISO標準C代碼實現的。丹尼斯的發明,花了40年時間,從貝爾實驗室的Unix研發室走到了火星的蓋爾隕坑。
丹尼斯對軟體業的影響力的另一個標誌是:C之後新誕生的大量主要編程語言,要麼派生於C,要麼深受C的影響。
丹尼斯發明C語言之後大約十年,比楊·施特勞斯特魯普加盟貝爾實驗室。他為C語言添加了類和面向對象特性,進而發明了C++語言。我認為,保守來看,今天世界上使用最廣泛的軟體系統,大多要麼是C或C++編寫的,要麼是兩種語言混合編寫而成的。
然而,C++並不是唯一受C影響的編程語言。現今其它的主流語言--C#、Java、JavaScript、Objective-C、PHP等--都明顯脫胎於C。我在此可以大膽的說,今天世界人民使用的幾乎所有重要的軟體系統,要麼是用C編寫的,要麼是用受C影響的語言編寫的。
我要補充一點:我個人對編程語言和編譯器方面科研和教學的興趣是深受丹尼斯影響的。舉個例子,1977年,我和布萊恩·柯尼甘、彼得·溫伯格共同開發了一種數據處理語言,名為Awk。Awk程序就是一組模式-動作的語句序列--模式即為正則表達式和數字的布爾運算組合,動作即類C語句。
更早時候,貝爾實驗室還發明過另外兩種特定領域的語言,使用的都是類似的模式-動作范型:20世紀70年代中期,邁克爾·萊斯克和埃里克·施密特開發出了Lex語言,用於創建文本分析工具以及編譯器前端的語法分析器。幾乎同時,史蒂夫·約翰遜開發出Yacc語言,用於為編譯器和其它語言解釋器創建解析器。Lex和Yacc在指定語義動作方面都用了C語言的語句。幾十年後的今天,這兩款工具語言仍是編譯器課程的支柱。
我在哥大講授的編程語言和編譯器相關課程上,我讓同學們五人一組,自己創新,設計並實現一款全新的編程語言。各組人員都是用Lex和Yacc為他們的語言開發解釋器。由於這樣的工具使得開發編譯器變得容易,學生們可以專註於語言設計方面的創新性工作,以免花時間實現一款沒有編譯工具的語言,這樣的工作相形見絀。
我上學期的編譯器課程誕生了不少更為有趣的語言,舉個例子,有一款語言叫做W2W,用於設計服飾。W2W程序員把她衣櫥里所有服飾信息錄入資料庫,然後寫一段W2W程序描述自己的服飾風格,編譯後的程序可以讀取第二天的天氣預報,然後給出穿衣的建議。本課程之所以能風靡哥大,每學期都能吸引100多名學生上課,是因為課程重點在於語言設計。
課程行將結束時,學生們需要寫一份項目報告,其中有一節名為「經驗教訓」。有一名學生這一節里寫了最為生動形象的一段話:「通過學習這門課,我們意識到了自己以前是多麼的天真幼稚,多麼的過分自信,但同時我們對自己的工作有了新的發現,像C這樣的編程語言中,我們多年來不予重視的東西,現在也能做到較好的把控。」
下面我們把目光轉向操作系統。由丹尼斯·里奇和肯·湯普森共同開發的Unix系統在操作系統領域的影響力,不亞於C語言之於編程語言領域。1972年6月,媒體引述丹尼斯和肯的原話如下:「...Unix的裝機量已有10台,以後應該會更多。」今天,世界上Unix的使用量已達數億,Unix已成為一個年產值數十億美元的產業。如今人們使用的非微軟操作系統主要包括谷歌的Android、蘋果的OS X以及無數版本的Linux和BSD系統,所有這些操作系統多多少少都含有Unix內核。平心而論,沒有從丹尼斯和肯的原生Unix派生出的這些操作系統,就沒有今天全球信息網路的基礎架構。
人們或許會問,為什麼Unix和C的影響力會如此之大?原因並不是當年沒有可以匹敵的操作系統或編程語言。實際上,20世紀60年代,肯參與了貝爾實驗室、通用電氣和麻省理工學院合作開發的Multics操作系統,此項目被中途叫停,結果肯在1969年開發了Unix的第一版。同樣,C語言在茁壯成長之際,國防部發布了一個重要計劃,要開發一款名為Ada的通用編程語言供其軟體開發人員使用。Ada著實火了一陣子,儘管今天仍有用武之地,但最終並未像C一樣落地生根,無處不在。
究竟為什麼Unix和C會如此成功?對於這個問題已經做了很多研究。我認為原因很多,其中重要一點是貝爾實驗室有著開明的管理風格,使得科學家們能夠從事長期的科研工作,並不干涉任何細節。另外還有一點我認為是最重要的,沒有之一,即丹尼斯和肯對軟體有著優秀的品位。當軟體業的人們初遇Unix和C,或初次閱讀相關文檔,他們會體會到一種「啊哈」的感覺,他們會說「是啊,操作系統和系統編程語言就應該如此啊!」而且由於Unix和C最初的實現版本很小,很容易發布,人們便立即開始使用,還要教他們的同事和學生使用。第三點是,Unix系統是經過Unix研發室的千錘百鍊之後方初問世,而這個研發室里有那麼一小撮超級天才研究員與丹尼斯和肯共事,他們各抒己見,群策群力,最重要的是,他們在Unix的開發過程中一直在使用Unix開發軟體。
Unix和C的成功普及,打擊了其它系統的研究者,也招來一些嫉恨,這不足為怪。1989年,理查德·加布里埃爾寫了一篇文章,題目用了矛盾修辭,《最差即最佳》,文中闡釋了為什麼著重簡單靈活的Unix/C方法在市場上壓倒了著重一致完整的MIT方法。加布里埃爾的矛盾修辭「最差即最佳」有時也稱為「新澤西風格」。在新澤西,我們更願意這麼說:「短小即美好」。
1967年我初入貝爾實驗室之時,在我工作的第一周,哈明碼的發明人理查德·哈明就走進我的辦公室說:「艾爾,你不僅要做好工作,還要教會別人怎麼利用你的工作成果,這樣你才能成為偉大的科學家。」所以,我認為Unix和C成功的另一個關鍵原因就是,項目早期就備齊了優秀的教程和文檔。在道格·麥基羅伊的堅持下,早期的Unix系統就有在線教程,使得系統更加易學易用。
之後就有了K&R教程。丹尼斯不僅富於創意的軟體開發人員,更是一個頂級技術作家,他可以把複雜的軟體思想對初學者解釋得簡潔、清晰,且往往具有說服力。我認為,他與柯尼甘合著的《C程序設計語言》不僅是編程語言方面的最佳教科書,也是宏觀上編程思想的最佳教科書。業內眾所周知,這本書簡稱K&R教程。這本不到300頁的小冊子不僅給出了C語言的初始定義,而且教給初學者如何編寫優雅而實用的C程序。
我之前提到了,我教授編程語言和編譯器相關的課程時,亦從K&R教程獲益匪淺。作為這門課的語言實現部分,我要求每組學生在開始實現所設計的語言之前,先參考K&R教程第一章寫一份語言教程,然後按照K&R教程附錄A的模式再寫一份語言參考手冊。
丹尼斯和肯憑藉他們對編程語言和操作系統做出的深遠貢獻,獲得了計算機科學家所能得到的最高榮譽。1983年,他們二位榮獲ACM圖靈獎,這是計算機科學界技術成就的最高獎項。1990年,當時的總統比爾·柯林頓向他們頒發了國家科技獎章;2011年,他們又獲得了日本信息與通信技術獎。
我問一位哥大同事:你能否想到計算機科學界有哪個新的發展方向對計算技術能夠產生像Unix和C一樣的影響?他說想不出來,他能想到的影響力能夠與之媲美的新事物是:彗星撞地球。
我想再說幾句關於丹尼斯個人的事,作為這篇紀念辭的結束。我覺得丹尼斯是個很內斂、很謙虛的人。但是每當我跟他交談時,他總是讓人如沐春風:博愛,舉止優雅,專註於自己的興趣所在。
2000年,貝爾實驗室在中國北京開了一家研究室,我和丹尼斯踏上了在幾所中國大學的巡迴演講之旅。在北京大學,丹尼斯做了關於Unix和C的演講,面對座無虛席、熱情洋溢的學生,他享受到了搖滾明星一般的待遇。演講最後,一名學生可能是熱情過度了,他問丹尼斯:很久以前,您開發了Unix和C,但此後您又做了什麼呢?丹尼斯的回答確實毫無怨言:你明白,這是我第一次遇到這樣的問題,我會好好考慮答案的。
丹尼斯並不拒絕強硬而直白的表達自己的觀點。1994年,一本題為《Unix黑實用手冊》的書寫就,此書對加布里埃爾「最差即最佳」的哲學做了尖銳批評。丹尼斯於是為這本書寫了一篇反諷前言,結果也被收入到本書的結語部分。
丹尼斯的結語最後是這樣寫的:我做這麼個比喻:你這本書涼拌著很多真知灼見和縝密思考,就像夾雜著未消化營養物的大便,足以養活一些寄生蟲。但它並不是可口的餡餅,因為它散發著鄙視和嫉妒的臭味。祝你有個好胃口!
丹尼斯還有一種冷幽默感,令人拍案叫絕。有一次有人問他:一個程序員從新手成長為精通C語言的開發者,並能寫出不凡的成品代碼,據您的經驗需要多長時間?
丹尼斯答道:我不知道,因為我不需要學C語言。
對於軟體世界,丹尼斯是個天才;對於那些有幸結識他的人,丹尼斯是個君子。
丹尼斯,我們懷念你!
原文鏈接
C, the Enduring Legacy of Dennis Ritchie
作者簡介
艾爾弗雷德·阿霍
哥倫比亞大學 計算機科學系 勞倫斯·古斯曼講席教授
《編譯原理》龍書第一作者
譯者
@愛倫坡
推薦閱讀: