Lisp如何成为上帝自己的编程语言


这是Sinclair Target一篇文章,在Hackernews上引起大量讨论。正好保罗艾伦去世了,一股计算机历史的怀旧味道开始弥漫开来,老人们现在可以出来蹦跶一下了。

当程序员讨论不同编程语言的相对优点时,总是从不同方面谈论,一种语言可能适合于系统编程,另一种语言可能更适合将其他程序粘合在一起完成一些临时任务。语言具有不同的优势,不考虑特定用例场景,一味声称自己的语言比其他语言更好,只会引发尖锐的辩论(如:PHP是世界上最好的语言?)

但是有一种语言似乎激发了一种特殊的普遍崇敬:Lisp。键盘十字军会抨击任何敢于暗示某种语言比其他语言更好,但是会承认Lisp处于另一个层面。

Lisp超越了用判断其他语言好坏的标准了,因为普通程序员从未使用Lisp来构建过任何实用的东西,而且可能永远不会,但是对Lisp的敬仰却是如滔滔长江,Lisp通常有一些神秘属性,每个人最喜欢的webcomic, xkcd。

至少有两种描述Lisp方式:在一个漫画中,某个猪脚获得某种Lisp启蒙,他似乎能够理解宇宙的基本结构。在另一个漫画,一个长袍、衰老的程序员把一堆括号递给他的弟子,说括号是“发达文明时代的优雅武器”,暗示Lisp拥有原力的所有神秘力量。

另一个很好的例子是Bob Kanefsky对一首名为“God Lives on Terra”歌曲的模仿。他的模仿于20世纪90年代中期写成并被称为“永恒的火焰”,描述了上帝如何使用Lisp创造世界。以下是摘录,但可以在GNU Humor Collection中找到完整的歌词集:

因为上帝写了Lisp代码
当他用绿色填充叶子。
分形花和递归根:
我见过的最可爱的黑客。
当我思考雪花时,
从未找到两个相同的东西,
我知道上帝喜欢一种
带有四个字母名称的语言。

我认为这个“Lisp Is Arcane Magic”文化模因是迄今为止最离奇,最迷人的事情。Lisp在象牙塔中被炮制作为人工智能研究的工具,程序员会敦促对方“在你死之前尝试Lisp” , 就好像它是某种令人放松的迷幻。

虽然Lisp现在是广泛使用的第二古老的编程语言,仅比Fortran更年轻,甚至仅仅一年。

想象一下,如果您的工作是推广新的编程语言。如果你能说服每个人你的新语言具有神圣的力量,那不是很好吗?但你怎么会这样做?编程语言如何被称为隐藏知识的神秘字体呢?

Lisp怎么会这样?

理论A:公理语言

Lisp的创建者John McCarthy最初并不打算让Lisp成为计算原理的优雅升华。但是,经过一两个幸运的见解和一系列的改进之后,达到了Lisp的成就。保罗格雷厄姆认为:McCarthy“为编程做出贡献类似于欧几里德为几何学所做的事情。” 人们可能会在Lisp中看到更深层次的含义,因为McCarthy其实部分地构建了Lisp,从根本上说,很难说他是发明了还是发现了它。

McCarthy在1956年达斯茅斯夏季人工智能研究项目中开始考虑创造一种语言。夏季研究项目实际上是一个持续的,为期数周的学术会议,这是人工智能领域的第一次。McCarthy当时是达特茅斯数学助理教授,他在提出这一事件时实际上创造了“人工智能”一词。大约十人左右参加了会议,有Allen Newell和Herbert Simon。

Newell和Simon一直在努力构建一个能够在命题演算中生成证明的系统。他们意识到在计算机的本机指令集级别工作时很难做到这一点,所以他们决定创建一种语言 - 或者,正如他们所说的那样,是一种“伪代码” - 这将有助于他们更自然表达他们的“逻辑理论机器”的运作,他们的语言,称为“信息处理语言”的IPL,更像是一种高级汇编方言,而不是我们今天所说的编程语言。Newell和Simon或许指的是Fortran,他指出当时正处于开发阶段的其他“伪代码”是用标准数学符号表示方程式“专注”的,他们的语言专注于将命题演算中的句子表示为符号表达式列表。IPL中的程序基本上利用一系列汇编语言宏来操纵和评估这些列表中的一个或多个中的表达式。


