他是 C 语言之父、1983 年图灵奖得主,还是 Unix 的关键开发者。然而,他却因为“任性”没有拿到博士学位,而且当年写的博士论文一丢就是半个世纪。如今,这一神秘的博士论文终于重见天日。

丹尼斯·里奇(Dennis Ritchie, 1941-2011)图片来源:CodePen Home | Dennis Ritchie Tribute Page

对于计算机专业人士来说,丹尼斯·里奇(Dennis Ritchie)并不是个陌生的名字。上世纪 60 年代末,他从哈佛大学应用数学系毕业并“子承父业”加入贝尔实验室,在那里度过了他的整个职业生涯。加入贝尔实验室不久,里奇就和肯·汤普森(Ken Thompson)一起开发了 Unix 操作系统和经久不衰的 C 语言。汤普森领导了系统的开发,里奇则主导了 C 语言的创造。在 C 语言问世之后,汤普森又用它重写了 Unix。1983 年,丹尼斯·里奇和肯·汤普森共同获得图灵奖。

半个世纪之后,Unix 已经成为构建数字世界大多数操作系统的基础,而 C 语言则成为世界上最受欢迎的编程语言之一。

肯·汤普森和丹尼斯·里奇

虽然丹尼斯·里奇已经于 2011 年去世,但贝尔实验室依然保留着他的个人主页。在这个页面上,里奇用他特有的干巴巴的口吻对自己的计算科学求学生涯进行了介绍:

我在哈佛大学读本科并进一步深造,我的本科专业是物理学,研究生专业是应用数学…… 我的博士论文(1968 年)关于函数的子递归层次(subrecursive hierarchies)。本科阶段的学习让我明白,以自己的才智还不足以成为一名物理学者,而往计算机方向发展似乎相当不错。研究生阶段的经历又让我清醒,自己的才智也不足以让我成为算法理论方面的专家。我自己更喜欢过程式语言,而不是函数式语言。

且不论这些自我评价是否客观,里奇选择的道路的确将他带到了一个让自己大放异彩的领域。

尽管里奇在计算机领域享有盛名,但鲜为人知的是,他的博士学位论文没有几个人亲眼见过,因为这份论文——遗失了

没错,就是遗失了,既没有发表也没有被任何公开文献收录,甚至哈佛大学图书馆的馆藏目录和论文数据库中也找不到这篇论文。2011 年里奇去世的时候,他的妹妹琳恩(Lynn)仔细地翻阅了哈佛的馆藏记录和其他渠道,也没有找到一份副本。

功夫不负苦心人,最终,她从里奇导师的遗孀那里找到了一本。但由于缺少公开副本,在过去的半个世纪里,只有不到十几个人读过这篇论文。

为什么会出现这种情况?

在里奇的自我描述中,我们注意到,他并没有明确说明自己凭借 1968 年那篇论文拿到了博士学位。实际情况是:他的确没有拿到博士学位。

这中间出了什么状况?里奇的研究生同窗、MIT 教授阿尔伯特·梅耶(Albert Meyer)给出了一个意想不到的答案。

因为不想付装订费,放弃了博士学位

阿尔伯特·梅耶回忆道:

我从我们导师帕特里克·费舍尔(Pat Fischer)那里听到的解释是,当时哈佛有一项规定:要想获得博士学位就得向学校图书馆提交一份装订好的论文,然后图书馆才会给你一份用来获得博士学位的证明。当时,丹尼斯(里奇)已经将论文提交给了论文评审委员会,而且得到了通过。他还手打了一份准备提交给图书馆,但图书馆却告诉他论文需要装订成册再提交。那时候,装订费不是一笔小数目…… 倒也不是贵到拿不出来那种,只是说所费不菲。据帕特里克所说,丹尼斯当时的态度是:“如果哈佛图书馆想要一本装订好的论文,那他们应该自己掏钱,我是不会掏的!”很显然,他的确这么做了,也因此没拿到博士学位。

