LISP 语言诞生
John McCarthy 创建 LISP,成为人工智能研究的主流编程语言长达数十年。
事件概述
1958年,John McCarthy 在 MIT 开发了 LISP(LISt Processing)编程语言。LISP 采用独特的全括号语法和递归结构,特别适合符号处理和列表操作,这些特性使其成为人工智能研究的首选语言。LISP 引入了垃圾回收、动态类型、函数式编程等革命性概念,深刻影响了后来的编程语言设计。在随后四十多年里,LISP 及其方言(如 Common Lisp、Scheme)主导了 AI 编程,直到 Python 等现代语言兴起。
深度学习笔记
背景、原理、影响与要点,一次读懂这个事件
背景与脉络
1958 年,John McCarthy 在 MIT 提出 LISP(LISt Processing)。达特茅斯会议后,他认定现有语言不适合符号推理这一 AI 核心,遂以丘奇 λ 演算为数学基础、借鉴 IPL 表结构,设计一门“代码即数据”的语言。首份实现 1960 年跑在 IBM 704 上(学生 Russell 把 McCarthy 论文里的 eval 写成机器码,令作者意外)。1950 年代 Fortran 只擅长数值,LISP 却把符号表达式当一等公民,迅速成为 AI 研究的通用语。
核心要点
- 11958 年 McCarthy 在 MIT 构思 LISP,1960 年论文正式确立设计。
- 2以丘奇 λ 演算为数学基础,把符号表达式(S-表达式)作为统一表示。
- 3代码即数据(同像性):程序本身也是 S-表达式,可被程序改写。
- 4car/cdr 源自 IBM 704 寄存器结构,分别取表头与表尾,cons 构造对。
- 5首创自动垃圾回收,用递归而非循环作主要控制结构。
- 6早期即具备高阶函数、动态类型、REPL 等影响深远的特性。
原理与技术细节
LISP 的灵魂是“一切皆表”。原子(符号、数字)与 cons 单元(一对指针)共同构成 S-表达式;列表 (A B C) 是嵌套的 cons 链,末尾为 NIL。因为程序和数据共用一种结构,LISP 能像处理数据一样处理自己的代码——这正是宏与“程序写程序”能力的来源。求值遵循 eval/apply 循环:读入 S-表达式,符号则查环境绑定,列表则把首项当算子、递归求值其余项后调用。递归是主要控制流,配合条件表达式。内存上,cons 不断创建单元,空闲的由垃圾回收周期性回收,免去手工管理。car/cdr 之名来自 IBM 704 的“地址/减数”寄存器字段,分别是取表头与去头后的剩余部分。
影响与后续
LISP 主导了 1960—1980 年代的 AI 研究,催生了 SHRDLU、MACSYMA 与专家系统。其概念——垃圾回收、高阶函数、REPL、代码即数据——已渗入 Java、Python、JavaScript 等主流语言。AI 寒冬后商业热度消退,但 Clojure、Scheme、Common Lisp 仍用于科研与金融。今日神经符号研究又把 LISP 式符号推理与学习重新结合。
学习要点
- 用同一种数据结构表示代码与数据,是元编程能力的根本。
- 递归 + 条件 + 高阶函数足以表达复杂的符号算法,无需循环语法糖。
- 自动内存管理并非现代发明,LISP 早在 1958 年就已实践。
术语表
LISP 中统一的符号表达式,原子或 cons 对,代码与数据皆以此表示。
程序自身也是可被程序读写的数据结构,从而能方便地生成与变换代码。
系统自动回收不再使用的内存单元,LISP 为首个引入此机制的编程语言。