# PDP-11

Dennis Ritchie、Ken Thompson 和 Joe Ossanna 多次试图说服贝尔电话实验室为研究小组购置一台计算机。但在 1969 年和 1970 年，绝大多数计算机价格都超过了 10 万美元。尽管他们在文件系统和工具方面做了很多工作，计算研究小组依然没有属于自己的计算机。他们尝试让贝尔电话实验室购买 PDP-10，或者采取部分租赁、部分购买的方式，但完全没有成功。Dennis Ritchie 告诉 Peter Collinson：

> 在 PDP-7 的 Unix 系统上，所有东西都是用汇编语言写的。Doug McIlroy 实现了 TMG，这是一种由 Bob McClure 最初开发的编译器编写系统。它是一个自顶向下的解析器……由于我们在 PDP-7 上用户程序只有 4K 字的内存，PL/I 明显不可能实现。因此 Doug 就为 PDP-7 实现了 TMG。那年 Ken Thompson 认为没有 FORTRAN 编译器就不可能有一个严肃的系统，于是我们开始用 TMG 编写一款 FORTRAN 编译器，但只坚持了一天。结果发生的是，B.B 本质上是 BCPL 的一个精简版本……

BCPL（Basic Combined Programming Language，基本组合编程语言）是 Martin Richards 在 1967 年开发的“用于编写编译器和系统编程的工具”。由于 B 语言是 BCPL 的“精简版本”，它的名字也是个缩写。

> Ritchie 解释道：
>
> 1968 年我刚进实验室时，几乎做的第一件事就是和 Rudd Canaday 联系上了，他是把 BCPL 编译器移植到 GECOS 机器（通用电气，后来是 Honeywell 的 GE635）上的人。当时他正在把编译器移植到 Multics 上。所以我用 BCPL 编译器获得了对 Multics 的访问权限。这是 BCPL 的一个早期方言，Martin Richards 本人后来还继续对它进行了修改。
>
> 所以 BCPL 已经存在，我们也用它写了一些比较重要的程序。在首个 Unix 系统上，B 语言是一种基于 BCPL 的新语言，更简单。它是解释型语言，不生成机器码，而是生成中间代码。
>
> B 语言最初是用 TMG 写的，后来实现了自举（bootstrapping）。实际上，这种语言的发展过程很有趣。编译器的大小总是接近机器的限制。Ken 每次往编译器里加功能时，都经历一段难以继续添加新特性的痛苦期，但随后他会通过在编译器中引入新的结构，使编译器变得更小，从而能添加更多新功能。
>
> B 语言确实是 Unix 上使用的第一款高级语言。用它写了一些程序。B 语言有两个实现版本。一版是普通的解释器，生成某种基于栈的中间语言。还有一版叫做 vb 的“虚拟 B”，是相同语言的带分页的软件版本，能让解释器把 4K 字的段分页调入和调出。每当程序大到无法全部装入内存时，就会使用 vb。

Andrew Hume 告诉我，“B 语言一直使用到 1989 年；驱动我们排版机的程序就是用 B 语言写的。”但是硬件限制确实令人沮丧。最终，Ossanna 建议购买一台 PDP-11/20 用于文本编辑项目。Ritchie 说，Lee McMahon“认为我们做的东西很不错。”由于他的努力（以及对文字处理系统的信心），声学研究主管 Max Mathews 资助了启动资金。Doug McIlroy 告诉我：“如果没有这只来自计算机科学之外的援手，Unix 可能永远也不会突破胚胎阶段。”

实验室管理层明白文本处理是有用的东西。于是订购了 PDP-11。Ritchie 回忆道：

