关闭

lisp 鸟瞰...

869人阅读 评论(0) 收藏 举报

在人工智能的很多研究中,Lisp 家族语言是最古老的、并仍然是最广泛使用的工具。不象 Fortran 那样,在很大程度上出于经济上的动机而保持语言存活了四分之一个世纪,Lisp 在 AI 社区的兴旺是因为它的某些特征的优越。

Lisp 至关重要的一个方面是试探性程序开发的概念。符号到值的任何提交(commitment)可以延迟直到这样的决定不可避免,即使如此它可以用很小的代价逆 转(reverse)。这允许我们快速的探索可供选择的设计并逐步增加的建造程序。Lisp 的语法是简单的、并且它的程序自然的表示为数据结构,所以很容易写操纵其他程序的程序。

还有一些额外的因素被结合了进来,对 Lisp 的持久流行做出了贡献[Hayes (1987)]: 不象 Fortan 或 Cobol,Lisp 持续自由的演化。直到最近 Lisp 程序的经济上的重要性仍是非常低的,这意味着没有任何压力要冻结语言的定义为一个标准的特征集。作为一门 AI 语言,Lisp 长期用来攻击“艰深”问题,这种任务导致了很多新特征和强力工具。Lisp 社区总是接受一种工具建造文化,工具开发者自身典型的也是工具的使用者的事实大力促成了这种事态。Lisp 是非常易于扩展的("增加更多泥巴") 并自愿“让机器去做”。AI 研究总是准备扩展计算机的能力来更好的使用人类资源,这个政策经常导致工具超越了所在时代。被同样的动机所刺激,还有对编程环境和个人工作站的非常早期的 兴趣。

这种语言创新的精神已经融入成 Lisp 历史的一部分。这已经由 McCarthy (1978) 和 Stoyan (1980) 详细的写入编年史中。Lisp (List Processing Language) 最初设计为 Fortran 的一个扩展。John McCarthy 那时是 Dartmouth 学院的数学助理教授,他对使用计算机做符号计算(就是说,数学表达式的简化)发生了早期的兴趣, 在“Dartmouth Summer School on Artificial Intelligence”期间受 Newell 和 Simon 对 IPL 介绍的进一步刺激,这个研讨班是 1956 年 McCarthy 和 Shannon 和 Minsky 一起组织的。尽管那时没有任何参与者对如何最终完成人工智能有任何概念,数值计算完全不重要好象是明显的,而操纵符号表达式的能力好象是关键性的。IPL 已经包括了表处理和递归的想法,但它在风味上仍是非常“低级的”。Fortan,刚刚被 IBM 表彰为第一个真正的“高级”编程语言,好象是在正确方向上的前进了一步。不幸的是 Fortran 的设计受满足高效数值计算需要的支配,而导致的僵化使它对于操纵 McCarthy 感兴趣的各种应用需要的高度动态的结构是一个非常薄弱的基础。一个自包含的表处理语言好象是更好的解决方案。此时 McCarthy 也是派到欧洲 Algol(Algorithmic Language)委员会的美洲代表团成员。在这里它提出了条件表达式的概念并依次受到其他成员想法的影响。McCarthy 现在正视 Lisp 为带有 Algol式语法的一个编译语言,但是它的第一个原型 Lisp I,有着非常不同的风味。

