1. 程式人生 > >C語言:丹尼斯·裡奇的不朽遺產

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

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

中文原文: http://www.ituring.com.cn/article/14315

紀念已故的丹尼斯·裡奇--于丹尼斯·裡奇紀念日在貝爾實驗室的演講,新澤西梅山,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語言尼斯·不朽遺產

英文原文:http://www.cs.columbia.edu/~aho/Talks/12-09-07_DMR.pdf 中文原文: http://www.ituring.com.cn/article/14315 紀念已故的丹尼斯·裡奇--于丹尼斯·裡奇紀念日在貝爾實驗室的演講,新澤西梅山,2012年9月7日

C語言尼斯·不朽遺產

數年之內,C語言發展成了一門通用的程式語言,甚至用於Unix系統之外。比如,微軟的Windows系統就是用C實現的。事實上,今天世界上仍有諸多完成關鍵任務的軟體系統是用C編寫的。今天倘若沒有丹尼斯的發明,你就打不了電話,坐不了飛機,開不了汽車。C語言是一份不朽遺產。我剛從宇航局現役研究員傑拉德·霍爾茲曼(Ge

C語言之父尼斯·

丹尼斯·裡奇具體介紹網址:http://baike.baidu.com/view/6648356.htm?qq-pf-to=pcqq.c2c#1 人們對裡奇的紀念,遠不及對喬布斯鋪天蓋地的悼念。可是,裡奇值得人們那樣去做。   還是有人出來說了句公道話。  “史蒂夫·喬布斯

保持簡單紀念尼斯·

1954年,電氣工程師阿利斯泰爾·裡奇(Alistair E. Ritchie),決定舉家從紐約州的布朗克斯維爾(Bronxville),搬到幾十公里以外的新澤西。這樣可以離他的工作單位”貝爾實驗室”更近一些。 13歲的丹尼斯·裡奇(Dennis Ritchie),

尼斯·,那個給喬布斯提供肩膀的巨人[轉載]

C語言之父丹尼斯·裡奇先生於2011年10月8日在位於美國新澤西州的家中病逝。這一新聞在廣大計算機的愛好者和研究人員中引起巨大反響,然而諸多悼詞和追憶的描述卻不夠準確。在此,我們借本文回顧裡奇先生一生的巨大貢獻,願世人緬懷,願先生安息。 裡奇先生被譽為C語言之父,他不

C語言constkeyword、結構體

data con post -s 標簽 初始化 weight 什麽 聯系 前幾節內容的解說,主要是內存地址及指針的分析。這一節解說一下easy混淆的keywordconstant及結構體的知識。 一、constkeyword 1. 字符常量的指針 char const

c語言復合文字

參數 語句 ... 指向 c語言 使用方法 類型 .... 意義 復合文字的意義,相當於是在C語言中,為數組類型定義了一種類似於8之於int,‘w‘之於char一樣的常量類型,所以從C99之後,可以在一些地方使用復合文字來代替數組使用。 復合文字的聲明 (int [3])

0基礎學C語言C語言視頻教程免費分享!

軟件 適合 密碼 計算機程序 計算機編程 學c語言 應用軟件 技術分享 朋友 C語言是一種通用的、過程式的編程語言,廣泛用於系統與應用軟件的開發。作為計算機編程的基礎語言,長期以來它一直是編程愛好者追捧而又比較難學的語言。C語言是一種計算機程序設計語言,它既具有高級語言的特

c語言順序表傳參要是指針類型的才能改變順序表

過去的 oca 頭文件 def blog 文件中 data div log 想在頭文件中初始化順序表,在main函數只能傳參的時候傳的是(sqlList L),調用LocalElem(L,X)是報錯說沒有給L初始化. 原因:調用初始化的函數,傳過去的參數是sqlList L

C語言二維數組與指針實踐1

mvc 數組 vpx c99 mar ebe inf xsl ndt 實1r遜5駛誹喜濟51http://docstore.docin.com/psb360 毓V私陶塹4v31Fhttp://www.docin.com/zucga0192 53o97gw蓖沙賭2yh

C語言歸並排序

tar merge ret void class while std stdio.h 歸並排序 歸並排序(C語言)。 先上代碼,理論會後面一起總結。 1. 遞歸 2. 非遞歸 #include <stdio.h> #include <stdlib.h

C語言指針實現交換兩個變量的值

實現 urn sign ret 語言 div title void itl 用指針交換兩個變量的值(10分) 題目內容: 用指針交換兩個變量的值 主函數參考: int main( ) { int a,b; scanf("%d%d",&a,&b)

C語言指針實現輸出梯形字符串

pre () 輸入格式 lec desc clu 字符串 main std 用指針實現,實現過程無需將子串復制到一個新的字符串中。(10分) 題目內容: 用指針實現,實現過程無需將子串復制到一個新的字符串中。 輸入格式: 字符串 輸出格式: 子串 輸入樣例

c語言矩陣相乘-矩陣相加 新手練習1

ces () 練習 code text x11 print ++ oid #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> voi

C語言解決多個C檔案包含同一標頭檔案引起的檔案重複包含問題

解決多個C檔案包含同一標頭檔案引起的檔案重複包含問題,並給出全域性變數如何定義和宣告的方法. 解決方法: 1. 定義公共檔案: global.c 和global.h 其中, global.c檔案中: #include "global.h" //定義全域性變數 int g

C語言求位數

題目:給出一個不超過12345678的正整數,求出它是幾位數。 #include <stdio.h> #include <math.h> int main() { int a,i=0; scanf("%d",&a); do { a/=10;

C語言利用結構體的學生成績

結構體-學生成績管理 題目:有50個學生,每個學生的資料包括學號、姓名、3門課的成績,從鍵盤輸入50個學生資料,要求打印出每門課的平均成績,以及三門課總分最高的學生的資料(包括學號、姓名、3門課的成績,三門課的總分)。 #include<stdio.h> #define

C語言程式設計實現兩個矩陣

輸入一個3乘4矩陣✖️4乘5矩陣,輸出一個3乘5的矩陣 #include<stdio.h> int main() { int matrix1[3][4],matrix2[4][5],matrix3[3][5]; int i,j,k; int jz3[

C語言輸出用0~9這10個數能組成的

輸出0~9這10個數能組成的三位數 #include<stdio.h> int main() { int i, j, k,count = 0; for(i = 1; i <= 9; i++) //0不能為首位 for(j = 0; j &

C語言完美數,求1-n之間的

輸入n,求1-n之間的完美數 完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。如果一個數恰好等於它所有的因子之和,則稱該數為“完全數”。具體完美數定義請見完美數-百度百科 #include "stdio.h" void main() { int