PDP-11

Dennis Ritchie,Ken Thompson和Joe Ossanna曾经多次试图说服贝尔实验室为研究小组购买一台计算机,但是在69,70年的时候一台计算机意味着十万美金的价格。尽管是做文件系统和相关工具的研究,但是计算机研究小组还是没有自己的计算机。他们试着让贝尔实验室购买一台PDP-10,或者去租一台,但他们始终没有如愿。Dennis Ritchie对Peter Collinson说:

PDP-7上的所有软件都是用汇编写的。TMG是一个自顶向下的操作系统编译器,最早是由Bob McClure编写,Doug McIlroy也实现了一个。我们的PDP-7上只有4K的内存供应用程序使用,显然不够用PL/I。所以Doug McIlroy为PDP-7移植了TMG。那时Ken Thompson决定我们不能有一个不提供FORTRAN编译器的操作系统,所以我们都坐下来通过TMG开发一个FORTRAN编译器,这些事情只花了大概一天就搞定了。接下来就出现了B。B是BCPL的一个精简版本。

BCPL(Basic Combined Programming Language,基础组合编程语言)是Martin Richards在1967年“编写编译器和系统的辅助工具”。B是BCPL的精简版本,它的名也同样精简了下来。

Richine解释说:

那时候(1968)我加入到实验室,最早是和Rudd Canaday搭档。他曾经将BCPL编译器移植到通用电气的GE-635上的GECOS系统。那时他正在将BCPL移植到Multics,所以我接触到了运行BCPL的Multics。那是非常早的一个移植版本,我们移植后Martin Richards一直在持续改进它。

既然有了BCPL,我们通过它写了一些简单的程序。在第一个Unix系统上面B是基于BCPL的精简编程语言。它作为一个解释器输出的并不是机器码,而是一种中间码。

它先是用TMG写成,然后就实现了自举。事实上这个语言的开发过程非常有趣。编译器不断地用尽机器所有内存,Ken不得不修改编译器,但这又使得再添加新特性变得异常困难。之后他使用新架构才使得编译器变得小巧起来,添加特性也变得比较方便了。

B的确是Unix上面的第一个高级编程语言,有一些东西就是用它编写的。它一共有两个具体实现版本,其中一个输出基于栈中间码的普通解释器,另一个被称之为vb(virtual B)的版本可以将机器的4K内存分页映射,解释器因此可以使用大于物理内存的内存。那时我们的一个程序需要比物理内存大的多的内存,我们用vb实现了它。

Andrew Hume告诉我说“B语言一直使用到1989年,控制排字机的程序就是用B写的”。但硬件的种种限制还是让人沮丧。最后Ossanna建议购买一台PDP-11/20用于文书处理系统。Ritchie说:“Lee McMahon认为我们做的很好”。在他的努力之下(和对文书处理的信心),声学研究总监Max Mathews资助了种子资金。McIlroy告诉我说“没有外部计算机科学的帮助,Unix可能永远都不会诞生”。实验室的管理员认为文字排版是又用的项目,于是他们预定了PDP-11。Ritchie说:

我们在1970年夏天很早就拿到了PDP-11,但只有处理器和内存运到,磁盘还没有过来。它的所有软件都是纸带方式输入,你只能用纸带输入东西,并且还没有操作系统。Unix诞生的第一件事是在PDP-7上用B语言写的PDP-7汇编器编写PDP-11的跨平台汇编器。

我们拿到PDP-11的时候,只有很少一些特殊基础命令用B语言重写了。第一个完成的应用是PDP-11汇编器。还有一个很早期版本的dc(desk calculator),是事实上的第一个跑在PDP-11上的应用,在没有操作系统之前就存在了(标准的“DEC操作系统”从来没有安装到PDP-11上)。它是一个很原始的汇编器,其语法和PDP-11的原始指令集几乎没有区别。

Unix的诞生可以分为两个阶段。Ken在还没有磁盘的时候就让他跑了起来,他把内存分为两大部分,一部分用来存放操作系统,另一部分存放一种内存磁盘。要想让这个系统运行,你需要使用纸带加载初始磁盘的代码,然后是加载操作系统代码。所以在有磁盘之前,就已经执行了cp(复制文件),cat(链接文件),以及ls(列出文件)命令。

一旦有了真正的操作系统,就有了退步。B语言版本的汇编器运行速度非常慢,他们只好用汇编语言重写。我猜测还有不少用B语言写的东西。其中较早的一个是展开文件名中星号和其他一些特殊字符的global命令。我不会忘了支持global的原因,他有点不太合理。当shell应用在传入的参数中发现了魔法字符,它就会调用另一个程序展开它们。程序的代码并不在shell程序里面,它是用B语言写成的。

Thompson说当等待PDP-11的磁盘的到时候,它们把PDP-11放在旁边。然后它们把代码移植过去,在内存里运行了文件系统。

但当PDP-11启动起来后,为了可以编程还需要一个文本编辑器。麻省理工的PDP-1有一个名为TECO的编辑器。起初,这是Tap Editor and COrrector的缩写,后来变为Text Editor and COrrector。TECO是EMACS(Editing MACroS)的前身。1967年L.P.Deutsch和B.W.Lampson在SDS-940上面开发了一个名为QED(Quick EDitor)的TECO实现。SDS不久成为Xerox。Thompson在麻省理工曾经在IBM 7094上为CTSS编写过一个QED。他和Ritchie后来又在贝尔实验室为GE-635写了一个。现在Thompson为PDP-11写了一个简单的线性编辑器ed。但PDP-11已经被用作文书处理用,所以这个文本编辑程序应该还要能把文本显示出来。

J.E.Saltzer曾经写过为CTSS写过runoff。Doug McIlroy回忆说:

我相信是Morris或者Thompson将runoff移植到了635并且改名为roff。它是一个快速开发的东西,只用了一夜的时间。然后我用BCPL语言重头实现了一个简单却超越runoff的roff。那成为Thompson和Ritchie在Unix上实现(用机器语言)的样本。

McIlroy后来写信给我说:“Ken已经不记得635上面的roff,因此我猜测他其实并没有参与roff的开发。然而他记得他曾大概在Unix之前为PDP-7写过一个叫rf的小程序”。这看起来有些矛盾,后来又“猜测”是Ritchie实现了它。

Ritchie说“我知道有一个骗局正在发生,我们承诺了一个文本处理系统,而不是一个操作系统”。但文本处理的努力付出是成功的:贝尔实验室的法务部门和研究小组共享PDP-11/20,成为第一个Unix用户。更为重要的是,实验室的法务部门随后接管了运行Unix的11/20,并且给计算机研究小组拨款购买了PDP-11/45。

results matching ""

    No results matching ""