Lisp 的根源

2001年5月

(我写这篇文章是为了帮助自己理解 McCarthy 究竟发现了什么。你不需要了解这些东西也能用 Lisp 编程,但它应该对任何想要理解 Lisp 本质的人有所帮助——既包括它的起源,也包括它的语义核心。它拥有这样一个核心是 Lisp 的显著特征之一,也是为什么 Lisp 与其他语言不同,拥有多种方言的原因。)

1960年,John McCarthy 发表了一篇卓越的论文,他在编程领域所做的事情,类似于欧几里得在几何领域所做的事情。他展示了如何通过少量的简单操作符和一个函数符号,构建出一个完整的编程语言。他将这种语言称为 Lisp,即“List Processing”(列表处理)的缩写,因为他的一个关键思想是使用一种名为_列表_的简单数据结构来同时表示代码和数据。

理解 McCarthy 的发现是值得的,不仅仅是因为它是计算机历史上的一个里程碑,而且因为它也是编程在当今时代的发展趋势的模型。在我看来,到目前为止,已经出现了两种真正清晰、一致的编程模型:C 模型和 Lisp 模型。这两种模型似乎是高地,而它们之间则是沼泽般的低地。随着计算机变得越来越强大,正在开发的新语言已经稳步地向 Lisp 模型靠拢。过去 20 年来,一种流行的编程语言开发方法是采用 C 模型的计算方式,并以零敲碎打的方式添加从 Lisp 模型中提取的部分,例如运行时类型和垃圾回收。

在本文中,我将尝试用尽可能简单的术语来解释 McCarthy 的发现。重点不仅仅是了解四十年前某人发现的一个有趣的理论结果,而是要展示语言的发展方向。Lisp 的独特之处——事实上,Lisp 的决定性品质——在于它可以自己编写自己。为了理解 McCarthy 的意思,我们将重走他的步骤,并将他的数学符号翻译成可运行的 Common Lisp 代码。