当程序员讨论各种编程语言的优点时,他们经常用平庸的方式谈论它们,因为它们是一组不同设备中的工具-一种更适合于系统编程,另一种适合于粘贴其他程序来解决当前问题。 应该是这样。 语言具有不同的优势,并且指出一种语言比其他语言更好而不指定具体示例就意味着只会引起徒劳无益的激烈辩论。
但是,有一种语言奇怪地引起了普遍尊重:
Lisp 。 键盘十字军准备攻击任何敢于宣称任何语言都比其他语言更好的人,他们同意Lisp处于不同的水平。 它超出了其他语言所判断的功利标准,因为普通程序员从来没有使用Lisp来创建任何实用的东西,而且可能永远也不会,但是,对Lisp的尊重是如此之深,以至于他经常被认为是神话般的属性。 因此,每个人最喜欢的xkcd漫画至少两次描绘了Lisp:在一部漫画中,一个角色获得了Lisp的启发,这有助于他理解宇宙的基本结构。 在另一个例子中,一个穿着睡袍的老程序员将一堆括号交给了他的padawan,解释说这是“更文明时期的一种优雅武器”,暗示了Lisp内在
力量的隐秘可能性。
另一个很好的例子是鲍勃·卡内夫斯基(Bob Kanefsky)对歌曲“上帝住在Terra上”的模仿。 他的模仿作品写于90年代中期,被称为“永恒的火焰”。 她描述了神显然是如何在Lisp的帮助下创造世界的。 以下是摘录,完整版本可以在
GNU Humor Collection网站上找到:
毕竟,上帝在Lisp中写道
当他用绿色填满叶子时。
分形花和递归根:
我见过的最漂亮的骇客。
当我研究雪花时
我找不到两个相同的
我知道上帝爱语言
具有自己的四个字母的名称。
我只为自己说话,但在我看来,文化模因“ Lisp是秘密魔术”是最奇怪和有趣的现象。 Lisp是在象牙塔中构思的,是一种用于研究人工智能的工具,因此对于普通程序员而言,它总是有些陌生和神秘。 但是,现在程序员正在互相
推动 “在死之前尝试Lisp”,就好像这是一种能扩大意识的迷幻药一样。 尽管Lisp是他们仍然使用的第二种最古老的编程语言,但仅次于
Fortran ,而且只有一年的事实,他们还是这样做。 想象一下,开发它的公司或团队会指导您宣传一些新的编程语言。 能够说服所有人您的新语言具有神圣的力量,这不是很酷吗? 但是如何实现呢? 编程语言如何作为秘密知识的来源而闻名?
Lisp是如何做到这一点的?
字节杂志封面,1979年8月理论A:公理语言
Lisp的创建者
John McCarthy最初并没有寻求使Lisp成为计算原理的优雅本质。 但是,经过一两个成功的构想和几处改进,Lisp就变成了这样。
保罗·格雷厄姆 (
Paul Graham) –我们将在后面讨论–写道,麦卡锡(McCarthy)创建了Lisp之后,“在编程方面与欧几里得在几何学上一样。” 也许人们正在寻找Lisp的更深层含义,因为McCarthy是从如此基本的部分创建出来的,很难说是发明还是发现了它。
麦卡锡在
1956年的达特茅斯夏季人工智能研究项目中开始考虑该语言的创建。 该研讨会是一个连续的为期数周的学术会议,这是AI领域中的第一个会议。 顺便说一句,当时是麦卡锡(McCarthy),他是达特穆尔(Dartmoor)数学的副教授,提出了“人工智能”一词,并提议举行这次会议。 约有十人参加了会议。 其中包括与RAND公司和卡内基梅隆大学相关的两位研究人员Allen Newel和Herbert Simon,他们刚刚完成了
IPL语言的开发。
纽维尔和西蒙试图建立一个能够
按照话语逻辑提供证据的系统。 他们意识到很难做到这一点,仅停留在自己的计算机指令水平上,于是他们决定创建一种语言-或他们称之为“伪代码”-来帮助他们更自然地表达其“理论逻辑机器”的工作。 他们的语言IPL(“信息处理语言”)更像是高级汇编语言,而不是现代意义上的编程语言。 Newel和Simon可能会提到Fortran,他指出当时正在开发的“其他伪代码”“忙”着用标准数学符号表示方程。 相反,他们的语言专注于将陈述表示为符号表达列表。 IPL程序使用宏的汇编序列来处理和评估其中一个或多个列表中的表达式。
麦卡锡认为用与Fortran类似的语言表达代数表达式会很有用。 因此,他不喜欢IPL。 但是他认为符号列表是从AI领域建模任务的好方法,尤其是那些包含演绎的任务。 这就是麦卡锡(McCarthy)创建一种代数列表处理语言的愿望的源头,该语言类似于Fortran,但可以处理IPL等符号列表。
当然,今天的Lisp与Fortran不一样。 在接下来的几年中,麦卡锡提出了一种理想的列表处理语言的思想。 当他开始为Fortran国际象棋程序编写程序时,他的想法在1957年开始改变。 Fortran的长期曝光使McCarthy确信他的设计中存在几个缺陷,主要是IF语句笨拙。 McCarthy发明了一种替代方法,即条件表达式“ true”,如果给定的检查成功,则返回子表达式A,在另一种情况下返回子表达式B,仅执行返回的子表达式。 1958年夏天,当麦卡锡(McCarthy)着手开发具有差异性的程序时,他意识到他的条件表达式“ true”使编写递归函数更加简单自然。 差异问题还促使McCarthy编写了一个maplist函数,该函数将另一个函数作为参数并将其应用于列表的所有元素。 这对于区分任意数量的成员的总和很有用。
Fortran无法表达这种事情,因此1958年秋天,麦卡锡(McCarthy)向数名学生提出了实施Lisp的任务。 由于麦卡锡现在是麻省理工学院的副教授,所有学生都在麻省理工学院学习。 通过将思想转化为工作代码,麦卡锡和学生进行了更改,从而进一步简化了语言。 其中最大的是Lisp语法。 麦卡锡起初想要所谓的 “ M表达式”是一层“
语法糖 ”,使Lisp语法看起来像Fortran。 尽管M表达式可以转换为S表达式(Lisp著名的括号中的简单列表),但S表达式实际上是计算机的低级表示。 唯一的问题是,麦卡锡用方括号表示M表达式,而在MIT中使用的IBM 026打孔器上没有方括号。 因此,Lisp团队将自己局限于S表达式,并使用它们不仅表示数据列表,还表示函数的使用。 麦卡锡(McCarthy)和学生进行了其他几种简化,包括切换到前缀记录和一种内存模型,其中该语言只有一种实数。
1960年,麦卡锡(McCarthy)发表了著名的Lisp著作“符号表达式的递归函数及其机器计算”。 到那时,这种语言已经减少到一定程度,以至于麦卡锡意识到自己创建了一个“优雅的数学系统”,而不仅仅是另一种编程语言。 他后来写道,Lisp中的许多简化使它变成了“一种描述计算函数的方法,比图灵机或递归函数理论中使用的通用递归定义更精确”。 在他的工作中,他介绍了Lisp作为一种工作编程语言,并作为研究递归函数行为的形式主义。
麦卡锡向读者解释了Lisp,并根据一小套规则进行了构建。 后来,保罗·格雷厄姆(Paul Graham)在他的论文《
根(Lisps)》中使用了一种易于理解的语言来跟随麦卡锡的脚步。 Graham只能用七个原始运算符,两个不同的函数条目以及六个通过原始运算符定义的高级函数来解释Lisp。 用这么小的简单规则序列定义Lisp的能力无疑增加了它的奥秘。 格雷厄姆称麦卡锡的工作是“使计算公理化”的尝试。 我认为这是反映Lisp吸引力的好方法。 在其他语言中,显然有一些人为的构造,它们由诸如while,typedef或public static void之类的保留字来描述;似乎Lisp的描述受到计算逻辑的限制。 这种品质和Lisp与诸如“递归函数理论”之类的神秘领域的原始联系应该可以解释该语言的当前声望。
理论B:未来的机器
根据著名的“
计算机科学家词典 ”的说法,Lisp创建二十年后,已成为AI研究的“本机语言”。 Lisp在早期阶段迅速传播,这可能是由于Lisp的系统语法使其在新机器上实施的任务相对简单。 后来,研究人员继续使用它,因为它处理符号表达的方式非常好,这在当今大多数AI是符号化的时代很重要。 Lisp被用于诸如
SHRDLU自然语言程序,
Macsyma计算机代数
系统和
ACL2逻辑系统等多产的AI项目中。
到1970年代中期,人工智能研究人员开始缺乏计算机功能。 例如,PDP-10(每个人都喜欢的AI机器)具有18位地址空间,而Lisp中的AI程序越来越缺乏该地址空间。 许多AI程序也必须是交互式的,要创建一个在分时系统上运行良好的大型交互式程序是一项艰巨的任务。 麻省理工学院的彼得·德意志首先提出的解决方案是为Lisp开发专用计算机。
这样的机器应该为每个用户提供针对Lisp优化的专用处理器。 他们还必须有一个用Lisp编写的面向硬核Lisp程序员的开发环境。 Lisp机器是在微型计算机时代末期但在微型计算机革命的鼎盛时期之前的一个令人不适的时刻发明的,是面向程序员精英的高性能个人计算机。
有一阵子,Lisp机器似乎将成为未来的潮流。 有几家公司开始竞争这项技术的商业化。 其中最成功的是由MIT AI Lab的资深人士创建的Symbolics。 在1980年代,Symbolics推出了其3600系列计算机,在AI行业和需要大功率计算的行业中很受欢迎。 3600系列产品包括具有大屏幕,位图图形,基于鼠标的界面以及功能强大的图形和动画程序的计算机。 这些令人印象深刻的机器使编写令人印象深刻的程序成为可能。 例如,从事机器人研究领域的鲍勃卡利(Bob Cali)在Twitter上给我写信说,他能够在1985年在Symbolics 3650上实现并可视化路径搜索算法。他说,光栅图形和OOP(由于Flavors扩展而在Lisp机器上可用)是1980年代的新产品。 象征是最重要的。

