当程序员讨论不同编程语言的相对优点时,他们经常用平淡无奇的术语谈论它们,就好像它们是工具带中的许多工具-一种可能更适合于系统编程,另一种可能更适合将其他程序粘合在一起来完成一些特别的任务。这就是它应该是的样子。语言有不同的优点,声称一种语言比其他语言更好,而不参考特定的用例,只会招致一场徒劳和尖刻的辩论。
但有一种语言似乎激发了一种特殊的普遍崇敬:LISP。键盘斗士本来会突然袭击任何敢于暗示某种语言比其他语言更好的人,但他们会承认Lisp达到了另一个水平。LISP超越了用来评判其他语言的实用标准,因为中等水平的程序员从未使用过Lisp来构建任何实用的东西,而且很可能永远也不会使用,但是人们对Lisp的崇敬如此深厚,以至于Lisp经常被归因于神秘的特性。每个人都喜欢的网络漫画,xkcd,至少两次这样描述Lisp:在一个经济学中,一个人物达到了某种李斯本启蒙,这似乎允许他理解宇宙的基本结构。在另一幅漫画中,一位身着长袍、年迈的程序员把一叠括号递给他的徒弟,说这些括号是“更文明时代的优雅武器”,暗示Lisp拥有原力的所有神秘力量。
另一个很好的例子是鲍勃·卡纳夫斯基(Bob Kanefsky)对阿松的恶搞,名为“上帝住在Terra”。他的恶搞写于20世纪90年代中期,名为“永恒的火焰”,描述了上帝一定是如何用Lisp创造了世界。以下是摘录,但全套歌词可以在GNU Humor Collection中找到:
因为上帝用Lisp代码写道,当他用绿色填满树叶时。分形的花朵和递归的根:这是我见过的最可爱的黑客。当我沉思着雪花,从来没有找到两片相同的雪花时,我知道上帝喜欢一种有自己四个字母名字的语言。
我想我只能说我自己,但我认为这个“Lisp是神秘的魔术”的文化迷因是有史以来最离奇和迷人的事情。LISP是在象牙塔里炮制出来的,作为人工智能研究的工具,所以对编程人员来说,它总是很陌生,甚至可能有点神秘。但是程序员们现在互相鼓励对方“在死前尝试一下Lisp”,就好像它是某种扩张性的迷幻剂一样。尽管Lisp现在是被广泛使用的第二种最古老的编程语言,仅比Fortran年轻,但他们还是这么做了,而且只比Fortran年轻一年。1想象一下,如果你的工作是代表创建它的组织或团队推广某种新的编程语言。如果你能让每个人相信你的新语言具有神圣的力量,那不是很棒吗?但你要怎么做呢?编程语言是如何被称为隐藏知识的字体的呢?
Lisp的创建者约翰·麦卡锡(John McCarthy)最初并不打算让Lisp成为计算原理的优雅升华。但是,经过一两次幸运的洞察和一系列的改进,Lisp就变成了这样。保罗·格雷厄姆(稍后我们将进一步讨论他)写道,在Lisp中,麦卡锡“在编程方面所做的工作就像欧几里德在几何学上所做的那样”。2人们可能会在Lisp中看到更深层次的含义,因为麦卡锡是从如此基础的部件中构建Lisp的,以至于很难说是他发明了Lisp还是发现了Lisp。
麦卡锡在1956年的人工智能达斯茅斯夏季研究项目中开始考虑创造一种语言。夏季研究项目实际上是一场持续数周的学术会议,是人工智能领域的第一次。麦卡锡当时是达特茅斯大学的数学助理教授,当他提出这项活动时,实际上已经创造了“人工智能”这个术语。在整个会议期间,大约有十个人参加了会议。其中包括艾伦·纽威尔(Allen Newell)和赫伯特·西蒙(Herbert Simon),他们是兰德公司(RAND Corporation)和卡内基梅隆大学(Carnegie Mellon)的两名研究人员,他们刚刚设计了一种名为。
纽威尔和西蒙一直试图建立一个能够在命题演算中生成证明的系统。他们意识到在计算机本地指令集级别上工作时很难做到这一点,所以他们决定创造一种语言--或者他们所说的“伪代码”--来帮助他们更自然地表达他们的“逻辑理论机器”的工作。5他们的语言被称为IPL,意思是“信息处理语言”,它更像是一种高级汇编语言,而不是我们今天所说的编程语言。纽威尔和西蒙可能指的是Fortran,他们注意到当时正在开发的其他“伪代码”“全神贯注”于用标准数学符号表示方程式。他们的语言侧重于将命题演算中的句子表示为列表
麦卡锡认为,用Fortran风格的语言编写代数表达式会很有用。所以他不太喜欢IPL。但他认为符号列表是模拟人工智能问题的好方法,特别是涉及演绎的问题。这就是麦卡锡希望创建一种代数列表处理语言的萌芽,这种语言类似于Fortran,但也能够处理像IPL这样的符号列表。
当然,今天的Lisp不像Fortran。在接下来的几年里,麦卡锡关于理想的列表处理语言应该是什么样子的想法逐渐发展起来。1957年,当他开始用Fortran编写下棋程序的例程时,他的想法开始改变。长期接触Fortran让麦卡锡相信它的设计有几个不恰当之处,主要是尴尬的if语句。麦卡锡发明了另一种选择,“真”条件表达式,如果所提供的测试成功,它返回子表达式A,如果提供的测试失败,返回子表达式B,它也只计算实际返回的子表达式。1958年夏天,当麦卡锡致力于设计一个可以执行微分的程序时,他意识到他的“真”条件表达式使编写递归函数变得更容易、更自然。微分问题还促使McCarthy设计了Maplist函数,该函数将另一个函数作为参数,并将其应用于列表中的所有元素。10这对于区分任意多项的和很有用。
所有这些都不能用Fortran来表达,所以,在1958年秋天,McCarthy让一些学生去实现Lisp。因为麦卡锡现在是麻省理工学院的助理教授,所以这些人都是麻省理工学院的学生。当麦卡锡和他的学生将他的想法转化为运行代码时,他们做出了进一步简化语言的改变。最大的变化涉及到Lisp的语法。麦卡锡原本打算让这门语言包含一种叫做“M-Expression”的东西,这将是一层语法糖,使Lisp的语法类似于Fortran。虽然M-Expression可以被翻译成s-Expression-Lisp以圆括号括起来的基本列表-S-Expression实际上是机器的低级表示。唯一的问题是麦卡锡一直使用方括号来表示M表达式,而麦卡锡团队在麻省理工学院使用的IBM026键盘上没有任何方括号按键。11所以Lisp团队坚持使用s表达式,不仅使用它们来表示数据列表,而且还使用它们来表示函数应用程序。麦卡锡和他的学生还做了其他一些简化,包括切换到前缀记法和记忆模型的改变,这意味着这种语言只有一种真正的类型。12个。
1960年,McCarthy发表了他关于Lisp的著名论文,名为“符号表达式的递归函数及其机器计算”(RecursiveFunctions Of Symbol Expression And They Computation By Machine)。到那时,这门语言已经缩减到如此程度,以至于麦卡锡意识到他具备了“一个优雅的数学系统”的素质,而不仅仅是另一种编程语言。13他后来写道,对Lisp所做的许多简化使其“变成了一种比图灵机或递归函数理论中使用的一般递归定义更简洁地描述可计算函数的方式”。14因此,在他的论文中,他将Lisp既作为一种可工作的编程语言,又作为研究递归函数行为的形式主义。
麦卡锡向他的读者解释了Lisp,他只用一小部分规则构建了Lisp。保罗·格雷厄姆后来在他的文章“Lisp的根源”中使用了更易读的语言,追随了麦卡锡的脚步。Graham仅使用7个基元运算符、两种不同的函数符号和6个根据基元运算符定义的高级函数就可以解释Lisp。Lisp可以用这么小的一系列基本规则来指定,这无疑是它的神秘性所在。Graham称McCarthy的论文是试图“公理化计算”。15我认为这是一个很好的思考Lisp吸引力的方式。虽然其他语言有明显的人工构造,由预留字(如while、tyecif或public static void)表示,但Lisp的设计似乎几乎是由计算逻辑决定的。这种特性和Lisp与深奥的“递归函数理论”这一领域的原始联系应该使Lisp在今天享有如此高的声望也就不足为奇了。
根据著名的黑客词典,Lisp在创建20年后,已经成为人工智能研究的“母语”。早些时候,Lisp传播很快,可能是因为它的规则语法使得在新机器上实现它相对简单。后来,研究人员会继续使用它,因为它处理符号表达式的能力很好,这在一个人工智能如此之多是象征性的时代很重要。使用了LISP
结果,Symbolics机器贵得离谱。1983年,Symbolics 3600的价格为11万美元。16所以大多数人只能从远处惊叹Lisp机器的威力和Lisp编写操作员的魔力。但令人惊叹的是他们做到了。Byte Magazine从1979年到20世纪80年代末几次以Lisp和Lisp机器为特色。在1979年8月的一期Lisp专刊中,该杂志的编辑盛赞麻省理工学院正在开发的具有“海量内存”和“先进操作系统”的新机器。他认为这些机器听起来非常有前途,相比之下,前两年--苹果II、准将PET和TRS-80的发布--会显得乏味。五年后,也就是1985年,一家字节杂志撰文描述了为“复杂、超级强大的符号3670”编写Lisp程序,并敦促他的观众学习Lisp,声称它既是“大多数人工智能工作人员的首选语言”,也很快就会成为一种通用编程语言。18岁。
我问保罗·麦克琼斯(Paul McJones),他为山景城的计算机历史博物馆(ComputerHistory Museum)做了大量的Lisp保护工作,关于人们什么时候开始谈论Lisp的,就好像它是来自更高维度的生物的礼物一样。他说,语言的固有属性无疑与此有很大关系,但他也表示,Lisp与20世纪60年代和70年代强大的人工智能应用程序之间的密切联系可能也起到了作用。当Lisp机器在20世纪80年代开始可供购买时,更多的人在麻省理工学院和斯坦福等地以外的地方接触到了Lisp的强大功能,这一趋势也随之发展起来。今天,Lisp机器和符号已鲜为人知,但它们使Lisp的神秘感一直延续到20世纪80年代末。
1985年,麻省理工学院教授哈罗德·阿贝尔森和杰拉尔德·萨斯曼与萨斯曼的妻子朱莉·萨斯曼一起出版了一本名为“计算机程序的结构与解释”的教科书。这本教科书向读者介绍了使用Lisp方言“语言方案”进行编程。它被用来教授麻省理工学院的入门编程课程长达20年之久。我的预感是,SICP(标题通常缩写)大约是Lisp的“神秘感因素”的两倍。SICP以Lispand为例展示了如何用它来说明计算机编程艺术中深刻的、近乎哲学的概念。这些概念很普遍,任何语言都可以使用,但SiCp的作者选择了Lisp。因此,Lisp的声誉因这本奇特而精彩的书而声名狼藉,这本书吸引了一代又一代的程序员(也成为了一个非常奇怪的人)。Lisp一直是“麦卡锡优雅的形式主义”;现在也是“那种教你编程秘密的语言”。
值得花点时间思考SICP到底有多奇怪,因为我认为这本书的怪诞和Lisp的怪诞在今天被混为一谈了。奇怪之处在于这本书的封面。它描绘了一个巫师或炼金术士走近桌子,准备进行某种巫术。他一只手拿着一套卡尺或指南针,另一只手拿着刻有“评估”和“申请”两个字的地球仪。他对面的一个女人在桌子旁做着手势;在背景中,希腊字母lambda漂浮在半空中,散发着光芒。
老实说,这是怎么回事?为什么桌子上有动物的脚?为什么那个女人在桌子旁打手势?墨水池的意义是什么?我们是否应该得出这样的结论:巫师已经解开了宇宙中隐藏的奥秘,而这些奥秘是由“求值/应用”循环和兰姆达微积分组成的?看起来是这样。单是这张图片一定在很大程度上影响了今天人们谈论Lisp的方式。
但这本书本身的文字往往也同样怪异。SICP与你读过的大多数其他计算机科学教科书不同。该书的作者在该书的前言中解释说,这本书不仅仅是关于如何用Lisp语言编程的,相反,它是关于“三个现象的焦点:人类的头脑,计算机程序的集合和计算机”。19后来,他们详细阐述了自己的信念,即编程不应该被视为计算机科学的一门学科,而应该被视为“程序认识论”的一种新符号。20个程序是一种新的思维结构方式,只是偶然地输入到计算机中。这本书的第一章简要介绍了Lisp,但之后的大部分内容都是关于更抽象的概念。文中讨论了不同的编程范例,讨论了面向对象系统中“时间”和“同一性”的本质,并一度讨论了同步问题是如何由于通信的基本限制而产生的,这些基本限制的作用类似于相对论中的固定光速。这是令人兴奋的事情。
所有这一切并不是说这本书不好。这是一本很棒的书。它讨论了重要的编程c++。
在SiCp发布的同一年,Bjarne Stroustrup发布了C++编程语言的第一版,它将面向对象的编程带给了大众。几年后,Lisp机器市场崩溃,人工智能冬天开始了。在接下来的十年和变化中,C++和Java将成为未来的语言,而Lisp将被排除在外。
当然,要准确地指出人们何时开始对Lisp再次感到兴奋是不可能的。但这可能是在Y-Combinator联合创始人兼黑客新闻创建者保罗·格雷厄姆(Paul Graham)发表了一系列有影响力的文章spushin之后发生的。
..