所以,这位大佬之所以没有拿到博士学位,并不是论文本身有问题,而是因为“任性”,打死不交装订费!

经过多方打听,琳恩证实了里奇的确没有提交装订版论文,也的确没有拿到哈佛的博士学位,但里奇的兄弟约翰(John)认为,他之所以这么“任性”绝不仅仅是因为那点装订费:里奇当时已经有了一份梦寐以求的工作——贝尔实验室研究员,而且他是那种不拘小节的人,“不会去关心生活中的一些细枝末节”。

刚进入贝尔实验室的时候,丹尼斯·里奇(右)和他的父亲埃利斯戴(Alistair, 左)以及电子开关先驱 William Keister(中)一起工作。

最近,里奇的家人向美国计算机历史博物馆(CHM)捐赠了他的一些遗物,其中最重要的便是里奇的博士论文影印件,这也是半个世纪以来这篇论文首次公开。随之一起捐赠的还包括 Unix 的早期源代码(1970–71)。

这篇论文写于 1968 年,题目是《Program Structure and Computational Complexity》,当时里奇 27 岁。如今,里奇离我们远去,论文也早已褪色发黄。

丹尼斯·里奇遗失半个世纪的论文手稿首次公开。

和影印本一起公开的还有该论文的电子版。

论文地址:

https://archive.computerhistory.org/resources/access/text/2020/05/102790971/Ritchie_dissertation.pdf

或许,这篇论文可以带我们一窥计算机科学发展的早期情况,了解当年的先驱人物所面临的挑战。此外,它还可以提醒我们在这条路上已经走了多远,以及技术在人的短暂一生中所发生的变化。

解码丹尼斯·里奇的博士论文

将里奇的论文手稿复原并公开是一回事,理解它又是另一回事。

要想理解这篇论文的内容,我们需要回到 20 世纪初,那个数学家、哲学家、逻辑学家探讨数学终极基础的创造年代。

里奇博士论文封面

在那之前的几个世纪中,数学知识的特性——精确性(exactitude)和确定性(certitude),使它处于一种特殊甚至神圣的地位。对这些数学特性源头或基础的哲学思考可以至少追溯至毕达哥拉斯和柏拉图,而在 20 世纪初期,有影响力的数学家和哲学家将形式逻辑(用符号系统表达规则和推理步骤)作为数学的基础。

在 20 世纪 20 年代,德国数学家大卫 · 希尔伯特(David Hilbert)试图捍卫形式逻辑作为数学基础的观点,并产生了很大影响。具体而言,希尔伯特认为,你可以通过形式逻辑中的特定证明构建数学的某种特性,例如数学没有矛盾,任意数学论断要么真要么假。

希尔伯特倡导的这种证明就是“finitist”,依赖于使用简单显式、几乎机械式的规则操控形式逻辑的表达符号

20 世纪 30 年代,人们寻求此类符号逻辑操纵规则,数学家和哲学家将其与计算联结起来,并建立了逐步的严谨流程,以便人类使用“计算机”和机械计算器执行数学运算。

库尔特 · 哥德尔(Kurt Gödel)提供了希尔伯特提倡的这类证明,但是却展示了希尔伯特期望的反面。哥德尔的逻辑没有展示确保数学中一切均正确的逻辑是可以被证明的,而是走向了反面,即哥德尔不完备定理

对于这一令人震惊的结果,哥德尔的证明依赖于关于特定数学对象“原始递归函数”(primitive recursive function)的论点。哥德尔递归函数的重点是,它们可计算且依赖于“有限过程”,即希尔伯特认为的那种简单、几乎机械式的规则。

左:学生时期的哥德尔(1925 年);右:大卫·希尔伯特(1912 年)。

在哥德尔之后,美国数学家阿隆佐 · 邱奇(Alonzo Church)使用类似的可计算性(computability)论点形成了逻辑证明,该证明不仅表明数学不总是可判定的,一些数学表述甚至无法确定真假。邱奇的证明基于“能行可计算函数”(effectively calculable function)概念,该函数基于哥德尔的递归函数。