但是结果,Symbolics计算机非常昂贵。 1983年,Symbolics 3600的价格为110,000美元。大多数人只能惊叹Lisp机器的强大功能以及操作员从远处用Lisp书写的魔力。 但是他们赞叹不已。 Byte杂志在1979年至1980年代后期多次描述了Lisp和Lisp机器。 在1979年8月出版的Lisp中,总编辑对麻省理工学院正在开发的“具有大量内存”和“高级操作系统”的新机器充满热情。 他认为它们非常有前途,以至于Apple II,Commodore PET和TRS-80出现的前两年似乎很无聊。 五年后的1985年,《字节》杂志的作者描述了为“复杂而功能强大的Symbolics 3670”编写Lisp程序的过程,并鼓励读者学习Lisp,并指出这都是“大多数AI研究人员都需要的语言”。以及未来通用语言的候选人。
我问了保罗·麦克琼斯(Paul MacJones),
他为拯救Lisp
而做了很多工作 ,
他在山景城计算机历史博物馆中做了什么,人们何时开始谈论Lisp作为高维生物的礼物。 他说,语言本身的功能无疑促成了这一点,而且在1960年代和1970年代Lisp与强大的AI应用程序之间有着密切的联系。 在1980年代有可能购买Lisp机器时,又有一些人在麻省理工学院或斯坦福大学等地相识,传奇不断发展。 如今,很少有人记得Lisp的机器和符号,但是他们一直保持着Lisp神秘的光环,直到1980年代。
理论B:编程培训
1985年,麻省理工学院的教授Harold Abelson和Gerald Sasman以及Sasman的妻子Julia出版了《计算机程序的结构和解释》课本。 在教科书中,教给读者使用Scheme语言(Lisp方言)进行编程。 在麻省理工学院使用它进行了二十年的编程介绍。 在我看来,这是一本SICP教科书,给Lisp增添了神秘色彩。 SICP采访了Lisp,并展示了如何使用它来说明编程艺术的深刻的,几乎是哲学的概念。 这些概念足以使用任何PL,但SICP作者选择Lisp。 结果,Lisp的声誉得到了这本奇怪而辉煌的书的声名狼藉,这本书吸引了许多代程序员(并成为一个
非常奇怪的模因 )。 Lisp一直是“麦卡锡优雅的形式主义”; 现在它也已成为一种语言,“教您编程的秘密”)。
值得一提的是这本书有多奇怪-因为在我看来,今天的陌生感和Lisp的陌生感融合为一体。 奇怪开始于封面。 它描绘了一个向导或炼金术士接近桌子,并准备开始某种巫术。 一方面,他有游标卡尺或指南针;另一方面,它带有刻有“ eval”和“ apply”字样的地球仪。 对面的那个女人指着桌子。 背景是希腊字母lambda在空中辐射。

