Genera for the Initiated: Inside Symbolics Lisp Machines

Lobsters Hottest 事件

摘要

PHF(Philip)在一场演讲中以历史视角介绍 Symbolics Lisp 机与 Genera 操作系统的由来——从 McCarthy 的 Lisp 与元循环求值器、垃圾回收、Engelbart 的"所有演示之母"、Tom Knight 的 Knight TV 与 CADR 架构,一路讲到 MIT 团队创立 Symbolics,并现场演示 Genera。

<p><a href="https://lobste.rs/s/staj2z/genera_for_initiated_inside_symbolics">Comments</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/21 06:26

**TL;DR:PHF(Philip)以历史视角介绍 Symbolics Lisp 机与 Genera 的由来——从 McCarthy 的 Lisp、分时系统的垃圾问题、Engelbart 的"所有演示之母"、Tom Knight 的 Knight TV 与 CADR,一路讲到 MIT 集体辞职创立 Symbolics,并准备现场演示 Genera。** ## 开场:什么是 Lisp 机 大家好,我是 Philip,朋友们叫我 PHF。今天要讲的是 **Genera**——一个由 Symbolics 开发(或者说完善)的 Lisp 机操作系统。 先做一个发音声明:它是 **Genera 7.0**——读作 Genera,就像 *general* 里的那个 Genera。为此我还请了一位 Symbolics 前员工来佐证,因为人们总喜欢把它念成 "Generator" 或其他各种发音。就是 Genera,像 general 那样。 那么,什么是 Lisp 机?就是一台运行 Lisp 的机器。Lisp 是一种编程语言,可以说是计算机时代最基础的编程语言之一。 今天这场演讲会比较偏高层次,所以我敢肯定在座会有 Lisp 程序员想:好吧,这部分我先睡会儿。 ## John McCarthy 与 Lisp 的诞生 这是 Lisp 的发明者(或者说发现者)——**John McCarthy**。我很喜欢这张照片:McCarthy 的好照片不少,但这张是他在苏联拍的。 1968 年的一次旅行中,他访问了很多苏联城镇,见了不少俄罗斯教授。其中一位苏联研究者叫 **Yershov**,是计算机科学的远见者之一。Knuth 把流程图(block diagram)作为代码标注方法的发明归功于他——当 Knuth 把流程图介绍给西方时,实际上取自一篇 50 年代 Yershov 论文的译本。 Yershov 与世界各地学者有广泛联系:他与 Wirth 有着长期交往,也通过铁幕与 McCarthy 保持着长期来往——他们过去,他们又回来。所以这张是 McCarthy 和俄罗斯人喝酒的照片。另一张看起来非常"嬉皮",混在一群苏联远见者之中。还有八十年代他最后一次访问苏联时的照片,以及他和 Yershov 在白桦树下的合影,非常有俄罗斯风味。 顺带一提,McCarthy 的父母是共产主义者——美国共产党的硬核成员。他是在俄语环境中长大的,也是一个坚定的苏联同情者。上面那张照片拍摄于 1968 年的第二次旅行。如果你了解历史,也知道那年还发生了什么:苏联军队把坦克开进了捷克斯洛伐克,镇压当地抗议,而 McCarthy 恰好正在那里旅行。他出发后途经维也纳时,给斯坦福人工智能实验室的主任写了一封信,深受震动。这成了他人生的一个转折点——从那以后他变成了坚定的共和党人,彻底与苏联划清界限。 我一直对这个故事很好奇:既然 McCarthy 和苏联有这么深的渊源,为什么 Lisp 没有在苏联出现? ## 一页纸上的 Lisp:1959 年的 AI 备忘录 这是 McCarthy 发表的 Lisp 论文——1959 年的一份 AI 备忘录,是那篇著名论文之前的预印本,他基本上描述了 Lisp 的本质。 我喜欢这份 AI 备忘录,因为它把 **eval 函数**——Lisp 的核心——放在了一页纸上:一半是打字的,一半是手写的。你可以在这一页纸上看到 Lisp 的全部。它后来被称为 Lisp 的**元循环求值器**(meta-circular evaluator),因为它是用 Lisp 自身定义的。 你有 eval,它求值一个 S 表达式——其实就是一个列表。它查看列表的第一个元素,看那里的符号可能是什么,然后根据不同的符号执行某种操作。 那就是 McCarthy 所设想的 Lisp 的全部,而且已经足够在实际硬件上实现了。像 `quote` 这样防止列表被执行的操作,只是取列表的 rest,再取 rest,再取 rest,类似地去掉尾部取头部。而如果你去看 `first` 的定义,它又是用 first 来定义的——你可以推断它的行为,但要实现它,你就得往下一层。 这是 1959 年。当时所有语言都非常底层,所以这在概念上是一个巨大的飞跃。 随后语言传播开来——McCarthy 在 MIT,后来那里成为 AI 实验室,当时叫 **Project MAC**,由 DARPA 资助。它在 MIT 得到开发和完善,然后传播到其他社区、其他研究者。 ## 分时系统的垃圾问题 当时 Lisp 的主要问题是什么?所有系统都是分时共享的,你的 Lisp 解释器运行在一个与其他人共享的系统上。 Lisp 是最早不把显式内存管理强加给程序员的语言之一,这也意味着它运行时会产生大量**垃圾**——那些已分配但不再需要的结构。为收集这些垃圾,你需要一个解决方案。McCarthy 的解决方案(他也是垃圾回收器的发明者)就是**垃圾回收器**:一段遍历内存、收集无用数据的特殊代码。 如果你的 Lisp 跑飞了,它会生成大量垃圾、消耗大量资源,而且有很多递归——基本算法都是递归的。一个失控的 Lisp 会吃掉分时系统上的所有资源,人们开始抱怨。 ## 愿景:从"所有演示之母"到个人工作站 1968 年(实际上我想我记错时间了——对,是 68 年),**Engelbart** 做了一场演示,被称为**"所有演示之母"**(Mother of All Demos)。在这场演示中,他向大众展示了第一个工作站的概念:个人显示器、个人键盘、个人鼠标,还有一个额外的指向和选择设备。这个系统是交互式的,而且只服务于一个人。 这在当时是革命性的——那时你的主要输入方式还是索引卡、打孔卡、纸带、电传打字机之类的。这个想法传播开来,Engelbart 影响并启发了 **Xerox PARC** 对个人工作站的研究。与此同时,MIT 也在做自己的开发。 ### Knight TV:1972 年的第一台 Lisp 机 这是 1972 年,基本上是第一个构建 Lisp 机的人——**Tom Knight**。那是他的 **Knight TV**,带一个键盘。 它作为原型使用,是与 MIT 主系统交互的方式——主系统运行 PDP-10。之所以叫 Knight TV,是因为它字面上就是一台改装成终端的电视。当时我们知道如何用磁场弯曲电子束——可以用示波器做到这一点,那为什么不用电视呢?原理是一样的——这也是 80 年代任天堂娱乐系统采用的同一原理。 但那些电视连接到 **PDP-11**,所以需要一台单独的计算机来驱动它们、提供内存等。我相信最多可以连接 64 台。PDP-11 再与运行实际操作系统的 PDP-10 通信。这是早期获取个人工作站的实验性研究。 这是 **Richard Greenblatt** 和 **Tom Knight**,他们在演示 Lisp 机的原型阶段。他们想做的、最终做成的,就是:如果你有这项技术,就可以朝这个方向发展——为 Lisp 构建个人工作站。原因之一是你不想占用别人的资源,不想消耗其他人的资源。 这里还有一张键盘的照片——我敢肯定观众里有"键盘摄影师",听了 Jenner 的话之后想看到 Symbolics 键盘的画面。 这里有很多惯例,比如为什么 Emacs(它源自这个血脉)中 **Ctrl** 键如此普遍?因为 Ctrl 键在空格键旁边。而 **Meta** 键是使用额外键作为修饰键的原始用法,我们后来从它得到了 Alt 键和 Option 键以及所有其他功能。 ### Knight 论文中的两种架构 来自 Knight 的博士论文,他在其中描述了 Lisp 机的架构,并对比了 Alto 方案——即 Xerox PARC 的方案:通过以太网连接的独立计算机,它们都在本地,然后连接到 ARPANET,那就是你的小办公室;还有其他办公室通过互联网连接,彼此完全独立。 他将其与 Lisp 的愿景对比:后者更倾向于网络化的、分布式解决方案。有一个**文件计算机**为所有人提供共享存储,而不是各自独立存储;然后 PDP 充当路由器,连接到外部互联网。目标明确是**协作**——你希望能访问其他人的文件,其他人也能访问你的文件,由此产生交互。这也与 MIT 开放、自由的内部氛围一致——如果你想折腾别人的文件,你就折腾别人的文件,在很晚之前都没有真正的限制。 ## CADR 架构与微码 这就是 Lisp 机的架构。最初的 **CADR** Lisp 机——我不打算深入细节——键盘连接到一个多路复用器,CPU 在一条总线上,另一条总线上有各种外设。这在当时是一种偶然的现实选择。 这个系统也是**微码化**的:指令很宽,每条指令基本上给你 CPU 内部状态的全部操作能力。指令的性质完全取决于指令不同部分物理连接到哪里。你翻转一个位,就有一个继电器把它切换到另一个方向。编写这样的程序当然很痛苦。 所以解决方案是——与其直接编程,不如使用一种叫做微码的东西。**微码**基本上是位于硬件之上一层的汇编器,为你的 Lisp 机提供基石,Lisp 就运行在这上面。这是一种非常高级的汇编器。 使用微码和这种架构的目的,是为了优化系统运行 Lisp:你想要一些基本的并行执行,你想要一些基本的内存结构打包,你不想把这些都放在 Lisp 层面——你把它们放在指令层面。这在当时硬件条件下为运行 Lisp 提供了显著的速度提升。 比如一个巧妙的并行执行技巧:**一条底层指令可以同时执行类型检查和实际操作**。当你把两个数相加时,你可以同时计算结果应该是什么,也检查你相加的东西是否真的是数字。如果是数字,你就直接在一条指令中产生结果;如果不是数字,你就中止并忽略这次加法。所以在当时的硬件上,你始终获得了 **2 倍的速度提升**。 还有其他类似的巧妙技巧,就不展开讲了。但你可以用它们来运行 Lisp 和构建你自己的 Lisp。 ## 从 MIT 到 Symbolics:Lisp 机的商业化 那么你是怎么使用它们的? MIT 开始手工制造这些 Lisp 机,造了**大约 100 台**。都是手工制造的——我不知道是不是手工布线的,但工作量很大。MIT 无法供应足够的数量——他们毕竟不是做计算机生意的。 这是 70 年代末。我们从 70 年代初开始,他们在制造它;到 70 年代末,他们想:我们有了一个成功的产品。于是**整个 MIT 实验室决定集体辞职**,成立一家公司,把 Lisp 机作为硬件来销售。当然,大量 ARPA 资金涌入,AI 当时是大方向,你想为 AI 构建机器。所以一大群 MIT 实验室的人辞职并成立了 **Symbolics** 公司。 立刻就出现了分裂——还有一家公司同时成立,Greenblatt 我觉得去了 **LMI**。 Symbolics 的 CEO **Russell Nofske** 担任了 AI 实验室主任十年之久。其他名字都是计算领域的半神级人物:Tom Knight 在,还有 **David Moon**。这些人发明了 Lisp,并间接地由此发明了现代计算。 他们创立 Symbolics 后开始销售 Lisp 机。首先销售的是 Tom Knight 的原始设计——那就是 **LM-2**。如果你见过 CADR 系统的样子,会看到它其实还不是通用的、不是 Symbolics 的设计——是 MIT 生产的东西。在那个阶段,他们还在与 MIT 和其他 Lisp 公司共享研究成果。 然后他们想把它商业化——这本来就是目标。于是构建了 **3600 系列**:它是 Tom Knight 设计的演进版本——扩展了指令集,增加了内存,构建了更好的硬件,同时也改进了操作系统。 好吧,我想在这一点上,我应该实际演示一下这个系统了——我要做一个 Lisp 的演示。 Source: [Genera for the Initiated: Inside Symbolics Lisp Machines](https://www.youtube.com/watch?v=W2fGKjFoaOg)

相似文章

一次一台Lisp机器,创造未来

Hacker News Top

Larry Masinter和Frank Halasz回顾了他们在Xerox PARC的经历,讲述了Interlisp和NoteCards的开发,以及当前Medley/Interlisp的重生计划,反思了研究文化以及早期计算环境的持久价值。

探索 PDP-1 Lisp (1960年)

Hacker News Top

关于运行1960年历史性的PDP-1 Lisp实现的详细介绍,包括启动过程及其作为首个交互式编程环境的重要意义。

Smalltalk 的早期历史(1993)

Hacker News Top

Alan Kay 于 1993 年在 HOPL-II 会议上发表的论文回顾了 Smalltalk 在 Xerox PARC 的早期历史,追溯其根源:20 世纪 60 年代的人机共生研究、FLEX 机器、SketchPad/Simula,以及走向面向对象设计的 Dynabook 愿景。