C語言:丹尼斯·裡奇的不朽遺產

愛倫坡發表於2012-10-08

紀念已故的丹尼斯·裡奇--于丹尼斯·裡奇(Dennis M. Ritchie)紀念日在貝爾實驗室的演講,新澤西梅山,2012年9月7日

今天,我們齊聚此地,只為紀念丹尼斯·裡奇,紀念他用軟體為社會做出的深遠貢獻。

“軟體”一詞幾乎人人都有所耳聞,但幾乎沒人真正瞭解軟體的含義、功用和數量。我在哥倫比亞大學講授電腦科學基礎課時,我問學生這樣一個問題作為開場白:當今世界在役的軟體有多少套?工業界、政府機構、學術界和整個社會使用的所有的軟體系統在內都算上,但相同的系統只算一次。你們認為製造這些軟體系統需要寫多少行原始碼?

不一會兒,有個勇敢的學生舉手說:“100萬行”。接著另一個學生說:“不對,我覺得不止這個數;大概有1000萬行。”於是我提醒大家,僅僅微軟Windows XP作業系統的程式碼量就超過了4500萬行;而據我幾年前看過的一篇文章估計,SAP公司開發的商業應用環境程式碼量超過了2億5000萬行。

我又舉了幾個大型軟體系統的例子,最後總結道:這個問題其實沒人能給出一個準確的答案,但我可以估算一下,世界上執行的軟體程式碼總量至少有1萬億行。我的推理如下:假設世界上大約有500萬個程式設計師,整個業界的平均生產力大約是每年2500至5000行已測試並存檔的程式碼。因此,每年有數百億行新程式碼誕生。由於程式設計師們已經前赴後繼地寫了幾十年軟體,於是容易算出總程式碼行數已達數千億行。又由於舊軟體是很難棄用的,所以遺產系統的程式碼量只會愈加龐大。

整個社會不但不知道軟體的含義和數量,甚至不瞭解有哪些偉大的軟體開發者。我做了個試驗:Google一下“Dennis MacAlistair Ritchie”(譯者注:丹尼斯·裡奇的全名),得到97000個條目;相比之下,Google一下“Justin Drew Bieber”(譯者注:賈斯汀·比博的全名)得到的條目則超過了2000萬個。

關於丹尼斯為社會的貢獻之大、影響之巨,我在此管中窺豹,僅重點講一下他在C語言和Unix作業系統方面的工作。首先讓我們簡要回顧一下這段歷史。20世紀70年代初,丹尼斯發明了C語言,這只是他和肯·湯普森(Ken Thompson)合作開發的Unix作業系統的其中一部分工作。當C編譯器推出後,C語言迅速成為Unix系統上開發軟體的不二之選。

數年之內,C語言發展成了一門通用的程式語言,甚至用於Unix系統之外。比如,微軟的Windows系統就是用C實現的。事實上,今天世界上仍有諸多完成關鍵任務的軟體系統是用C編寫的。今天倘若沒有丹尼斯的發明,你就打不了電話,坐不了飛機,開不了汽車。C語言是一份不朽遺產。我剛從宇航局現役研究員傑拉德·霍爾茲曼(Gerard Holzmann)那裡收到的一個便箋,對這一點給出了最好的例證。他說:剛剛登上火星蓋爾隕坑(Gale Crater)的好奇號漫遊車(Curiosity Rover),它的空中吊車降落杆非常厲害,其控制程式就是由380萬行ISO標準C程式碼實現的。丹尼斯的發明,花了40年時間,從貝爾實驗室的Unix研發室走到了火星的蓋爾隕坑。

丹尼斯對軟體業的影響力的另一個標誌是:C之後新誕生的大量主要程式語言,要麼派生於C,要麼深受C的影響。

丹尼斯發明C語言之後大約十年,比楊·施特勞斯特魯普(Bjarne Stroustrup)加盟貝爾實驗室。他為C語言新增了類和麵向物件特性,發明了C++語言。現在這個世界上有很多使用最廣泛的軟體系統,要麼是C或C++編寫的,要麼是兩種語言混合編寫而成的,我這麼說應該不會錯。

然而,C++並不是唯一受C影響的程式語言。現今其它的主流語言--C#、Java、JavaScript、Objective-C、PHP等--都明顯脫胎於C。我在此可以大膽的說,今天世界人民使用的幾乎所有重要的軟體系統,要麼是用C編寫的,要麼是用受C影響的語言編寫的。

我要補充一點:我個人對程式語言和編譯器領域的教研興趣是深受丹尼斯影響的。舉個例子,1977年,我和布萊恩·柯尼甘(Brian Kernighan)、彼得·溫伯格(Peter Weinberger)共同開發了一種資料處理語言,名為Awk。Awk程式就是一組模式-動作的語句序列--模式即為正規表示式和數字的布林運算組合,動作即類C語句。