> 我们很早就拿到了 PDP-11，它是在 1970 年夏天到的。当时只有处理器和内存，没有磁盘。所有软件都是用纸带加载的，没有真正意义上的操作系统。第一款为它写的 Unix 是通过交叉汇编从 PDP-7 上移植的，使用的是用 B 语言写的 PDP-7 汇编器。
>
> 等到了我们拿到 PDP-11 的时候，只有少数程序用 B 语言重新写过，基本命令都没有，只有几个额外的程序。其中一款最早的程序是 PDP-11 汇编器，还有一款非常早期的程序是 dc（桌面计算器）。这实际上是第一款运行在 PDP-11 上的程序。它是独立运行的，甚至在操作系统出现之前就运行了。\[PDP-11 从未安装过“标准 DEC 操作系统”] 它是一款非常原始的汇编器，语法几乎和 PDP-11 原始指令集完全相同。
>
> Unix 的出现分两个阶段。Ken 在没有磁盘的情况下让它运行起来，他把内存分成两块，一块运行操作系统，另一块用作类似 RAM 磁盘。为了试用，你得先加载初始化磁盘的纸带，然后再加载操作系统。所以在磁盘出现之前，系统已经有了 cp（复制文件）、cat（连接文件）和 ls（列出文件）等命令。
>
> 系统真正完善后，出现了倒退。B 语言版本的汇编器运行很慢，于是用汇编语言重新写了它。我想也有一些新的程序用 B 语言写了出来。早期的其中一个是负责展开文件名中的星号等通配符的 glob 命令。这个名字代表 global（全局），不过具体原因我记不太清楚，感觉不太合理。展开操作是由一个独立的程序完成的，当 shell 发现参数中有特殊字符时，就调用这个程序进行展开。代码并没有内置在 shell 中。这个程序是用 B 语言写的。

Thompson 说，在等待 PDP-11 的磁盘期间，他们把 PDP-7 放在旁边，然后通过纸带移植代码，并在内存中运行文件系统。

但在 PDP-11 启动之后，就需要编辑器来进行编程。麻省理工学院的 PDP-1 上有一款叫 TECO 的编辑器。最初，TECO 是“纸带编辑器和校正器”（Tape Editor and COrrector）的缩写，后来改为“文本编辑器和校正器”（Text Editor and COrrector）。TECO 是 EMACS（Editing MACroS）的线性祖先。1967 年，L.P. Deutsch 和 B.W. Lampson 在 SDS-940 上实现了 TECO 的变体 QED（Quick EDitor）。SDS 后来被 Xerox 收购。Thompson 曾为麻省理工学院的 IBM 7094 上的 CTSS 编写过 QED 的一个版本。随后他和 Ritchie 又为贝尔电话实验室的 GE-635 编写了一个版本。现在 Thompson 为 PDP-11 编写了简化版的行编辑器 ed。但 PDP-11 是为了文本处理而购置的，所以还需要一款能够呈现文本的程序。

> J.E. Saltzer 曾为 CTSS 编写过 runoff。Doug Mcllroy 回忆说：
>
> 我相信是 Morris，可能还有 Thompson，以某种方式将 runoff 移植到了 635 并称之为 roff。这是一次快速的改造，几乎是一夜之间完成的。然后我在 1969 年用 BCPL 从头编写了 roff，既简化了它，也在功能上超越了 runoff。这个版本成为了 Thompson、Ritchie 在 Unix 上（用机器语言）推出的 roff 的模型。

Mcllroy 后来对我说：“Ken 不记得第一个 635 roff，所以我猜他和那个没什么关系。不过他记得另一个我不记得的程序——一款叫 rf 的极简程序，他为 PDP-7 写的，可能是在 Unix 本身出现之前。显然那个程序是一个进化上的死胡同。”Ritchie 随后“猜测”可能是他写的。

Ritchie 说：“我们知道这其中有些谎言——我们承诺的是一个文字处理系统，而不是操作系统。”但文字处理工作很成功：贝尔电话实验室的专利部门成为了第一个 Unix 用户，他们与研究组共享 PDP-11/20。更重要的是：贝尔的专利部门随后接管了运行 Unix 的 11/20，并将资金交给计算研究部门，后来购买了 PDP-11/45。
