No.444 第18届图灵奖、Unix与C语言发明者:肯·汤姆森与丹尼斯·里奇

1983年,ACM给Unix跟C语言的创始人Dennis M. Ritchie跟Ken Thompson颁发了第18届图灵奖。关于Unix跟C语言,我已经在电台里讲过太多次了,这次,换个姿势再讲一次。

前几期我讲过,图灵奖一般是发给科学家的,就是做理论研究的。有3-4次是例外,其中的一次是就是这期节目讲的发给了做工程的Unix跟C语言。还有一次是发给TCP/IP协议的那两个人,那是2004年的图灵奖,现在是1983年,还要再讲20期就讲到他们了。做工程的,主要是与网络相关,还有发明互联网的李博士。我觉得互联网实在是太重要了,以至于这些人不得不发几个图灵奖来提高图灵奖自身的权威性。有人会说Linux也很重要啊,为什么不发给Linus呢?说实在的,就算发给Linus,我相信也实至名归,至于为什么没发,我没有ACM评奖委员会的微信,所以,不得而知。还有一次发给的是搞个人电脑的,2009年的那次。如果大家不清楚这次,应该知道苹果跟微软同时抄袭的那家公司吧,就是施乐公司,乔布斯跟比尔·盖茨见到的那台电脑,就是2009年图灵奖得主发明的。还有半次,是2003年发给的Alan Kay,这个家伙做工程很厉害,搞理论也非常厉害,就是搞SmallTalk的。

还有一个现象是,图灵奖发给做工程的,是比较后来的事情,比如,是2000年之后这样。为什么呢?原因是是计算机,其实不上是计算机,整个科学现在的脚步没有上个世纪那么波澜壮阔了,比如,现在的诺奖也好,图灵奖也好,发的那些人,你就觉得也就是那么回事吧。不是那种让人觉得,这人应该得诺奖或者这个应该得图灵奖,甚至觉得,他领奖是对这个奖的认可。目前这些年,确实没有类似的情况出现了。

还有一个很重要的信号是这样,在科学领域,很多时候是科学家有了某个发明,或者有个什么理论,但是这些科学家也不知道干什么用。然后就有一批很有商业天分的人,比如乔布斯,把这些科学家的发明,打个包,降低使用门槛,然后给普通大众用。所以,商业天才,一般是比科学家名气要大,而且不止大一点。就像现在的iOS,Android,其内核都可以追溯到Unix。即使现在天天喊的震天响的国产操作系统,250%也可以追溯到Unix。商业是个放大器,伟大的商人理应获得应有的财富。

再下一步,当商人把商业推广到很多人都在使用了,也赚到钱了,这时候,会出现另一部分大鳄,这些人是玩政治的高手。这些政治高手跟科学家不一样,科学家搞的是规律,是定理,政治玩的操纵的是人心。在政治家的操纵下,商人也是要怂的。于是一个伟大的行业最终会在政治家的操纵下,这是终极目的,也意味着一个行业创新的末日来临。

目前,在我看来,传统的计算机已经走到这个地步了。近年来的图灵奖越发越没有意思,都是一些细枝末节的问题,或者跟冯诺伊曼奖一样,开始给做工程的发奖了。我并不是说做工程的不厉害,但是,这意味着已经没有科学上的创新了,有的只是微创新。再加上个人电脑发展到现在这个阶段,这一台电脑与上一代电脑,这一代手机与上一代手机,差别越来越少。更危险的一个信号是,这个行业已经被玩政治的人盯上了,并且降服了。创新也就慢慢的无从谈起,杂草丛生的年代过去了,将来会成为整齐划一的人工草坪,有的人觉得好看,有的人觉得少了生气。

幸好,作为一个工程项目,或者说是个人项目的Unix与C语言,在1983年就颁发了图灵奖,说明了这个项目的伟大。那时候,后来发明Linux的Linus,当时才14岁,是个初中生。

Unix跟C语言,现在仍旧是长盛不衰。我更倾向于于认为,现在的Linux是Unix变体的一种,现代的C语言,也跟当年的C语言几乎没有区别,仍旧占领着编程语言不可小觑的位置。

接下来,来讲讲Unix跟C语言的发明过程吧。

先说Dennis M. Ritchie吧,他出生于1941年9月9日,Dennis Ritchie也算得上是有家学渊源的,根据他的访谈,他的父亲在AT&T贝尔实验室工作了一辈子,并在电路设计方面取得了卓越成就。他说,1967年他追随他的父亲加入贝尔实验室,他父亲叫Alistair E. Ritchie在那里有长时间的工作经历。他爸爸的被大家所了解的最大的成果是与W. Keister 及 S. Washburn共同著作《如何设计的开关电路》,它是晶体管时代之前的在开关理论和逻辑设计领域最具影响力书籍。《The Design of Switching Circuits》,在交换理论和逻辑设计方面有独到的见解。