几乎同时,英国的阿兰 · 图灵构建了具备同样结果的证明,不过他的证明基于抽象“计算机器”运算所定义的“可计算性”概念。这一抽象图灵机能够执行任意计算,后来成为理论计算机科学的重要基础。

之后的几十年里,在计算机科学还未成为公认学科之前,数学家、哲学家等开始各自探索计算的本质,逐渐脱离了与数学基础的联系

正如里奇的同学、 MIT 教授阿尔伯特·梅耶在采访中所讲述的:

在二十世纪三四十年代,“什么是可计算的,什么是不可计算的”得到广泛的研究和理解。哥德尔和图灵对可计算和不可计算的事物进行了逻辑限制。但是六十年代出现了新想法:“让我们尝试理解可以用计算做什么”,也就在那时计算复杂性的概念出现了…… 你可以通过计算做所有事情,但并不是全部都那么容易…… 计算的效果会如何呢?

随着电子数字计算的兴起,对于这些研究者而言,问题不再是关于可计算性的逻辑论证对数学本质的影响,而是这些逻辑论证对于可计算性自身限制的揭示。当这些限制被充分理解后,研究者的兴趣转移到这些限制内的可计算性本质问题

MIT 教授阿尔伯特·梅耶。

对于上述问题的探索部分发生在 20 世纪 60 年代中期。当时,丹尼斯·里奇和阿尔伯特·梅耶都进入哈佛大学应用数学系进行研究生学习,而应用数学系也往往是电子数字计算实践在校园中扎根的地方。

自此,里奇和梅耶对计算理论越来越感兴趣,因此他们找到了 帕特里克·费舍尔(Patrick Fischer)作为自己的导师。费舍尔当时刚刚拿到博士学位,他在哈佛任教时间不长,恰好与里奇和梅耶读研的时期重叠。梅耶回忆道:“帕特里克对于理解计算的本质非常感兴趣。他想知道是什么让一切变得复杂,又是什么让它们变得简单…… 不同种类的程序能做什么?”

一份暑假作业

在经历了一年的研究生学习之后,费舍尔单独雇佣了里奇和梅耶作为暑期研究助理。梅耶被分到的工作是研究费舍尔在计算理论中发现的一个“开放性问题”,并在暑期结束前给出报告。而费舍尔此时即将离开哈佛。

梅耶花了一整个夏天独自苦苦研究这个问题,但暑期结束之前也只完成了一小部分。不久之后,在去参加、一个研讨会的路上,梅耶忽然想到了解决方法,他兴奋地将这个突破告诉了费舍尔。但令梅耶惊讶并略微失望的是,费舍尔告诉他其实里奇也已经想到了解法。原来,他把同一个问题交给了两个人解决,但是没有告诉他们对方拿到了同样的问题!

丹尼斯·里奇和他的父亲埃利斯戴

费舍尔给两人出的难题是一个关于计算复杂性的大问题,与计算一种事物相对于另一种事物的相对容易度或时间有关。回想一下哥德尔使用原始递归函数来例证有限过程的可计算性,这是他著名论文中的关键点。20 世纪 50 年代,波兰数学家 Andrzej Grzegorczyk 根据函数增长的快慢定义了这些递归函数的层次结构。费舍尔的暑期问题就是让梅耶和里奇探索这种函数的层次结构与计算复杂性之间的关系

难得的是,梅耶对里奇解法的赞赏抵消了自己的失望情绪,他回忆道,“……丹尼斯提出的循环程序概念真是太美了,而且如此重要,这是一个非常好的解释机制,也是一个阐明主题的聪明方法,我甚至都不关心他是否解决了问题。”

而里奇在这个暑期提出的循环程序就是他 1968 年博士论文的核心。其实,循环程序本质上是非常小、非常有限的计算机程序,在 BASIC 中用 FOR 命令编写过循环程序的人应该都不会陌生。

