# 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。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/unix-si-fen-zhi-yi-shi-ji/yi-kuan-xi-tong-de-dan-sheng/5-the_pdp_11.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