当然,Dennis Ritchie和他的父亲是不同年代的人,他父亲的研究成形于晶体管发明之前,而Dennis Ritchie的工作则离不开晶体管的发展。但是,我们从中还是可以看到一些家庭环境对人的影响的。基因+环境,两者缺一不可吧,但是我觉得基因的影响更大一些。

我有个真实的案例可以解释一下这个事情,有一对双胞胎,哥哥跟弟弟,外人看不太容易分出来,但是父母还是很容易分出来的。这对双胞胎,一个学霸,一个不能说学渣吧,但是实在是学习不怎么样。弟弟学习好,考进了我们这里最好的高中,哥哥已经分流到职业学校了。这两个小孩,虽然是同一个爸妈生的,环境也非常类似,但是因为基因上的不同,导致在学业上取得了不同的成绩。我跟这个孩子的父亲是羽毛球的球友,我就问他,按中国传统命理上来说,是不是这两个孩子正好是时辰不同啊。这个父亲说,时辰一样,不是卡在12点的那种,过一秒钟,八字就不同了。这让我对算命也产生了一些怀疑。

不过,对Dennis来说,他跟他爸爸一样,都在贝尔实验室工作。跟他父亲不同的是,他一生未婚,没有子女。Ritchie将大部分精力投入到他的工作和研究中,尤其是在贝尔实验室,他对计算机科学的发展做出了巨大贡献。他的个人生活相对低调,他的主要成就和影响力主要体现在他对C语言和Unix操作系统的贡献上。实际上,他去世的具体时间,是不清楚的,是他的好友,也是Go语言的发明者Rob Pike好久联系不上他,就去他家里找他,发现他已经去世了。

Rob Pike跟Ken Thompson在Google公司工作,共同发明了Go语言。大家可能会问,为什么不喊Dennis一起去工作呢?我也有这样的疑问,我觉得最可能的答案是条件不允许,Dennis晚年饱受前列腺癌跟心脏病的折磨,而且工作也不是人生的目标。他去世之后,引起的关注非常小,跟他同时去世的另一个人却引起了巨大的关注,那个人是乔布斯。

尽管Dennis Ritchie创造了C语言,但他最爱的编程语言其实是Alef,这是一种在Plan 9操作系统上运行并支持并行编程的语言。Alef的语法和C相似,但在数据类型和执行方式上与C有显著不同。大家猜一下这个Alef语言跟什么语言非常类似呢?跟Go语言非常的类似。Rob Pike多次说过,Go语言是借鉴了Alef的并行与C语言的简洁。

谈到编程语言,Ritchie对后来者有一个非常中肯的建议:抱着学习的目的来开发你自己的语言,不要指望它被广泛接受。这个建议不仅适用于语言开发,也适用于其他大型系统的开发。

其实,Dennis Ritchie在1995年和1996年分别领导团队推出了Plan 9和Inferno操作系统,但这些系统并没有像C语言那样被广泛知晓和使用。Ritchie当初也没想到C语言会风靡全球。他开发C语言的初衷与Eric S. Raymond在《大教堂与集市》中阐述的一样,是为了消除对现有工具的不满。出人意料的是,C语言得到了众多程序员的热烈追捧,连Ritchie自己都感到意外。在一次采访中,Ritchie表示这可能是因为C语言的抽象程度恰好既满足了程序员的需求,又易于实现。此外,C语言曾一度是Unix上的通用语言,这也是其流行的原因之一。但无论如何,Ritchie对编程语言出色的审美意识奠定了C语言广为流传的基础。

在Quora上,有个叫Steve Johnson的,他是Dennis的同事,有兴趣的可以去搜搜他关于贝尔实验室以及这些大牛的回答。Dennis Ritchie的业余爱好和NBA大牛卡尔马龙相同:开卡车。他还买了一辆卡车,曾经开着它,在美国旅游,看来不结婚,没有孩子就是好啊,自由。Dennis Ritchie在退休前是贝尔实验室系统开发部的主管,整日忙于管理事务和分配资源。

Ritchie自称心中没有偶像,但如果一定要说一个,那就是Ken Thompson。Dennis喜欢开卡车,Thompson则喜欢开飞机,他从贝尔实验室退休后当起了飞机教练。他们两人合作了20年,屡屡创造历史。后来,Rob Pike去了Google之后,把Ken Thompson请到了Google,继续开发自己的编程语言。

学C语言的都知道最经典的C语言的书叫《The C Programming Language》,作者是三位,除了获图灵奖的这两位,还有一位叫Brian W. Kernighan。他虽然没有获得图灵奖,但是他获得了冯诺伊曼奖。他写书非常厉害,大量的写各种书。C语言的,Unix的,如果你想当程序员,可以买他的书来学。