在循环程序中,你可以将一个变量设置为零,给一个变量加上 1,或者将一个变量的值移动到另一个变量。就是这样。在循环程序中唯一可用的控制是一种简单循环,指令序列在其中重复一定次数。重要的是,循环可以“嵌套”,即循环套循环。里奇在他的博士论文中表明,这些循环函数正是产生哥德尔原始递归函数所需要的,而且只需要这些函数;它们恰好能够反映 Grzegorczyk 提出的层次结构。

哥德尔认为其递归函数具有很强的可计算性,而里奇则证明了循环程序正是完成这项工作的合适工具。里奇的论文表明,循环程序的嵌套程度是对其计算复杂性的一种度量,同时也是对它们所需计算时间的一种度量。此外,他还指出,通过循环的深度来评估循环程序与 Grzegorczyk 的层次结构完全相同。原始递归函数的增长速度确实与它们的计算复杂性有关,实际上,它们是相同的。

梅耶回忆道:“循环程序被做成了一个非常简单的模型,任何计算机科学家都可以立即理解。在解释原始递归层次的时候,传统公式用非常复杂的逻辑学符号来表示复杂的语法,普通人很难理解。但现在,你突然发现了一个三四行就能把循环程序描述清楚的计算机科学解释。”

他还解释说:“丹尼斯是一个非常可爱、随和、谦逊的人。显然他很聪明,但也有些沉默寡言…… 我们一起讨论过我们合著的《The Complexity of Loop Programs》,他读了这篇论文并给出了自己的评价,并向我解释了循环程序。”

1967 年,这篇论文被 ACM 发表。在梅耶的理论计算机科学生涯中,这篇论文开启了一个多产的时代,而且是他职业生涯的重要一步。但对于他和里奇的合作来说,这却是终点。

“真是令人失望。我很想和他合作,因为他看起来很聪明,很友好,和他一起工作很有趣。但是,你知道,他已经在做其他的事情了。他整晚都在玩《太空战争》!”梅耶如此回忆当时的情景。

让我们回到文章开头提到的里奇对自己的评价:“研究生阶段的经历让我清醒,自己的才智不足以让我成为算法理论方面的专家”。

了解了这篇博士论文之后,我们发现,他好像说谎了。或许,比起理论研究,实现对于里奇来说更有诱惑力,因此他才选择通过创建新系统、新语言来探索计算的边界、本质和可能性。

编译来源:

https://computerhistory.org/blog/discovering-dennis-ritchies-lost-dissertation/

文末说点正事

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们。具体步骤为:

(1)点击页面最上方“临床科研与meta分析”,进入公众号主页(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。感谢支持,比心(具体操作步骤见下方图片)

版权声明

来源:公众号“机器之心”,原文来源:CHM,原作:David C. Brock;本微信转载文章出于非商业性的教育和科研目的,如转载稿、图片涉及版权等问题,请立即联系我们,我们会予以更改或删除相关文章,保证您的权益。

basic语言基础 chm_拒付论文装订费错失博士学位,C语言之父毕业论文丢失52年重见天日...相关推荐

  1. C语言之父:因拒付论文装订费错失博士学位,论文52年后重见天日

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 选自:CHM,作者:David C. Brock,参与:张倩.魔王 机器之心整理 他是C语言之父.1983年图灵奖得 ...

  2. 「任性」的C语言之父:因拒付论文装订费错失博士学位,论文52年后重见天日...

    他是C语言之父.1983年图灵奖得主,还是Unix的关键开发者.然而,他却因为「任性」没有拿到博士学位,而且当年写的博士论文一丢就是半个世纪.如今,这一神秘的博士论文终于重见天日. 很多人可能听说过 ...

  3. 任性!C语言之父:因拒付论文装订费错失博士学位,论文52年后重见天日

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 选自CHM 作者:David C. Brock机器之心编译 他是C语言之父.1983年 ...

  4. “任性”的 C 语言之父:因拒付论文装订费错失博士学位,论文 52 年后重见天日...

    来源:机器之心 他是C语言之父.1983年图灵奖得主,还是Unix的关键开发者.然而,他却因为「任性」没有拿到博士学位,而且当年写的博士论文一丢就是半个世纪.如今,这一神秘的博士论文终于重见天日. 很 ...

  5. 西南大学计算机博士好毕业论文,学位学术论文论文,关于西南大学授予博士学位学术成果相关参考文献资料-免费论文范文...

    导读:本论文可用于学位学术论文论文范文参考下载,学位学术论文相关论文写作参考研究. 西南大学授予博士学位学术成果 要求管理规定(修订稿) 为了加强博士研究生培养,提高学位授予质量,根据<西南大学 ...

  6. 二级c语言基础知识pdf下载,全国计算机等级考试二级C语言公共基础知识.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试 全国计算机等级考试二级C语言公共基础知识 ...

  7. R语言基础(用最简单的方式了解学习R语言)

    心灵导语:沮丧的感觉是由大脑的懒造成的,它在提示你放弃做这么难的事情,去找些容易或有趣的事情来做. 学习编程也一样,大脑越是感到沮丧,你越应该鞭策自己去战胜沮丧.认识到这一点之后,在学习编程的过程中, ...

  8. 汇编c语言基础教程编程达人,编程达人 《汇编、C语言基础教程》第一章 进制1.6 逻辑运算(连载)...

    逻辑运算 逻辑运算在我们今后的编程中会经常使用到的. 本节必须掌握的知识点: u 掌握逻辑运算 计算机中所有的数据都是使用二进制保存,但是这些复杂的电路又是如何做运算的呢? 1.6.1[逻辑运算] 逻 ...

  9. C语言基础篇 (二十五) 详解C语言第一大功臣:函数

    文章目录 C语言为什么有函数? 函数书写的一般原则 函数是动词,变量是名词 函数的实质是:数据处理器 函数的基本使用 函数原型和作用 编译器的工作流程 C语言为什么有函数? 1.整个程序分成多个文件, ...

  10. python语言基础与应用章节七_专技天下Python语言基础与应用章节测试答案

    [单选] 价值工程中所述的"价值"是指作为某种产品所具有的功能与获得该功能的全部费用的比值.它是对象的(),是作为评价事物有效程度的一种尺度提出来的. [单选] 不必要功能就是不符 ...

最新文章

  1. Oracle中sys和system的区别
  2. mysql or 创建索引_Mysql索引优化
  3. 浅谈OpenCL之 应用程序总体步骤思路
  4. 父子继承与方法的重写 java 114818255
  5. 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
  6. JustForFly struts2标签s:generator
  7. E4/EAS/Eventing System 事件系统
  8. fill和memset的区别
  9. 计算机重启打印服务关闭,电脑打印机消失print spooler服务启动后自动停止
  10. 苹果绕id工具_绕ID教程(iOS13.313.3.1)
  11. Excel如何将两列内容合并到一列并在中间添加符号
  12. MSP430指令初探
  13. 【附源码】手写一个Ico生成器
  14. Python学习笔记 使用matplotlib创建Gif动图
  15. 版署通过《魔兽世界.燃烧远征》
  16. MD5 SHA1 CRC32是什么意思?主要有什么区别?
  17. react 实现图片上传功能
  18. 层次结构图和层次图的联系_了解层次结构的限制
  19. 前端面试重要问题总结(前端100问小结)(六)
  20. Java设计模式——模板设计模式

热门文章

  1. 【Cocos2dx】资源目录,播放背景音乐,导入外部库
  2. 以写代学:python 元组
  3. android scroll 中 scroll Bar 修改
  4. oscache 与 ehcache的对比
  5. Android的Splash界面支持用户点击
  6. mysql 重置表索引_第19期:索引设计(哈希索引数据分布与使用场景)
  7. python cls参数_python cls self 讲解
  8. 显著性目标检测matlab代码_YOLO v3 目标检测终篇(附完整 GitHub 代码)
  9. php练手的项目,learnphp.beginmaker.com
  10. CSDN MarkDown编辑器的使用(原内容)