C语言:丹尼斯·里奇的不朽遗产

news/2024/11/20 7:29:03/

C语言:丹尼斯·里奇的不朽遗产

爱伦坡 发表于 2012-10-08 00:11   46885 阅读

纪念已故的丹尼斯·里奇--于丹尼斯·里奇(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)

哥伦比亚大学 计算机科学系 劳伦斯·古斯曼讲席教授

《编译原理》龙书第一作者

译者

@爱伦坡


http://www.ppmy.cn/news/834995.html

相关文章

vue框架的学习-基础部分

1:vue的安装 使用一个框架,我们第一步要做什么呢?安装下载它 安装Vue的方式有很多: 方式一:直接CDN引入 你可以选择引入开发环境版本还是生产环境版本 <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/…

1121-世纪电源网自己经常上的几个网站

http://bbs.21dianyuan.com/thread-170420-1-1.html http://bbs.21dianyuan.com/thread-174492-1-1.html 好久不发帖&#xff0c;今天整理下了收藏夹&#xff0c;发现一些网站资料可以供大家参考&#xff0c;基本上个人经常上去看看&#xff1a; 注&#xff1a;基本上都是英文…

node.js的理解

http协议 http协议英文全称HyperText Transfer Protocol&#xff0c;翻译成中文就是超文本传输协议。它是在 1990 年时提出。最早是1.0版本&#xff0c;现在普遍大家使用的是1.1版本 http协议的特点 简单快速&#xff1a;例如常用的方法有 GET、POST、PUT、DELETE等方法。由…

熊猫数据集_使用大数据的熊猫

熊猫数据集 减少多达90%的内存使用量的提示 (Tips for reducing memory usage by up to 90%) When working using pandas with small data (under 100 megabytes), performance is rarely a problem. When we move to larger data (100 megabytes to multiple gigabytes), per…

软件架构风格 仓库风格_功能风格–第5部分

软件架构风格 仓库风格 高阶函数I&#xff1a;函数组成和Monad模式。 什么是高阶函数&#xff1f; 在上一篇文章中&#xff0c;我们看到了一些作为一等公民的函数的示例以及它们可以用于的各种用途。 回顾一下&#xff0c;当函数本身是一个值时&#xff0c;它就是一等公民&…

功能风格–第5部分

高阶函数I&#xff1a;函数组成和Monad模式。 什么是高阶函数&#xff1f; 在上一篇文章中&#xff0c;我们看到了一些作为一等公民的函数的示例以及它们可以用于的各种用途。 回顾一下&#xff0c;当函数本身是一个值时&#xff0c;它就是一等公民&#xff0c;并且可以像其他任…

Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题

几年前&#xff0c;我首先构建并发布了Jirasearch &#xff0c;它是用于薄型包装Lucene服务器的有趣的狗粮测试用例&#xff0c;以针对我们的Jira问题公开强大的搜索UI。 这很好地展示了Lucene的许多重要功能&#xff1a; 使用块联接查询来建模父文档&#xff08;原始的Jira问…

lucene使用3.0.3_Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题

lucene使用3.0.3 几年前&#xff0c;我首先构建并发布了Jirasearch &#xff0c;它是用于薄型包装Lucene服务器的有趣的狗粮测试用例&#xff0c;以针对我们的Jira问题公开强大的搜索UI。 这很好地展示了Lucene的许多重要功能&#xff1a; 使用块联接查询来建模父文档&#x…