|
Scheme 语言介绍
Wolfgang Kreutzer
翻译:寒蝉退士
原文:http://www.cosc.canterbury.ac.nz/~wolfgang/cosc302/Chap2.3.html
译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。
APL 如同钻石,有着美妙的晶体结构;它的所有部分都以一致和优美的方式关联在一起。但是如果你尝试以任何方式扩展这种结构 - 即使是增加另一个钻石 - 你将得到一个丑陋的杂种。在另一方面,LISP 如同泥球。你可以向它增加任意数量的泥巴,它看起来还是个泥球。
[J. Moses, as quoted by Steele and Sussman (1978)].
译序:本文是介绍人工智能的一本书的一章,Lisp 的赫赫声名缘于它是人工智能专家们做符号处理的主要编程工具。从计算机技术的角度来说,Lisp 是函数式编程语言的代表,有着“数学基础”领域中 lambda 演算的理论背景。Lisp 的修正版本 Scheme 有着一定的研究价值。
目录:
历史演化和关键概念
在人工智能的很多研究中,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 标准,并且也不比其他方言容易移植。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |