当前位置: 首页 > 科技观察

用户操作系统Unix的前世今生

时间:2023-03-18 11:26:16 科技观察

【前言】BrainKernighan,加拿大计算机科学家,曾就职于贝尔实验室,现任普林斯顿大学教授。他参与了Unix的开发,也是AMPL和AWK的共同创造者之一。他和DennisRitchie合着了第一本C语言的书《C程序设计语言》。他就是大名鼎鼎的K&R里面的K,当然还有AWK里面的K。作为Unix的开发者之一和Unix的命名者,他亲眼见证了Unix的诞生。关于克尼汉,还有一个有趣的定律——克尼汉定律。Collingham定律:调试一段代码的难度是编写它的两倍,因此,如果您的代码编写得尽可能巧妙,根据定义,您可能无法调试它。关于Unix,除了Kernighan,还有三个名字值得记住:美国计算机科学学者和工程师,B语言的发明者KenThompson,美国计算机科学家C语言的创造者,Unix操作系统的主要开发者DennisRitchie,以及达特茅斯数学家,工程师兼程序员DougMcllory,道格拉斯学院的兼职教授。贝尔实验室,Unix的诞生地,真是高手云集。自己几天能做出来的东西,别人一顿饭就可能解决了。这种自由的环境让人想起著名物理学家费曼在加州理工学院介绍自己的有趣故事。在Unix诞生的道路上,有哪些人和事给克尼汉留下了深刻的印象?我在贝尔实验室的第一天就遇到了RichardHamming!1967年,Kernighan还在读研究生的时候,得到了贝尔实验室的实习机会,贝尔实验室真的很大,有3000多人在这里工作。Kernighan虽然是实习生,但也有独立的办公室,这让我和其他工友都羡慕不已。更酸的是,Kernighan去贝尔实验室的时候没有面试,只要完成博士论文就可以了。和我们一样,快到中午的时候,我也会想“中午吃什么?”。就像电视剧里的情节一样,真的有一位先生来请我们吃午饭。他自我介绍为Dick(英文名Richard的缩写和昵称)。克尼汉当时不记得自己的名字,只能偷偷去他的办公室看看门口的牌子。他是理查德·海明!汉明的英文维基百科页面特别长,随便一个都是碾压级:参加曼哈顿计划为核武器发射编写程序,图灵奖得主,纠错码发明人,为了表彰他的贡献,IEEE还专门设立了一个以他的名字命名的奖项。和费曼一样,汉明也不喜欢在实验室担任团队领导。克尼汉对海明的描述可以用两个字来概括——太棒了。那不是高帽子,海明真的这样问自己,这个才华横溢、有趣的人在很多方面对世界产生了深远的影响。Hamming曾说过,他会在周五下午思考伟大的事情。他还会和其他方向的人聊天,问问自己的灵魂:“你的研究有可能获得诺贝尔奖吗?”也许没有一个贝尔奖,肯定没那么重要,你为什么要把时间浪费在不重要的事情上?”退休几年后,他还做了一个关于如何获得成功职业建议的讲座,题目是《你和你的研究》。Fortran是Kernighan太难了,他听从了Hamming的建议,论文研究的主题是图分割,这更类似于著名的旅行商问题。但他仍然不得不使用Princeton计算机。要知道,1967年的计算机是和现在的很不一样,类似于笑话里用针刻CD的那种。那时候的程序员还是喜欢用打孔卡,比如Fortran和Combol语言。Fortran是一种用于科学计算的编程语言,现在很多科学家的研究小组或者专业的软件都在用Fortran语言编程,Kernighan其实是个很有意思的人,有一次他们参加了一个广告的拍摄,他打领带的方式很不正常y。几周后,对方说照片丢了,需要再拍一张。结果,克尼汉坚持不打领带去拍摄,后来发现领带的照片还被刊登了,因为他们找到了那张照片。现在连小学生都会玩电脑、平板,但大部分人看到软盘都应该把它当成“保存键”,更何况是古老的打卡机。有兴趣的朋友可以搜索打卡历史。写程序真的太费劲了。把做好的打卡放到盒子里,到机房,电脑操作员会帮你处理。您只能等待结果,不会向您显示错误。即便如此,那时候真的是够快了。而且很贵。【关于穿孔卡】1880年代,美国人口普查局的工作人员发明了用于人口普查的穿孔卡和机器,用于90年的人口普查。花了六周时间才完成了七年前需要完成的项目。何乐礼创立的公司发展成为今天的IBM。1928年(这是民国十七年),IBM发现矩形孔更节省空间,发明了80列矩阵孔卡。它的设计是这样的,下面10行命名为0-9行,上面两行是11、12行,每列的孔代表一个字符,一些特殊的字符用额外的单孔和双孔表示.后来,IBM对打卡机进行了一系列的改进。80孔打卡分时系统和Multics的诞生在Unix分时系统出现之前,人与机器的交互就像是在?里的树懒,真的很慢,没有交互体验,现在同样,提交者不想要错误,即使他们再提交一些打孔卡。Kernighan说他注意到了JerrySaltzer写的用于排版博士论文的程序,他还写了一段代码来排版自己的论文。不过Fortran对字符的处理确实不太好,以至于最后论文居然有3盒打卡,每盒5000张,重约5公斤,其中1000张是程序代码。打出这篇论文。贝尔实验室的KenThompson和DennisRitchie开始了一个新项目——Multics。这是一个在交互性上有重要突破的分时操作系统。它允许多人连接到一台计算机,每个人都有一部分时间,给用户一种拥有整台计算机的感觉,尽管计算机实际上在他们之间来回切换。如果你能拥有“排他性”,你就可以使用电传打字机而不用打孔卡。电传打字机是打字机、打印机和电话线的组合。您可以输入命令,通过电话线将它们传递给计算机,然后将其输出。这个原理其实和现在的SSH差不多。打卡环境其实也叫批处理环境。这个提交脚本作业类似于Windows中的bat。如果代码正确的话,效率其实还是挺高的。比如我们现在,经常使用批处理脚本来提交使用超算的作业。例如著名的竞赛网站Kaggle平台将分别提供Notebook交互环境和Scripts模式。通过分时系统,用户可以进行及时的人机交互,对于比较小的、不成熟的操作也可以得到及时的反馈。很棒的KenThompson但是Multics太贵了,尽管它提供了一个很好的计算环境,但是很多关于它的描述都使用了“过度设计”这个词。结果,贝尔实验室在1969年退出了该项目,只有MIT和AT&T还在支持它。虽然贝尔实验室退出了Multics项目,但Ken并没有闲着。实验室里有个PDP-7,据说是微型计算机。事实上,它需要一个房间来容纳它,但幸运的是,它已经有了一个显示器。他用这台PDP-7机器运行了他在上面写的《Space Travel》游戏。游戏中玩家可以互相射击,还加入了引力效果,让玩家对轨道动力学有一个简单的了解。肯的??搭档带着他们一岁的孩子去加利福尼亚度三个星期的假期,这总是那么巧合。用这三周的时间,Ken完成了一个可以正常运行的系统。他将其命名为“UniplexedInformationandComputingSystem”,简称UNICS,可以说是第一代Unix。Ken对文档处理软件也很感兴趣。对于论文格式等问题,他们买了一台排版机。这个东西有点像现在的激光打印机,打印在感光纸上,然后显影成照片。但是,机器本身的软件容易出错。两人商量后决定对软件进行逆向工程,自己设计软件运行。机器、手册、汇编语言代码,这就是他们现在所拥有的。克尼汉觉得先吃晚饭太难了。当他回来时,Ken已经写了一个反汇编程序来查看裸机中的代码。第二天他甚至用B语言写了一个解释器。Kernighan说你我可以做这些事情,但绝对不是几个小时。对于Ken来说,这就像是切瓜切菜,而且他可以用手来完成。文件系统、shell和管道早期的计算机,例如IBM,实际上并没有文件系统。虽然存储信息的方式有很多种,但都受限于特定的设备和场景,但是访问辅助存储的信息,你还得记住Liveinjecteddisccylinders等奇怪的属性。Ken在Unix中实现了一个更简单、更整洁的文件系统。只需6个系统调用即可获得处理信息所需的一切。Unix的另一个伟大之处是交互式shell,我们喜欢它作为命令行。这个想法最初在Multics中有体现,但在Unix上更清晰。早期的流水线概念也是在这里诞生的。您可以将程序的输出放入另一个输入而无需通过中间件。1973年左右,DougMcllory想要将程序连接在一起,就像花园里的水管一样。看起来是一样的,后来他反复提到,他想到了用竖线,也就是我们今天的管道符号。Ken还为Unix系统添加了管道符号。这有点像函数式编程。Unix程序仿佛一下子变成了积木,有了拼接的可能。Unix文化Unix系统后来被移植到PDP-11。放置这台机器的地方是在贝尔实验室的6楼。这是Unix房间。房间很大,但是走廊光线很差,还有一些二战时期的垃圾装备。不过房间本身还是不错的,就像现在开放的环境,大家可以聊聊天,虽然有点吵,毕竟大家都是一样的工作方式,有时候也很容易获得灵感。程序可以在办公室想,也可以写在黑板上,需要的时候放回公共区域。有些人喜欢一直呆在公共区域。比如Ken,他从来不在办公室,Kernighan喜欢在办公室,然后每隔一两个小时泡杯咖啡,和别人交流。整栋楼的人都非常乐于与人交流,大楼的走廊上张贴着很多东西。电脑方向的人直接在两条小走廊里办公,愿意来回走动。不过,Unix房间有一次在走廊的一头,后来在六楼。空间很紧凑,不过这样布置也比较方便大家交谈。在这样一个友好的环境中,经常可以发现一些有趣的东西。据克尼汉介绍,当时他们还搬了10公斤巧克力,人家用刀切了一两块带走,弄得满地都是渣,负责打扫的人估计都快炸了。有时你走进Unix房间,走进隔壁房间,听到人们讨论Unix有多么强大,或者向别人介绍我们做的其他事情,有时还会有一些名人来参观。整个气氛轻松愉快。里奇经常把姐姐送给他的英国讽刺杂志《私家侦探》放在桌子上,通常是巧克力旁边,我有时会看看里面的搞笑漫画,但有些东西真的很英式幽默,如果不看可能看不懂你没有住在英国。向中情局展示Unix的威力吸引了无数参观者。70年代中后期,Kernighan等人准备向众多名人演示Unix系统,随行人员都是贝尔实验室的高层。但最有趣的是中央情报局局长威廉科尔比。展示的内容主要是基于Unix组合的思想,比如管道。组合多个程序比编写专用程序要容易得多。一个常见的展示是拼写检查,它可以将文档拆分成单词,然后将它们全部小写,并获得大量掌声。但是因为当时的机器比较慢,所以当我们知道Colby要来的时候,我们就提前跑了pipeline,然后把结果保存在文件里,当天就打印出来了。这是一个经典的“演示项目”。但是比现在很多“PPT项目”要好很多。如果谁对程序有新的想法,也可以写一个新的版本来改进,不过这里有一个特殊的规定,最后一次修改拥有程序的所有权,Kernighan后来成为了ed文本编辑器的所有者。这时候电脑其实就是一个社区,只是你看不到谁在线。然后是另一个命令,他不仅可以看到谁在线,还可以看到他最后做了什么。这种方法有利于信息共享和共同交流。编程很难,如何让它变得简单?我们今天用的所有东西,比如共享代码树,reviewPR等等,这个机制在40或50年前就已经出现了。后来,Unix在贝尔实验室之外流传开来,包括源代码,人们开始为Unix贡献代码。虽然这不是开源,但它非常类似于开源。在Kernighan看来,今天的代码编写太难了。自己编写程序逻辑比在不知道多少层代码的文档中查找需要的功能更容易。很难说Ken的电子游戏和旅行商问题哪个更重要,那么如何创造一个提高程序员工作效率的环境呢?如何让编程更简单?如果你做了一些可以帮助你的事情,其他人的工作也可能得到改善,何乐而不为呢?