探索1960年PDP-1上的Lisp语言
速览
本文探讨了1960年在PDP-1计算机上运行的Lisp语言。作为早期人工智能研究的重要工具,Lisp在PDP-1上的实现标志着编程语言与硬件结合的关键一步。这一历史回顾有助于理解现代AI技术的起源与发展脉络。
AI 深度解读
探索 PDP-1 Lisp (1960):复古计算与现代 AI 的奇妙交汇
背景
Lisp 语言由 John McCarthy 于 1958 年在 MIT 开发,是首个为 AI 研究设计的高级符号编程语言。它开创了递归、符号表达式和自动存储管理等关键概念。PDP-1 Lisp 是 Lisp 在 DEC PDP-1 计算机上的具体实现版本。
本文档旨在为对 PDP-1 Lisp 感兴趣的读者提供快速入门指南。虽然不需要预先掌握 Lisp 知识,但通过实际操作可以直观理解 Lisp 在 PDP-1 上的运行方式。对于希望深入探索的读者,两本手册至关重要:一是《PDP-1 Lisp 手册》,解释 PDP-1 版本的实际操作和语言差异;二是原始的《IBM 7090 Lisp 1.5 程序员手册》,因为 Deutsch 在开发 PDP-1 版本时以 Lisp 1.5 为目标。此外,书籍《Programming Language LISP: Its Operation and Applications》是深入理解 PDP-1 上 Lisp 运作的权威资料。
核心内容
启动 Lisp 环境
在 PDP-1 上启动 Lisp 需要一系列精确的面板操作:
- 设置 Extend 开关:务必在运行其他 PDP-1 程序前将其复位(向下),否则 READ IN 功能将失效,这是常见的混淆来源。
- 加载 Lisp 镜像:挂载
lisp.rim磁带,按下 READ IN。 - 配置内存地址:将 TW 开关设置为
7750(八进制),定义 Lisp 存储的上限地址,然后按 CONTINUE。 - 设置栈长度:将 TW 开关设置为
400(八进制),定义推入列表(push down list)的长度,然后按 CONTINUE。 - 启用打字机输入:设置 Sense Switch 5(SS5)以启用打字机输入,再次按 CONTINUE。若未设置 SS5,输入将来自新插入的纸带。
- 设置地址开关:始终将 Address Switches 设置为
0004。这是 Lisp 的起始位置,便于后续通过 START 和 CONTINUE 快速返回。 - 错误处理:Lisp 遇到拼写错误或异常会停止。例如输入
nix而非nil。此时只需按 START 和 CONTINUE 即可恢复,但需确保地址开关指向起始位置4。 - 输入方式:Lisp 不以回车键结束输入,而是以空格结尾。例如,输入
oblist后加空格,可查看已定义的原子符号。 - 状态检查:在输入前,输入
nil并加空格。若 Lisp 正常运行,会在新行输出第二个nil。这是检查 Lisp 是否存活的最佳方式。
基础运算与八进制特性
PDP-1 Lisp 使用八进制算术,这是初学者容易困惑的地方:
(plus 1 2)输出3。注意使用plus而非+。(times 4 4)输出20。因为在八进制中,$4 \times 4 = 16$(十进制),而 $16$ 的八进制表示为20。
编写简单程序
以下是一个简单的 Lisp 程序示例(输入时使用 Return 和 Tab 键):
(prog (a b)
(setq a 4)
(setq b 4)
(plus a b)
(return (plus a b)))
输入末尾需加空格。该程序返回 10,因为 $4+4=8$(十进制),而 $8$ 的八进制表示为 10。
加载与保存代码
由于 Basic Lisp 未内置保存代码到纸带的功能,需先加载辅助函数:
- 加载辅助函数:挂载
lisp-defs.pt字母数字磁带,将 SS5 向下(读取纸带),然后向上(恢复打字机输入)。 - 验证加载:输出应显示
zerop pdef count等函数名。 - 保存自定义代码:
- 准备一个文本文件(如
test.lisp),包含自定义函数定义,确保最后一行以空格结尾。 - 使用工具(如
encode_fiodec)将文本转换为纸带镜像文件(如test.pt)。 - 挂载
test.pt,设置 SS5 向下读取,然后向上恢复输入。 - 按 START 和 CONTINUE 加载代码。
- 准备一个文本文件(如
保存函数定义
要保存函数定义以便后续加载,需使用 pdef 函数:
- 将 Sense Switch 3 向上,将输出重定向到纸带穿孔机。
- 输入
(pdef tt)(假设函数名为tt)并加空格。 - 将 Sense Switch 3 向下,恢复打字机输出,并保存生成的纸带。
内存持久性
PDP-1 使用磁芯内存(core memory),这是一种非易失性存储器。因此,关闭 PDP-1 电源后,内存中的数据不会丢失。下次启动时,只需将地址开关设置为 4 并按 START 和 CONTINUE 即可直接进入 Lisp 环境,无需从纸带重新加载。
混合汇编与 DDT 调试
通过设置较低的 Lisp 顶部地址,可以在内存顶部为 DDT(DEC Debugging Tool)留出空间。用户可以从 Lisp 跳转到 DDT 进行汇编级调试,具体操作需参考 PDP-1 Lisp 手册。
关键要点
- 八进制运算:PDP-1 Lisp 默认使用八进制,
times 4 4结果为20(八进制),而非十进制的16。 - 输入终止符:Lisp 命令以空格结束,而非回车键。
- Sense Switch 5 (SS5):控制输入源。向下为读取纸带,向上为打字机输入。加载代码时需临时切换至向下。
- Sense Switch 3:控制输出目标。向上为纸带穿孔机,向下为打字机。保存代码时需切换至向上。
- 地址开关:始终保持在
0004以便快速重启 Lisp 环境。 - 非易失性内存:PDP-1 的磁芯内存断电后数据不丢失,无需每次重启都从纸带加载 Lisp。
- 辅助函数加载:保存自定义函数到纸带需先加载包含
pdef等工具的lisp-defs.pt磁带。 - 错误恢复:Lisp 出错停止时,按 START 和 CONTINUE 可恢复,但需检查地址开关。
意义与影响
历史价值与技术传承
PDP-1 Lisp 是早期人工智能和符号计算的重要实践平台。它展示了 Lisp 语言在有限硬件资源下的实现方式,以及八进制系统对早期程序员思维的影响。通过重现这一环境,现代开发者可以更深入地理解编程语言的演变历程,特别是递归、符号处理和自动内存管理等核心概念的起源。
现代 AI 与复古计算的结合
本文档最后提到的“AI Tutor for PDP-1 Lisp”是一个极具创意的尝试。通过将 PDP-1 和 Lisp 1.5 的手册及文档喂给 ChatGPT、Claude Code 等现代大语言模型,可以创建一个智能编程助手。尽管该助手可能不完美,但它为学习古老技术提供了新的交互方式。这种结合不仅降低了学习门槛,还展示了现代 AI 在理解特定领域知识方面的潜力。
对开发者的启示
- 底层思维:操作 PDP-1 需要精确的面板设置和纸带管理,这培养了开发者对计算机底层工作原理的深刻理解。
- 调试技巧:
