历史背景
20世纪50年代中期,在大多数计算机处理的都是数值数据等,包括语言学、心理学和数学领域上一些人们开始对人工智能产生了兴趣。觉得必须实现共同需要的一个方法,使计算机能够处理链表中的符号数据,允许语言的处理、信息存入和检索、定理证明的过程机器化。IBM是首先对人工智能开发有兴趣的商业机构之一。
1958年夏天,来自麻省理工学院的人工智能研究先驱约翰·麦卡锡(John McCarthy)参与IBM资讯研究部的工作,研究符号运算及应用需求。可是,IBM旗下的Fortran表处理语言却未能支援符号运算的递归、条件表达式、动态存储分配及隐式回收等功能。John McCarthy于1958年秋季回到麻省理工学院后,和Marvin Minsky组成了人工智能项目。开展一个表处理软件系统来实现McCarthy提出建议采纳者程序的工作,尔后推动了表处理语言LISP的产生。2
发展历程1960年4月,McCarthy以《递回函数的符号表达式以及由机器运算的方式,第一部》为题,于ACM通讯上发表LISP设置。McCarthy的学生Steve Russell根据该论文,以IBM 704于麻省理工学院的计算机运算文中心成功执行了第一版的LISP。
1962年,McCarthy及人工智能小组按LISP 1的编译基础上改良出LISP 1.5版本。
1969年9月,史丹福大学人工智能实验室的Lynn Quam与Whitfield Diffie推出的Stanford LISP 1.6广泛地应用于使用TOPS-10系统的PDP-10计算机系中。Stanford LISP 1.6版本自麻省理工智能项目更新LISP 1.5成MACLISP及BBN科技公司推出的InterLisp成功后,渐被弃置。
自1960代末年至1980年初年,各种更新LISP版本涌现,有源自加大伯克来分校的Franz Lisp、在AutoCAD运行的AutoLISP前身XLISP、犹他大学开展的Standard Lisp及Portable Standard Lisp、专属于Lisp机器上运行的ZetaLisp、源自法国国家信息与自动化研究所的LeLisp、以及MIT人工智能实验室的Gerald Sussman与Guy Steele所开发的Scheme等。
1984年,改良自MacLisp、集各版本大成、跨平台、且被目为事实标准的Common Lisp诞生。至1994年,美国国家标准学会(ANSI)对Common Lisp语言进行了标准化。
自稳定运行的Common Lisp出现起,再有各机构按各自所需而开展后续Lisp,包括1990年来自欧洲用户的EuLisp及自由开源的IsLisp,ACL2等。
数据结构在LISP语言中,数据和函数都是采用符号表达式定义的,这种符号表达式称为S一表达式,它是原予和表的总称。原子分为符号原予和数原子。符号原子是指有限个大写字母和数字组成的字符串,其中第一个符号必须是字母。原子NIL和T分别表示逻辑假(或空表)和逻辑真。数原子是指一串数字,通过符号表示其正负。3
特点**(1)函数性**
函数型语言的基本特点是用函数定义和函数调用构成程序。程序员用函数定义和函数调用组成的表达式来描述求解问题的算法,表达式的值就是问题的解。用FORTRAN、PAS—CAL和C等传统程序设计语言编写的程序是按一定顺序执行的命令序列,执行结果就是问题的解。用这些语言编程时,程序员要规定求解的顺序,即要描述控制流。用LISP语言编程只需要确定函数之间的调用,把函数执行的细节交给LISP系统来解决。因此,LISP语言是更加面向用户的语言。
传统的程序设计语言是适应冯·诺依曼型计算机系统结构而发展起来的,LISP在诺依曼型计算机上运行的效率要低一些。计算机系统结构的发展,使得函数型语言有着广阔的前途。为了适应当前微型机发展水平和程序员使用传统语言编程的习惯,LISP语言增加了许多非函数型的语言成分,例如,prog、go等函数,所以,LISP已不是纯函数型语言,它既具有函数语言的功能,又具有传统语言的功能。
(2)递归性
递归函数是指在函数的定义中调用了这个函数本身。所有的可计算函数已被证明都可以用递归函数的形式来定义。
由于LISP的主要数据结构是表,而且表是用递归方法定义的,即表中的一个元素也可以定义为一个表,因此,程序员用LISP提供的自定义函数来定义用户自己的函数时,可以用递归函数的形式来定义自己的函数。自定义的递归函数能够很方便地对递归定义的表进行操作。递归定义的方法使程序简明、优美,程序员应充分利用递归程序设计方法。
(3)数据与程序的一致性
LISP的一段程序是用户的一个自定义函数,这个函数可被其他函数调用,或者说,一段程序可被其他程序调用。函数执行后的输出数据称为这个函数的返回值。一个函数被其他函数调用,就是调用了这个函数的返回值。在LISP中,函数与这个函数的返回值是一致的。这一特点使得LISP的编程就是定义一个宏函数,也使得LISP语言的扩充比较容易。可以根据应用领域的需要,使用LISP提供的基本函数扩充若干面向专门应用领域的宏函数。
(4)自动进行存储分配
用LISP语言编程时,程序员完全可以不考虑存储分配问题。程序中定义的函数、数据和表等都能在程序运行时,由LISP自动提供。对不再需要的数据,LISP自动释放其占用的存储区。
(5)语法简单
LISP的语法极其简单,对变量和数据不需要事先定义和说明类型。LISP语言的基本语法就是函数定义和函数调用。因此,LISP语言的程序便于修改、调试和纠错,可以边实验边设计,通过不断修改和增加用户自定义函数来构成复杂的系统。
LISP语言不仅在专家系统和CAD领域有广泛的应用,在符号代数、定理证明、机器人规划等领域也有广泛的应用。影响LISP语言使用的主要原因有:一是LISP是非可视化语言;二是LISP在通用计算机上的运行效率较低;三是LISP的数值计算能力较差;四是人们对函数型语言的编程风格不习惯。4
常见版本LISP语言版本很多,常用的有:
(1)MACLISP语言:1971年由MIT人工智能实验室研制,它比较注重效率、地址空间的保护和构造工具的灵活性。
(2)INTERLISP语言:1978年由DEC和XEROX公司开发,它强调即使在速度和存贮空间方面有所损失,也要尽可能地提供最好的程序环境。
(3)ZETALISP语言;在LISP机上实现。它和MACLISP关系密切,有很好的兼容性。并且对MACLISP进行了很多改进,提供了新的性能。
(4)QLISP语言:它嵌在INTERLISP中,能灵活处理大型数据库,具有返回追踪与模式调用功能。
(5)CommonLISP语言:它是在MACLISP的基础上发展起来的,并参考了INTERLISP和ZETALISP,因而功能较强且拥有其它版本的一些优点,目前已被广泛使用。
(6)GCLISP语言:它作为CommonLISP在PC机上实现的第一个缩本,自然具有ConlmonLISP的通用性特点,其程序电容易移植到其它版本的LISP环境之中。GCLISP和CommonLISP核心部分兼容,与ZETALISP的某些概念吻合,此外还拥有若干先进的数据类型,它着眼于让机器有较强的处理能力和记忆功能,因而效率较高,用户易于掌握,使用比较广泛。5