McCarthy认为:在Fortran风格的语言中使用代数表达式会很有用。所以他不太喜欢IPL。但他认为符号列表是模拟人工智能问题的好方法,特别是涉及演绎的问题。这是麦卡锡创建代数列表处理语言的愿望,这种语言类似于Fortran,但也能够处理像IPL这样的符号列表。

当然,Lisp今天不像Fortran。在接下来的几年里,麦卡锡关于理想的列表处理语言看起来应该是什么样的想法发生了变化。他的想法在1957年开始发生变化,当时他开始为Fortran的国际象棋游戏程序编写例程。长期接触Fortran使McCarthy确信其设计存在一些不足之处,其中主要是尴尬的IF陈述。

在1958年的夏天,当McCarthy麦卡锡设计一个可以实现差异化的程序时,他意识到他的“真实”条件表达式使得编写递归函数更容易,更自然。9差异化问题还促使麦卡锡设计了maplist 函数,该函数将另一个函数作为参数并将其应用于列表中的所有元素。10这对于区分任意多项的总和很有用。

这些东西都不能在Fortran中表达出来,因此,在1958年秋天,McCarthy让一些学生开始实施Lisp。由于麦卡锡现在是麻省理工学院的助理教授,这些都是麻省理工学院的学生。当麦卡锡和他的学生将他的想法转化为运行代码时,他们进行了更改,进一步简化了语言。最大的变化涉及Lisp的语法。麦卡锡原本打算用这种语言包含一些名为“M表达式”的东西,这将是一层语法糖,使得Lisp的语法类似于Fortran。虽然M表达式可以转换为S表达式 - Lisp众所周知的括号括起来的基本列表--S表达式实际上是一个用于机器的低级表示。唯一的问题是是麦卡锡用方括号表示M表达式,11因此,Lisp团队坚持使用S表达式,使用它们不仅代表数据列表,还代表函数应用程序。麦卡锡和他的学生也进行了一些其他的简化,包括切换到前缀表示法和内存模型更改,这意味着该语言只有一种真实类型。

1960年,麦卡锡发表了他关于Lisp的着名论文,称为“符号表达式的递归函数及其机器计算。”到那时,这种语言已被削减到如此程度以至于麦卡锡意识到他具有“优雅的数学”的特征。系统“而不仅仅是另一种编程语言。他后来写道,对Lisp进行的许多简化使其“变成了一种描述可计算函数的方式,比图灵机器或递归函数理论中使用的一般递归定义更加整洁。” 因此,他在论文中提出了这一点。 Lisp既可以作为工作编程语言,也可以作为研究递归函数行为的形式。

麦卡锡通过建立一个非常小的规则集来向他的读者解释Lisp。保罗格雷厄姆后来在他的文章“利斯的根源”中使用更易读的语言回顾了麦卡锡的步骤。保罗格雷厄姆能够使用七个原始运算符,两个不同的函数符号以及根据原始运算符定义的六个高级函数来解释Lisp。Lisp可以通过如此小的一系列基本规则来指定,这无疑有助于它的神秘性。Lisp的设计几乎似乎都受到计算逻辑的影响。Lisp与像“递归函数理论”这样深奥的领域的原始联系应该让Lisp今天有如此多的声望也就不足为奇了。

理论B:未来的机器
根据著名名的黑客字典,Lisp在创建二十年后成为人工智能研究的“母语”。早期,Lisp迅速传播,可能是因为它的常规语法使得在新机器上实现它相对简单。后来,研究人员会继续使用它,因为它处理符号表达的能力很强,这在很多人工智能具有象征意义的时代非常重要。Lisp被用于开创性的人工智能项目,如SHRDLU自然语言程序,Macsyma代数系统和ACL2逻辑系统。


然而,到了20世纪70年代中期,人工智能研究人员的电脑容量已经耗尽。PDP-10,特别是每个人最喜欢的人工智能工作机器 - 具有18位地址空间,对于Lisp AI程序来说越来越不足。许多人工智能程序也应该是互动的,并且要求在分时系统上表现良好的交互式程序具有挑战性。最初由麻省理工学院的Peter Deutsch提出的解决方案是设计一台专门用于运行Lisp程序的计算机。

这些Lisp机器,将为每个用户提供针对Lisp优化的专用处理器。他们最终还会提供完全用Lisp编写的开发环境,供硬核Lisp程序员使用。Lisp机器是在微型计算机时代尾部的一个尴尬时刻设计的,但在微机革命全面开花之前,是编程精英的高性能个人计算机。


有一段时间,似乎Lisp机器将成为未来的潮流。几家公司成立并开始将这项技术商业化。这些公司中最成功的一家名为Symbolics,由麻省理工学院人工智能实验室的资深人士创办。在整个20世纪80年代,Symbolics生产了一系列被称为3600系列的计算机,这些计算机在AI领域和需要高性能计算的行业中很受欢迎。3600系列计算机具有大屏幕,位图图形,鼠标界面以及 强大的图形和动画软件。这些令人印象深刻的机器能够令人印象深刻。

结果,Symbolics机器非常昂贵。1983 年,Symbolics 3600的售价为110,000美元.因此,大多数人只能惊叹于Lisp机器的强大功能以及他们从远处看Lisp写作操作员的魔力。但奇迹是他们做到了。从1979年到20世纪80年代末,Byte Magazine多次使用Lisp和Lisp机器。在1979年8月的期刊上,该杂志的编辑特别赞扬了麻省理工学院正在开发的“机器记录”和“高级操作系统”的新机器,听起来很有前途,他们会制作前两年 - 相比之下,Apple II,Commodore PET和TRS-80的推出看起来很无聊。半年后,1985年,一本Byte杂志撰稿人描述了为“复杂,超级强大的Symbolics 3670”编写Lisp程序,并敦促他的读者学习Lisp,声称它既是“大多数AI工作人员的首选语言”,也很快成为通用编程语言。

我问保罗麦克乔斯,他为山景城的计算机历史博物馆做了大量的Lisp 保存工作,关于人们第一次开始谈论Lisp时,好像它是来自高维生物的礼物。他说,语言的固有属性无疑与它有很大关系,但他也说Lisp与20世纪60年代和70年代强大的人工智能应用程序之间的紧密联系也可能有所帮助。当Lisp机器在20世纪80年代开始购买时,麻省理工学院和斯坦福等地以外的一些人接触到了Lisp的力量,并且传说也在增长。今天,Lisp机器和Symbolics几乎没有人记住,但它们帮助保持了Lisp的神秘感,直到20世纪80年代后期。

理论C:学习编程
1985年,麻省理工学院教授Harold Abelson和Gerald Sussman以及Sussman的妻子Julie Sussman发表了一本名为“计算机程序的结构和解释 ”的教科书。该教科书使用语言Scheme(一种Lisp方言)向读者介绍了编程。

二十年来,这本书被用于教授麻省理工学院作为入门编程课程。我的预感是SICP(这本书标题通常缩写)大约是Lisp的“神秘因素”.SICP采用了Lisp并展示了如何用它来说明计算机编程领域中深刻的、几乎是哲学的概念。这些概念足够普遍,任何语言都可以使用,但SICP的作者选择了Lisp。因此,Lisp的声誉因这本奇异而精彩的书的名声而得到了增强,这本书引起了几代程序员的兴趣(也成了 一个非常奇怪的模因))。Lisp一直是“麦卡锡优雅的形式主义”; 现在它也是“那种教你隐藏编程秘密的语言。”

关于SICP究竟有多奇怪,值得关注一段时间,因为我认为这本书的古怪和Lisp的怪异在今天得到了混淆。奇怪的是从书的封面开始。它描绘了一个靠近桌子的巫师或炼金术士,准备执行某种巫术。一方面,他拿着一套卡钳或一个指南针,另一方面他拿着一个刻有“eval”和“apply”字样的地球仪。他对面的一个女人在桌子上示意; 在背景中,希腊字母lambda漂浮在半空中,散发着光芒。

老实说,这里发生了什么?桌子为什么有动物脚?为什么那个女人在桌子上打手势?墨水池有什么意义?我们是否应该得出结论,巫师已经解开了宇宙中隐藏的奥秘,而那些神秘的东西包括“eval / apply”循环和Lambda微积分?看起来似乎如此。仅此图像就已经做了大量工作来塑造人们今天如何谈论Lisp。