接下来,讲开飞机的Ken Thompson。他开飞机,应该也是来源于父亲,他的父亲叫Donald Thompson,是个飞行员,在他童年的时候,就喜欢坐着他父亲的飞机在空中翱翔,这也是他一生的梦想。后来虽然当了科学家,但是这个爱好一直没断过,他开飞机的方式是当飞机教练,平时做兼职,他是从贝尔实验室提前退休的,退休后专职干飞行员教练。根据hacker  news上的传闻,他拥有一架米格29战斗机,一架 L-39 信天翁喷气教练机。

这三个人中,如果分要在编程上分个高下的话,Ken Thompson应该是最厉害的。Dennis设计了C语言,Brian写书,Ken则写出了Unix操作系统。而C语言又来自于B语言,B语言的作者是Ken Thompson。

Ken Thompson,作为C语言前身B语言的作者,Unix操作系统的共同发明者之一(另一位是被尊称为DMR的Dennis M. Ritchie),以及国际象棋程序Belle的作者之一,还是操作系统Plan 9的主要作者(与大牛人Rob Pike合作)。Ken Thompson在计算机历史上可谓开天辟地的重要人物。

在1969年,计算机史上还处于前史阶段,普遍认为只有大型机能够运行通用操作系统,小型机被视为高不可攀的存在。更别提用高级语言编写操作系统了,这简直是天方夜谭。Ken Thompson和DMR显然不是等闲之辈,于是在1969年到1970年间,他们利用汇编语言在PDP-7上开发出了Unix的首个版本。当时他们并不知道,这一壮举将掀开Unix传奇的序幕。

1971年,Ken Thompson又将Unix用C语言重写,这一举动为未来二十年间无数梦想和光荣的成就铺平了道路。

Ken还有一个有趣的故事:装有UNIX的PDP-11最早被安装在贝尔实验室,供科学家们日常使用。很快大家就发现Ken总能进入他们的账户,并获得最高权限。贝尔实验室的科学家们都感到十分不爽,于是有人决定分析UNIX的代码,找到了后门并进行了修改,然后重新编译了整个UNIX系统。大家以为问题解决了,然而很快发现Ken依然能够轻易地拿到他们的账户权限,这让他们非常困惑和郁闷。情况持续了14年之久,直到Ken揭示了这一切的原因。

原来,确实存在一个后门,但这个后门不在Unix的代码里,而是在编译Unix代码的C编译器中。每次C编译器编译Unix代码时,都会自动生成这个后门。而所有在贝尔实验室工作的人,都是使用Ken自己开发的C编译器。

这个故事是他在获图灵奖的时候自己亲口说的,并且,他还讲了其中的技术关键。他说:“C语言是用来编写操作系统的一种语言。编写操作系统的人很难抵挡诱惑,不在系统中设置后门。想象一下,如果我在编写操作系统时,在登录部分秘密加入一段程序代码,全世界使用这套操作系统的时候,只要识别到我的账号和密码,就立即授予我root权限,这将是多么方便啊。

但是我不能直接在登录程序的源代码中这样做,因为源代码是公开的,任何人都能看到。那该怎么办呢?我可以从编译器入手,这就是所谓的“patch1”:在编译器中添加一个步骤,如果它检测到正在编译的程序可能是在进行登录操作,就在其中引入一个漏洞,让我可以轻易进入系统。

然而,这种方法也并非万无一失。因为编译器会不断更新,新版本的编译器可能不是我编写的。此外,安装操作系统的人也不一定使用我编写的编译器。那该怎么办呢?于是我在编译器的源代码中进行了第二次修改,即“patch2”:如果这个编译器检测到它正在编译的程序可能是另一个编译器的源代码,就将上述“patch1”和“patch2”本身加入其中。

这种方式,虽然看似复杂,但能够确保只要我在编写的编译器被用来编译操作系统,那么我就能确保系统中存在一个后门,可以轻松让我获得特权访问。”

但是这个方法对那些聪明的教授没什么用,因为这个版本的Unix一经传播出去,伯克利的精英们很快就发现了其中的后门。重新编译系统并不能解决问题,但这些精英可不是吃素的。他们采取了一个巧妙的策略:先将编译器的源代码编译成汇编代码,然后再进行编译,从而成功地消除了后门。

为了避免让人一眼就看出漏洞,C代码转换成汇编代码时并没有插入后门。汇编代码转换成机器代码的过程相对简单,并不依赖于原先的C编译器。这样一来,再次编译就能够轻松去除后门的影响。

5 1 投票
文章评分
订阅评论
提醒

1 评论
最旧
最新 最多投票
内联反馈
查看所有评论
六个九十度
3 月 前

抱着学习的目的来开发你自己的语言

我理解DMR的本意是“探索”吧?学习是对已有人造物而言的,探索是对自然世界而言的

1
0
希望看到您的想法,请您发表评论x
滚动至顶部