← 返回信息流
AI 资讯Hacker News·2 小时前

探索1960年PDP-1上的Lisp语言

原标题:Exploring PDP-1 Lisp (1960)

速览

本文探讨了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 需要一系列精确的面板操作:

  1. 设置 Extend 开关:务必在运行其他 PDP-1 程序前将其复位(向下),否则 READ IN 功能将失效,这是常见的混淆来源。
  2. 加载 Lisp 镜像:挂载 lisp.rim 磁带,按下 READ IN。
  3. 配置内存地址:将 TW 开关设置为 7750(八进制),定义 Lisp 存储的上限地址,然后按 CONTINUE。
  4. 设置栈长度:将 TW 开关设置为 400(八进制),定义推入列表(push down list)的长度,然后按 CONTINUE。
  5. 启用打字机输入:设置 Sense Switch 5(SS5)以启用打字机输入,再次按 CONTINUE。若未设置 SS5,输入将来自新插入的纸带。
  6. 设置地址开关:始终将 Address Switches 设置为 0004。这是 Lisp 的起始位置,便于后续通过 START 和 CONTINUE 快速返回。
  7. 错误处理:Lisp 遇到拼写错误或异常会停止。例如输入 nix 而非 nil。此时只需按 START 和 CONTINUE 即可恢复,但需确保地址开关指向起始位置 4
  8. 输入方式:Lisp 不以回车键结束输入,而是以空格结尾。例如,输入 oblist 后加空格,可查看已定义的原子符号。
  9. 状态检查:在输入前,输入 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 未内置保存代码到纸带的功能,需先加载辅助函数:

  1. 加载辅助函数:挂载 lisp-defs.pt 字母数字磁带,将 SS5 向下(读取纸带),然后向上(恢复打字机输入)。
  2. 验证加载:输出应显示 zerop pdef count 等函数名。
  3. 保存自定义代码
    • 准备一个文本文件(如 test.lisp),包含自定义函数定义,确保最后一行以空格结尾。
    • 使用工具(如 encode_fiodec)将文本转换为纸带镜像文件(如 test.pt)。
    • 挂载 test.pt,设置 SS5 向下读取,然后向上恢复输入。
    • 按 START 和 CONTINUE 加载代码。

保存函数定义

要保存函数定义以便后续加载,需使用 pdef 函数:

  1. 将 Sense Switch 3 向上,将输出重定向到纸带穿孔机。
  2. 输入 (pdef tt)(假设函数名为 tt)并加空格。
  3. 将 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 需要精确的面板设置和纸带管理,这培养了开发者对计算机底层工作原理的深刻理解。
  • 调试技巧
查看原文 →obsolescence.dev