但这本书的内容往往同样奇怪。SICP与您阅读过的大多数其他计算机科学教科书不同。它的作者在书的前言中解释说,这本书不仅仅是关于如何用Lisp编程 - 而是关于“三个现象的焦点:人类的思想,计算机程序的集合和计算机。” 19后来,他们精心制作,描述他们的信念,即编程不应该被视为计算机科学的一门学科,而是应该考虑一个新的符号“程序认识论。” 程序是构建思想的一种新方式,只是偶然地被输入计算机。本书的第一章简要介绍了Lisp,但在此之后的大部分内容都是关于更抽象的概念。讨论了不同的编程范式,讨论了面向对象系统中“时间”和“身份”的本质,并且一度讨论了由于对发挥作用的通信的基本限制而可能如何产生同步问题类似于相对论中光的固定速度。这是令人兴奋的事情。 

这一切并不是说这本书很糟糕。这是一本很棒的书。它讨论了重要的编程概念,而不是我读过的任何其他概念,这些概念我早就想知道但却没有完整的语言来描述。令人印象深刻的是,入门编程教科书可以如此快速地描述面向对象编程的根本缺陷以及最小化可变状态的函数式语言的好处。令人兴奋的是,这会变成对流范式的讨论,也许就像今天的 RxJS,可以给你两全其美。SICP以一种让人想起McCarthy最初的Lisp论文的方式提炼出高级程序设计的精髓。阅读后你要做的第一件事是让你的程序员朋友阅读它; 如果他们查看它,看看封面,但是不要读它,他们带走的只是一些神秘的,基本的“eval”和“apply”的东西赋予魔术师对动物脚的桌子的特殊权力。他们的鞋子也会给我留下深刻的印象。

但也许SICP最重要的贡献是将Lisp从奇怪的怪异提升到教育必备。在SICP之前,人们告诉对方学习Lisp作为改进编程的一种方式。1979年Lisp杂志的Byte杂志证明了这一事实。同样热衷于麻省理工学院新Lisp机器的编辑也解释说这种语言值得学习,因为它“代表了分析问题的不同观点。” 22但SICP提出的Lisp不仅仅是其他语言的陪衬; SICP使用Lisp作为介绍语言,隐含地说明Lisp是掌握计算机编程基础的最佳语言。当程序员今天告诉对方在他们死之前尝试Lisp时,他们可以说很大程度上是因为SICP。毕竟,Brainfuck语言可能提供了“从中分析问题的不同观点。”但人们学习Lisp是因为他们知道,在20年左右的时间里,Lisp的观点被认为是如此有用,以至于麻省理工学院在其他任何事情之前教给大学生Lisp。

Lisp回来了
在SICP发布的同一年,Bjarne Stroustrup发布了第一版“C ++编程语言”,该语言为大众带来了面向对象的编程。几年后,Lisp机器市场崩溃,人工智能冬季开始。在接下来的十年和变革中,C ++和Java将成为未来的语言,Lisp将被冷落。

当然不可能确定人们何时再次开始对Lisp感到兴奋。但是,在Y-Combinator联合创始人和黑客新闻创建者Paul Graham发表了一系列有影响力的文章推动Lisp成为初创公司的最佳语言之后,可能会发生这种情况。例如,在他的文章“击败平均数”中,格雷厄姆认为Lisp宏只是让Lisp比其他语言更强大。他声称在他自己的创业公司Viaweb使用Lisp帮助他比竞争对手更快地开发功能。一些程序员至少 被说服了。但是绝大多数程序员都没有转向Lisp。

相反的是,越来越多的Lisp-y功能已经被整合到每个人最喜欢的编程语言中。Python得到了列表理解。C#得到了Linq。Ruby得到了...好吧,Ruby 是一个Lisp。正如格雷厄姆在2001年所指出的那样,“默认语言,体现在一系列流行语言中,逐渐演变为Lisp。”

 虽然其他语言逐渐变得像Lisp一样,但Lisp本身也设法保留其神秘的特殊声誉。很少有人理解但每个人都应该学习的语言。1980年,在Lisp的20周年之际,麦卡锡写道,Lisp中幸存了下来,只要它有,因为它占领了“某种编程语言的空间近似局部最优的。” 这低估了Lisp的真正影响力。Lisp半个多世纪以来一直没有存活下来,因为程序员不情愿地承认它是十年后这项工作的最佳工具; 事实上,即使大多数程序员根本不使用它,它仍然存在。由于它在人工智能研究中的起源和应用,也许还有SICP的遗产,Lisp继续吸引着人们。直到我们可以想象上帝用一些更新的语言创造世界,Lisp不会离开的。