在 64K 字节内存中可以做的 LISP 风格的事(2019)

Hacker News Top 新闻

摘要

探索在内存限制为 64K 字节时,LISP 能做到什么程度,将现代的 Kilo LISP 与 IBM 704 和 DEC PDP-1 上的早期实现进行比较,并附上早期的示例程序。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/27 02:06

# T3X.ORG lisp64k/index 来源:https://t3x.org/lisp64k/index.html --- ## 在 64K 字节的内存中能做的 LISP 趣事 这里的“在 64K 字节中”是指 LISP 系统、运行时栈和 cons 池总共占用 64K 字节\!这相当于你的 LISP 系统在一台基本配置的 DEC PDP\-11 上,或在一个 tiny 模型的 PCDOS 程序中所能获得的空间。这可能比最早的 LISP 实现所能使用的空间还要少一点。 磁芯代码环(https://t3x.org/lisp64k/toroids.html)1960 年,LISP 首次在麻省理工学院(M\.I\.T\.)的 IBM 704 电子数据处理机上实现。这台机器拥有 32K 个字的 36 位磁芯存储器,[\[1\]](https://t3x.org/lisp64k/refs.html#1)在这里,每一位确实都对应一个微小的铁氧体磁环(https://t3x.org/lisp64k/toroids.html)。因此,总共有 36×32768=1,183,608 个微小的磁环,安置在一个不怎么小的钢架里。704 需要一间相当宽敞、地板经过加固并配有工业空调的机房。一套典型配置的总重量约为 10 公吨。 LISP 系统本身占用了 12K 个字的内存,而一个字可以容纳一个完整的 cons 单元,[\[1\]](https://t3x.org/lisp64k/refs.html#1)因此,这台机器提供给 LISP 的空间略少于 20K 个单元。不过,麻省理工学院的 IBM 704 已经算是配置相当齐全的机器了。许多 704 系统仅配有 8K 个字,甚至 4K 个字的内存[\[2\]](https://t3x.org/lisp64k/refs.html#2)——这点空间根本不足以运行 LISP 系统。下面是来自[\[1\]](https://t3x.org/lisp64k/refs.html#1)的一个 LISP 1\.0 示例程序: `` DEFINE (( (SUBST (LAMBDA (X Y Z) (COND ((ATOM Z) (COND ((EQ Y Z) X) (T Z))) (T (CONS (SUBST X Y (CAR Z)) (SUBST X Y (CDR Z))))))) )) () `` 请注意,程序通常会尽量写在较少的行里,因为它们必须打孔录入穿孔卡,或通过电传打字机输入,而电传打字机会把输入内容回显在纸上。运算符 \(DEFINE\)、参数 \(对于 DEFINE,放在双层括号中\) 和环境必须作为三个独立的表达式提供给 LISP 系统。 不过,也有更小的计算机可以运行 LISP。1964 年出现了 PDP\-1 LISP,这是 DEC 的 PDP\-1 计算机上的一个实现,能够在仅有 4096 个 18 位字存储空间的系统上运行,其中系统本身大约占用 2000 个字。[\[3\]](https://t3x.org/lisp64k/refs.html#3)即使在 PDP\-1 上,一个 cons 单元也能装进一个字,因此系统大约有 2000 个单元可用。下面是来自[\[3\]](https://t3x.org/lisp64k/refs.html#3)的一个 PDP\-1 LISP 示例程序——没错,PDP\-1 LISP 使用小写字母: `` (rplacd (quote r1) (quote (expr (lambda (m l) (cond ((null l) m) (t (r1 (cons (car l) m) (cdr l)))))))) (rplacd (quote reverse) (quote (expr (lambda (l) (r1 nil l))))) `` 下文将使用的 LISP 系统是 Kilo LISP(https://t3x.org/klisp/index.html),这是一个用 ANSI C \(C89\) 编写的可移植实现,可以编译为一个在 64K 字节内存中运行的 tiny 模型 PCDOS 可执行程序。LISP 系统本身大约占用 13K 字节,剩余空间足以容纳 8192 个 cons 单元,每个单元占用 5 字节 \(16 位 car、16 位 cdr,以及 3 位标记,最后一项向上取整为 8 位\)。下面是一个示例程序: `` (setq assoc (lambda (x a) (cond ((null a) nil) ((eq x (caar a)) (car a)) (else (assoc x (cdr a)))))) `` Kilo LISP 系统提供的 cons 单元数量不到大型 IBM 704 配置的一半,而可用空间大约是最低配置 PDP\-1 的四倍。当然,早期计算机的速度很慢:IBM 704 的时钟频率为 40kHz \(0\.04 MIPS\),PDP\-1 的运行频率为 150kHz \(0\.15 MIPS\),但这些机器上的 LISP 系统都是用汇编语言精心手工编写的,而且其硬件通常每个时钟周期就能执行一条指令。 如今,你大概可以用一部廉价智能手机同时模拟 IBM 704 和 PDP\-1,让两者都以原始硬件数倍的速度运行,同时还玩着你最喜欢的平台跳跃游戏。因此,虽然 704 或 PDP\-1 大概能运行下面所有的示例程序,但肯定得花上不少时间。本文余下部分将着重讨论内存方面,而忽略运行时间。 这里可以让你初步感受(https://t3x.org/lisp64k/init.html)一下早期 LISP 的样子。 ---

相似文章

探索 PDP-1 Lisp (1960年)

Hacker News Top

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

Unix拼写检查如何在64 KB内存中运行

Hacker News Top

本文详细介绍了Douglas McIlroy如何通过词干提取、布隆过滤器和Golomb编码,将250kB的字典压缩到64kB RAM中用于Unix拼写检查,实现了接近理论极限的压缩效果。

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

Hacker News Top

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