PG Paul Graham 文集
100%
Part 5 · 早期文章 Early Essays

The Roots of Lisp

2001年5月

(我写这篇文章是为了帮助自己准确理解麦卡锡的发现。你在 Lisp 中编程并不需要了解这些内容,但对于任何想理解 Lisp 本质的人来说,这应该会有所帮助——无论从其起源还是其语义核心的意义上而言。Lisp 具有这样一个核心,是它的显著特征之一,也是它与其他语言不同、拥有众多方言的原因。)

1960 年,约翰·麦卡锡发表了一篇非凡的论文,在这篇论文中,他为编程所做的工作,堪比欧几里得为几何学所做的工作。他展示了,给定少数几个简单的运算符和一种函数表示法,你就可以构建出一门完整的编程语言。他将这门语言称为 Lisp,意为“列表处理”,因为他的一个关键想法是使用一种称为 列表 的简单数据结构来同时表示代码和数据。

理解麦卡锡的发现是值得的,这不仅因为它是计算机史上的一座里程碑,还因为它是一个模型,预示着编程在我们这个时代的发展趋势。在我看来,迄今为止,编程只有两种真正简洁、一致的模型:C 模型和 Lisp 模型。这两者仿佛是高地上的两个制高点,其间则是沼泽般的低洼地带。随着计算机变得越来越强大,新开发的语言正稳步向 Lisp 模型靠拢。在过去 20 年里,一种流行的新编程语言配方是:以 C 的计算模型为基础,再从 Lisp 模型中零敲碎打地添加一些部分,比如运行时类型检查和垃圾回收。

在本文中,我将尝试用尽可能简单的术语来解释麦卡锡的发现。重点不仅在于了解四十年前某人得出的一个有趣的、理论性的成果,更在于展示语言未来的发展方向。Lisp 的不同寻常之处——实际上,也是 Lisp 的定义性特征——在于它可以用自身来编写。为了理解麦卡锡这句话的含义,我们将追溯他的步骤,把他的数学符号翻译成可运行的 Common Lisp 代码。