Lisp“稀少的”语法结构和解释性本 质是非常偶然的发展出来的。我们对这些事件的讨论遵循 Stoyan (1980) 给出的细帐。在 1958 年晚些时候 McCarthy 获得了在 MIT 电子工程系的一个助理教授职务。与 Minsky 一起,接着是一个数学助理教授,他建立了“MIT 人工智能计划”,配备了 2 个程序员,1 个秘书,1 个电传打字机和 6 个学生(其中有 Kleinrock、 Bobrow 和 Slagl - [Stoyan (1980), 165])。 这个小组开始从事写 Lisp 编译器的一个适度的尝试,但是 Fortan 计划报告的 30 “人年”使完全实现好象是一个不可完成的目标。最初用汇编语言手工编码了一些简单的表处理函数和圆括号包围的前缀表达式(就是 “(plus 2 2)” )用于测试。这种表示法后来被称为“Cambridge Polish”。纪念 Quine (一个(麻省)剑桥哲学家) 和 Lukasiewicz (表达式的“波兰表示法”前缀形式的发明者)。尽管实验得到了合理的进展,而递归和垃圾收集好象是小组必须最终解决的最困难的障碍,仍然没有语言的精确定 义。在 1959 年 McCarthy (1960) 写了一篇论文来展示 Lisp 等价于图灵机,能作为“可计算性”的可作为替代的理论。为此他需要一个一致的表示法,可以使用符号表达式来描述 Lisp 表达式和 Lisp 函数二者。这导致了“引用”和“求值”操作符,它们最初单独的用作促成一个证明的理论工具。但是这篇论文带来了大量未预期的结果。这个计划的程序员之一, S. Russell 用汇编语言实现了“求值”,从而在编译器计划完全开始之前,提供了测试手工编码的函数的方式。为了以解释性方式运行这样的简单 Lisp 程序,所有表达式都必须是嵌套进去,这样程序自身成为应用于某些数据的一个表达式。幸运的是 MIT 计算实验室也介入了 MAC (Multi Access Computing)计划中;最早期的努力是使用电传终端进入分时系统中。Lisp 解释器与交换式电传终端一起使用(著名的“读,求值,打印”周期)逐渐变得非常流行。这个解释器识别的记号后来被称为“S-语言”,而第一个工作的 Lisp 系统在 1959 年 Association for Computing Machinery [McCarthy (1959)]年度会议上提出了。Lisp 1 有大约 90 个预定义函数,第一个应用例子是做初等函数的微分的一个简单例程。这个解释器马上被进一步精制和扩展为 Lisp 1.5 [140 个函数 - McCarthy (1962)],它拥有所有后来的 Lisp 系统的“祖先”的荣耀。Lisp 1.5 迅速成为对于在 Boston 区域内从事语言转换和人工智能工作的人很有吸引的工具。当他们离开并受雇于其他地方的时候,他们经常带上一个复本,因而导致了广泛的分布。 McCarthy 自己在 1962 年去了 Stanford 大学。因为他的研究转移到更加理论性的领域,而没有被牵涉到语言的进一步开发中。

Lisp 2,Algol 式的编译版本从未出现。这有很多原因。首先,在解释性上下文中 S 语言“稀少的”语法(Lisp = "Lots of Irritating, Spurious Parentheses")被证实是资产而不是债务。它使分析表达式非常的容易,因此允许快速开发嫁接在 Lisp 之上的子语言。几乎所有所谓的“AI 语言”的都以这种方式实现的,很多 Lisp 程序员猛烈的抵制介入语法糖衣的额外层。Lisp 2 死亡的另一个因素是归咎于“creeping featuritis”[Clinger (1988a), 25]。60 年代早期在 BBN(Bolt, Beranek 和 Newman)成立了一个委员会定义 Lisp 2 的特征。这导致语言规定迅速增长,为了保持“每个人”都高兴而增加新特征。实现由于财务上的限制最终被废弃了并从未复活过。在 Edinburgh 大学开发的 Pop [Burstall 等 (1971), Burton 和 Shadbolt (1987)],可能最接近于 Lisp 2 的样子。现代 Lisp 系统的语法同最初的“S-表示法”是一致的。McCarthy 自己总是称之为“M-表示法”[McCarthy et al. (1962)],它也用于 Allen (1978)优秀的教科书中。Allen 称“M-表示法”为规定而“S-表示法”是表示语言。

很 多基于 Lisp 1.5 的主要方言出现了。所有这些都基于一个共同祖先,但在提供的特征和工具上显示了引人注意的区别。这些不同在传统上通过叫做“兼容函数”的包来跨越,它在另 一个上下文中解释一个语言的构造。当然,这种方式在计算上是有花费的,而对于支持严肃工作通常需要某种形式的“手工”转换。

定理证明(比如 SAINT 和 SIN)和代数公式操纵系统(比如 MACSYMA)方面的工作,在 MIT 的 MAC 计划导致了 MacLisp[Moon (1974)]。这个方言特别注意了数值计算的效率,这是对很多早期 Lisp 系统的常见的批评。MacLisp 自豪于一组丰富的数据类型(数组,hunk ...),用于程序开发和调试的用户友好的环境,和一组丰富的预定义函数(大约 300 个)。它还担当了 ZetaLisp 的基础,这是用于 MIT (现在是 Symbolics)的 Lisp-机器计划[Weinreb 和 Moon (1981)]的 Lisp 版本。“标准” Lisp 和它的后代 “可移植”标准 Lisp [Griss 和 Morrison (1981)] 由 Hearn 和其他人在 Utah 大学设计和实现。 最初用作 REDUCE,和其他公式操纵系统的基础,它现在是 Hewlett Packard 工作站的 Lisp 方言,它的名字有某种误导,因为它明确的不是 Lisp 标准,并且也不比其他方言容易移植。