更早時候,貝爾實驗室還發明過另外兩種特定領域的語言,使用的都是類似的模式-動作範型(Pattern-Action Paradigm):20世紀70年代中期,邁克爾·萊斯克(Michael Lesk)和埃裡克·施密特(Eric Schmidt)開發出了Lex語言,用於建立文字分析工具以及編譯器前端的語法分析器。幾乎同時,史蒂夫·約翰遜(Steve Johnson)開發出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年,理查德·加布裡埃爾(Richard Gabriel)寫了一篇文章,題目用了矛盾修辭,《最差即最佳》,文中闡釋了為什麼著重簡單靈活的Unix/C方法在市場上壓倒了著重一致完整的MIT方法。加布裡埃爾的矛盾修辭“最差即最佳”有時也稱為“新澤西風格”。在新澤西,我們更願意這麼說:“短小即美好”。

1967年我初入貝爾實驗室之時,在我工作的第一週,哈明碼的發明人理查德·哈明(Richard Hamming)就走進我的辦公室說:“艾爾,你不僅要做好工作,還要教會別人怎麼利用你的工作成果,這樣你才能成為偉大的科學家。”所以,我認為Unix和C成功的另一個關鍵原因就是,專案早期就備齊了優秀的教程和文件。在道格·麥基羅伊(Doug McIloy)的堅持下,早期的Unix系統就有線上教程,使得系統更加易學易用。

之後就有了K&R教程。丹尼斯不僅是富於創意的軟體開發人員,更是一個頂級的技術作家,他可以把複雜的軟體思想對初學者解釋得簡潔、清晰,且往往具有說服力。我認為,他與柯尼甘合著的《C程式設計語言》,無論在程式語言方面,還是在巨集觀程式設計思想方面,都是最佳教科書。業內眾所周知,此書簡稱K&R教程。一本不到300頁的小冊子,不僅給出了C語言的初始定義,而且教給初學者如何編寫優雅而實用的C程式。

我之前提到了,我教授程式語言和編譯器相關的課程時,亦從K&R教程獲益匪淺。作為這門課的語言實現部分,我要求每組學生在開始實現所設計的語言之前,先參考K&R教程第一章寫一份語言教程,然後按照K&R教程附錄A的模式再寫一份語言參考手冊。

丹尼斯和肯憑藉他們對程式語言和作業系統做出的深遠貢獻,獲得了電腦科學家所能得到的最高榮譽。1983年,他們二位榮獲ACM圖靈獎,這是電腦科學界技術成就的最高獎項。1990年,當時的總統比爾·克林頓(Bill Clinton)向他們頒發了國家科技獎章;2011年,他們又獲得了日本資訊與通訊技術獎。

我問一位哥大同事:你能否想到電腦科學界有哪個新的發展方向對計算技術能夠產生像Unix和C一樣的影響?他說想不出來,他能想到的影響力能夠與之媲美的新事物是:彗星撞地球。

我想再說幾句關於丹尼斯個人的事,作為這篇紀念辭的結束。我覺得丹尼斯是個很內斂、很謙虛的人。但是每當我跟他交談時,他總是讓人如沐春風:博愛,舉止優雅,專注於自己的興趣所在。

2000年,貝爾實驗室在中國北京開了一家研究室,我和丹尼斯踏上了在幾所中國大學的巡迴演講之旅。在北京大學,丹尼斯做了關於Unix和C的演講。全場座無虛席,熱情洋溢的學生們讓他享受到搖滾明星一般的待遇。演講尾聲,一名學生可能是熱情過度了,他問丹尼斯:很久以前,您開發了Unix和C,但此後您又做了什麼呢?丹尼斯的回答確實毫無怨言:你明白,這是我第一次遇到這樣的問題,我會好好考慮答案的。

丹尼斯並不拒絕強硬而直白的表達自己的觀點。1994年,一本題為《Unix黑實用手冊》(Unix Hater's Handbook)的書寫就,此書對加布裡埃爾“最差即最佳”的哲學做了尖銳批評。丹尼斯於是為這本書寫了一篇反諷前言,結果也被收入到本書的結語部分。

丹尼斯的結語最後是這樣寫的:我做這麼個比喻:你這本書涼拌著很多真知灼見和縝密思考,就像夾雜著未消化營養物的大便,足以養活一些寄生蟲。但它並不是可口的餡餅,因為它散發著鄙視和嫉妒的臭味。祝你有個好胃口!

丹尼斯還有一種冷幽默感,令人拍案叫絕。有一次有人問他:一個程式設計師從新手成長為精通C語言的開發者,並能寫出卓爾不凡的成品程式碼,據您的經驗需要多長時間?

丹尼斯答道:我不知道,我又不需要學C!

丹尼斯之於軟體世界,是個曠世奇才;之於有幸結識他的人們,則是個謙謙君子。

丹尼斯,我們懷念你!

原文連結

C, the Enduring Legacy of Dennis Ritchie

作者簡介

艾爾弗雷德·阿霍(Alfred Aho

哥倫比亞大學 電腦科學系 勞倫斯·古斯曼講席教授

《編譯原理》龍書第一作者

譯者

@愛倫坡

相關文章