计算机刚出现时,为了管理计算机具备的资源,为程序员提供一个可以快速开发程序的环境,业界涌现出了很多操作系统,包括IBM OS/360、DEC VMS、MS-DOS等。经过漫长的演进,目前的操作系统主要包含两个系列:一是从MS-DOS发展过来的Windows操作系统;二是以UNIX为基础的各类操作系统,如开源的Linux、BSD,为便携设备设计的Android、macOS、iOS等移动操作系统,这些操作系统均符合POSIX(Portable Operating System Interface,可移植操作系统接口)协议要求,可统称为UNIX类操作系统。
1965年,美国麻省理工学院和通用电气公司、贝尔实验室共同参与Multics(Multiplexed Information and Computing Service)项目,旨在开发一套能运行在GE-645等大型主机上的多用户、多任务分时操作系统。这些参与者是当时全球领先的研究机构和企业,通用电气公司具有设计和生产全新硬件的能力,能够更好地支持分时和多用户体系计算机;贝尔实验室则是业界著名的研究机构,且在20世纪50年代就打造了自己的操作系统。但Multics的过度设计导致其太过复杂,开发周期长、成本高昂,并且由于系统庞大且运行缓慢,不被市场看好,于1969年宣告失败。尽管Multics项目失败了,但它对后续操作系统的发展产生了深远影响。
1969年,贝尔实验室退出Multics项目后,项目组成员肯·汤普森(Ken Thompson)在闲置的DEC PDP-7小型机上写了一个叫“太空旅行”的游戏,并沉溺其中。然后,他发现只需要再编写3个程序,就可为PDP-7提供一个完整的操作系统。汤普森利用妻子带孩子度假的3周时间,用汇编语言实现了这个大胆的想法。这3个程序分别是一个用来创建代码的编辑器,一个将代码转换为机器可运行文件的汇编器,以及一个包含执行调用功能、Shell交互程序的“内核外层”。这个新的操作系统吸取了Multics的失败教训,设计非常简单精巧,受到丹尼斯·里奇(Dennis Ritchie)等人的关注,很快就有了一小群用户。
这个新的操作系统被命名为UNICS(UNiplexed Information and Computing Service),表示它提供的是“毫不复杂的信息与计算服务”,以突出与 Multics 完全不同的设计思想。UNICS吸引了贝尔实验室的一群天才程序员,他们不断提升UNICS的功能,添加新的工具。不久之后,这个年轻的多用户、多任务操作系统改名为UNIX。
UNIX的第1版于1971年11月发布,附带了Fortran 编译器。许多被沿用至今的经典小程序也都有了雏形,如ar、cat、chmod、chown、cp、dc、ed、find、ln、ls、mail、mkdir、mv、rm、sh、su和who等。由于具备优秀的特性,UNIX在发布初期,就得到迅速传播。
此外,由于汇编语言限制了UNIX的功能扩展和应用传播,汤普森和里奇决定使用BCPL(Basic Combined Programming Language,基本组合编程语言)进行开发。在开发过程中,他们对BCPL做了进一步的改进,推出了B(取BCPL中的第一个字母)语言,后来发现使用B语言还是无法达到预期要求。随后,里奇和布莱恩·柯林汉(Brian Kernighan)在B语言的基础上重新设计了一种新语言,支持丰富的数据类型和大量运算符的编程语言。这种新语言较B语言有质的飞跃,被命名为C语言。1973年,C语言基本成型,UNIX也完成了用C语言的重写,功能稳定且具有良好的可移植性和可维护性,为UNIX的进一步推广和普及奠定了坚实的基础。
像所有起步工作一样,UNIX的早期开发也遇到了各种各样的困难,起初它运行在PDP-7这样的“旧设备”上,在那个以大型机器为主的年代,小型机器可做的事情非常有限,而且贝尔实验室高层并没有对操作系统开发表现出过多兴趣,造成UNIX的开发者们“无机可用”。当然,历史的巧合总是相似的,机遇出现了。当时,贝尔实验室需要申请大量专利,编写具有行号标注需求的文档使得专利申请团队非常痛苦。因此,贝尔实验室同意购置性能一般的PDP-11用于准备专利申请材料,UNIX小组负责编写所需的程序。UNIX就这样作为专利申请文档工具成功地“存活”了下来。这个专利排版工具就是Nroff,后来广泛应用于各类UNIX操作系统,并对后续的文档排版系统产生了深远的影响。图1.1所示为肯·汤普森和丹尼斯·里奇在PDP-11上运行早期的UNIX。
图1.1 肯·汤普森和丹尼斯·里奇在PDP-11上运行早期的UNIX
当UNIX发展到第6版时,这个系统已经成为广泛应用的通用、多用户、交互式操作系统。该系统核心特色在于其分层设计的可拆卸文件系统,具有高度兼容性的文件、设备输入输出接口。同时,它还支持100多个子系统和十几种语言。UNIX借助可移植的C语言获得了在多种机器之间移植的能力,这一能力对操作系统的发展非常重要。当时的形势和现在的不同,计算机行业远没有现在发达,也没有形成垄断性的商业机构,不同公司设计的计算机使用的硬件各不相同,操作方式也百花齐放。程序员需要为每种计算机编写不同的程序来适应不同硬件各自的特点,非常痛苦。而操作系统提供了统一的可移植接口,使编写程序的过程大大简化,“拯救”了广大计算机程序设计人员,为后来计算机行业的发展奠定了基础。