这是怎么回事 为什么桌上有只动物的腿? 女人为什么要指向桌子? 墨水池的意义是什么? 我们是否应该理解巫师揭示了宇宙的秘密知识,并且它们由评估/应用周期和
λ演算组成 ? 显然是。 仅此图像应该为今天的Lisp印象增加了很多。
但是,这本书本身的文字常常变得同样奇怪。 SICP与大多数其他计算机科学书籍不同。 序言中的作者解释说,这本书不仅涉及Lisp编程,还讲述了“三个技巧或现象:人类的思想,一套计算机程序和一台计算机”。 后来,他们描述了他们坚信编程不应被视为计算机科学的一门学科,而应被视为“过程
认识论 ”的新记录。 程序是一种构造思想的新方法,这种思想只是偶尔输入到计算机中。 第一章简要介绍了Lisp,但是本书大部分内容都是关于更抽象的概念的。 它讨论了各种编程范例,OO系统中的时间和标识的性质,并在一处讨论了由于消息传递的基本限制而可能引起哪些同步问题,这些问题在相对论中起着光速的作用。 这些都是非常深刻的事情。
并不是说这本书不好。 她很棒。 它以比我阅读的所有其他书籍更高的水平讨论了重要的编程概念,这些概念我思考了很长时间但无法描述。 令人惊讶的是,编程教科书的介绍可以如此迅速地描述OOP的基本缺点以及使可变状态最小化的功能语言的优点。
令人惊奇的是,这变成了关于流传输范式(可能类似于今天的RxJS)如何为您提供这两种方法的最佳方法的讨论。 SICP强调了开发高级程序的本质,使人想起了麦卡锡关于Lisp的原始工作。阅读本书之后,您要做的第一件事是让您的程序员同伴一起阅读;如果他们找到了它,请看封面,而不读,那么所有被推迟的事情是,一种叫做eval / apply的神秘事物使巫师对带有动物腿的桌子具有特殊的力量。他们的鞋子会让我印象深刻。但是,SICP的最重要贡献可能是将Lisp从有趣的好奇心提高到了教学的必要性。在SICP出现之前很久,人们就建议彼此学习Lisp,以提高他们作为程序员的水平。 1979年发行Byte Magazine。曾在MIT欣赏新的Lisp机器的同一位编辑解释说,值得学习这种语言,因为它“对任务提出了不同的观点。”但是,在SICP上,Lisp的展示不仅仅是与其他语言的对比。它被用作入门语言,暗示它是学习基本编程概念的最佳语言。当当今的程序员互相建议在死之前尝试使用Lisp时,他们可能是因为SICP才这样做。毕竟,Brainfuck可能还提供了“对任务的不同看法”。但是人们改为学习Lisp,因为二十年来Lisp的观点非常有用,以至于麻省理工学院的学生都将Lisp教授所有其他语言。Lisp返回
在SICP发行的那一年,BjörnStraustrup出版了《C ++编程语言》一书的第一版,将OOP推向了大众。几年后,Lisp机器市场崩溃了,人工智能的冬天开始了。在接下来的十年左右的时间里,C ++和Java成为了未来的语言,而Lisp则变得无所作为。自然地,不可能确切地指出人们何时再次开始欣赏Lisp。Y-Combinator的共同创始人和Hacker News的创始人Paul Graham发表了几篇有影响力的文章,描述Lisp是初创企业的最佳语言。在文章“ 未来的平均水平“格雷厄姆声称Lisp宏使该语言比其他语言更强大。他说,在他的Viaweb初创公司中使用Lisp帮助他开发了某些东西,其速度超过了竞争对手。一些程序员深信不疑。但是大多数程序员都没有改用Lisp。取而代之的是,Lisp的越来越多的功能开始融入每个人喜欢的语言中。 Python增加了列表生成。在C#中-Linq。在Ruby中... Ruby是Lisp。正如Graham早在2001年所指出的那样,“许多后来流行的语言中都内置了默认语言,它逐渐向Lisp演进。”在其他语言逐渐接近Lisp的同时,Lisp本身却以某种神秘的语言保持着自己的特殊声誉,这种语言很少有人理解,但每个人都需要学习。 1980年,在Lisp成立20周年的那一年,McCarthy写道Lisp生存了很长时间,只要他采取了“在PL空间中某种近似的局部最优”。但这低估了Lisp的真正影响。他已经生存了五十年,因为程序员十年又十年不情愿地意识到这是完成任务的最佳工具。即使他幸存下来大多数程序员不使用它。由于其起源和在AI研究中的用途,也可能是SICP的遗产,Lisp继续使人们感到高兴。在我们无法想象上帝借助某种新语言创造了世界之前,Lisp不会走到任何地方。