在 J. McCarthy 离开 MIT 到 Stanford 的时候,很多他以前的研究生被其他大学和研究机构雇佣。Bobrow 两兄弟工作于 Bolt, Beranek and Newman,一个美国研究公司。D. Bobrow 加入了在 California 的 Xerox Palo Alto 研究中心(PARC)。一段时间内在这两个机构都维持着一个联合开发的 Lisp 系统(Interlisp - Teitelman (1974))。Interlisp 也用在 Stanford 大学,在这里它成长为今天能获得的最复杂的 Lisp 系统(大约 600 个预定义函数),带有大量的工具和被认为最用户友好的环境[Sandewall (1978), Teitelman 和 Masinter (1981)]。这个系统的一个更新版本(Interlisp-D)后来在 Xerox “Lisp 机器”上(就是 Dandelion, Dorado 和 Dolphin),还被移植到 Siemens 和 IBM 设备上。

Bobrow 两兄弟的第二个,R. Bobrow,最终担任 California 大学在 Irvine (UCI)的教师,在这里他开发了 UCI-Lisp [Meehan (1979)],这是在很多研究机构流行的方言。在很多年中 UCI-Lisp 充当 Carnegie Mellon 大学的 AI 程序的主要编程工具。

自从捐赠了第一个 PDP6 到 MIT 的计算实验室,DEC10 行列的机器在整个世界成为 AI 研究的标准设备; 同样的,Lisp 被控制为一个编程工具。这种现象可以部分的由它被设计为一个真正分时机器的事实来解释,当时多数其他厂商的设备仍是面向批处理的。快速人/机交互被强制为 支持 AI 的典型编程风格。另一个起作用的因素在于主要的 AI 中心(MIT、Stanford、Carnegie Mellon、Edinburgh)使用这些机器用于他们大批的工作的事实;使得要运行他们的软件的拷贝就必须是选用 Lisp,而它又是自由发布的。在七十年代后期和八十年代的 Unix 操作系统的流行日益增长,仍然在 DEC 的小型机行列上产生了大量的 Lisp 实现。 PDP11 Lisp,再次基于 MacLisp,在 Harvard 开发出来。当它的一些职员去 California 大学 Berkeley 分校的时候被拿到了美国西海岸,这里已经对 Unix 有了强烈的兴趣。FranzLisp [Foderaro (1979)]是最终出现的方言。它是基于 Unix 的并运行在 VAX 和其他在大学环境流行的机器上(比如 Suns, ...)。它的持续流行很大程度归功于它的低大学使用价格。

最近在标准化上的兴趣复兴了,很大程度上受使用 Lisp 作为专家系统开发工具的刺激。很多主要计算机厂商委托设计叫做 Common Lisp 的“标准” Lisp 变体[Steele (1984)]。“最初的目标是规定足够接近 MacLisp 后代家族的每个成员的 Lisp,保证这些实现乐于朝向这个公共定义来发展自身。... 委员会的一个主要的子目标是用这个 COMMON LISP 写的程序可以实现直接的源码-可传送,而不用管下层硬件” [Brooks 和 Gabriel (1984), p. 1]。迄今为止这个计划好象成功了。现在已经存在了很多实现。但是,仍有待观察对规整 Lisp 以前不受限制的“特征”增加的尝试是否最终会成功[Allen (1987)]。仍有怀疑的余地,因为多数 Lisp 程序员是高度个人主义的,在风格问题上带有强烈的信念,因为 Lisp 使实现“新”特征非常容易。已经有对 Common Lisp 的大小和它的更加不可思议特征(经常包括它们来确保与过去兼容)的普遍批评。但是,这是一个好机会,商业压力将至少导致一个公共基础,更加专门的方言或子 集可以萌发于此,还有一个希望,反映在朝向 ISO Lisp 标准的努力上。

新出现的方言之一是 Scheme,一个词法作用域版本的 MacLisp(象 NIL, T, ..)。Scheme 在 MIT 用来讲授计算机编程的介绍性课程,并在 Abelson 等人(1985)的一本优秀的书中被加以良好的文档。从作者的观点看来 Scheme 是一个非常有表现力的和优雅的语言,围绕着一个简单的小核心,准备了正交性和非常灵活的特征。嵌入到适当的交互编程环境中,它在实践上反击了通常针对  Lisp 的所有批评。它唯一的缺点在于缺乏与传统的 Lisp 系统特别是 Common Lisp 的兼容性。

并行处理近些年已经成为主要的研究焦点,由此产生了很多语言提议。MultiLisp [Halstead (1985)] 是一个有趣的基于 Scheme 的例子。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50986次
    • 积分:1134
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:3篇
    • 译文:0篇
    • 评论:16条
    最新评论