与柯尼汉谈丹尼斯·里奇

来源:互联网 发布:林更新网络一线牵图片 编辑:程序博客网 时间:2024/04/30 13:39

本文是由O'Reilly的编辑Andy Oram采访Brian Kernighan写成。(Andy参加了Making Software,Beautiful Code等多部著作的编写。)原文发表在O'Reilly Radar。

“柯尼汉和里奇”(K&R)已经成为一个计算机术语,拥有了其独立的意思,甚至脱离了构成该词的词法标记。丹尼斯·里奇两周前不幸去世,享年70岁。我上周五和布里安·柯尼汉谈到了里奇。布里安为O'Reilly出版的Beautiful Code(《代码之美》)写了正则表达式那章,因此跟我算认识了。他说:“我们大家都仍然在依赖着丹尼斯创造出的东西,这一点真是非同凡响。”他还说丹尼斯从不去宣传自己的功绩,只是安静地去做他认为需要做的事情。

过去四十多年来,大家已经花了很多笔墨描述C语言和Unix操作系统的巨大影响,这两种技术都很大程度上源自里奇的工作。由C和Unix提出的诸多重要原则推动了计算机技术的许多重大发展,在这方面大家的著述更是汗牛充栋——关于可移植性,封装,小程序通过管道技术相互协作,偏向用文本形式表示数据,等等。因此,我没有把话题集中在这些大家熟悉的老观点上,而是和柯尼汉谈论了里奇工作的其他一些方面。

C依旧在流传

值得注意的是,Android通过原生开发套件(NDK)增加了对C的支持。虽然其初衷是因为必须这样才能通过OpenGL库(用C写成)提供三维图形,但是那些希望用特定于设备的代码(这也只能是用C写出来)去美化其应用的程序员们是特别爱用NDK的。

苹果的Cocoa和iOS比较直接地具有C语言支持,因为Objective-C代码是可以直接调用C函数的。整个大的“C家族”(包含Objective-C和C++)显然十分兴旺发达,而旧的C也仍然是一门很重要的语言。柯尼汉大方地承认,“不少事情用其他语言实现起来更好”,但是在底层编程的“效率和表达性”方面,C还依然是技压群芳。

里奇创造C语言是想着硬件的,其目的是在尽可能高效地访问硬件的条件下,还要保有汇编语言所缺乏的可读性和可移植性。因此,至今C还用于嵌入式系统和其他需要引用硬件端口和特定内存位置的代码中,就不足为奇了。不过,C还极其适用于需要进行位级别操作的代码。最后,C还依旧是那些需要快速响应的应用的第一选择,所以能看到,每个现代的脚本语言都有某种C的网关,程序员遇到某些操作还依然需要求助于C。自然,如果你在你最爱的脚本语言里使用了printf或cos等函数,极有可能你是站在巨人的肩上,使用了别人已经为你写好了的C库函数。

柯尼汉告诉我说,里奇始终意识到使用最少资源的好处。他当年所做的很多事情都是对当时使用的同类系统的反思,比如与肯·汤普森发明Unix就是对Multics操作系统的反思,C语言则是对Multics用的PL/1的反思。而EPL、Bliss尤其是BCPL则对C语言有着更多积极的影响。这些促使C语言取得成功的因素不仅启发了后来的其他语言和系统,而且也使C语言能继续和后来的新语言和系统并驾齐驱。

Unix之后,里奇在Rob Pike的Plan 9系统上做了不少工作。他不仅完全使用这个操作系统,而且还亲自写代码,并在贝尔实验室帮助管理这个项目。

约束

20世纪70年代的计算受到当时条件的严重制约,简直不堪想象。柯尼汉说里奇和汤普森设计Unix时只能让它运行24 000字节。类似的约束无所不在:磁盘空间、带宽(网络才刚发明),甚至I/O设备。Unix的命令和输出都十分简短,这是根据所用的打印机做的预计,为了在使用的时候可以省纸。

不过那时这么做也还凑合。文件名可以限定不超过14个字符,因为程序不能分成太多个小文件,整个工作最多只能有几百个文件。不允许运行多于32 768个进程,系统也只能监听1024个以内的传入连接。Unix对于时间的定义很快就总出问题,因为有些Unix程序会需要记录超过2038年的秒数,而且经常需要用少于1秒的粒度来计量时间。

不过柯尼汉指出,把东西限定在一个字长(对于里奇用的PDP-11就是16位)也有好处,就是减少了复杂度,从而也减少了出错的机会。如果想要在一个目录下容纳很大量的文件,就必须为文件设计一个复杂的寻址系统。但这个复杂系统会很耗费资源,因此只能保留简单的老系统,而创建一系列层级,让用户在向目录中增加文件时一级级递增。这样做的话,就很难设计出无错的系统,更别提精简而快速了。

纯粹计算机科学之乐趣

柯尼汉和里奇那本影响深远的著作出版于20世纪70年代,柯尼汉说那时的计算机领域做出点成果还是不难的。也许是因为他们那代人做得太出色了,我们在基础的计算机发展方面已经没有太多可做的事情,今天程序员们关注的焦点都是在上层的不断变化的协议和应用,也取得了丰盛的成果。新的算法还会不断发展,部分归功于多处理能力的增长,尤其是异构处理器的发展。在这样的环境下也需要新的操作系统结构。但是,计算机的主要研究已经从基础的计算机科学转向了应用领域,直接面向现实世界的行为。

我们知道有更多的丹尼斯·里奇成长起来,不过他们已经不再主要从事丹尼斯曾经努力研究过的基础领域。在相当大的程度上,我们可以说他已经完成了他所开创的事业,并且启发了与他同时代的许许多多人。

原创粉丝点击