BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Guy Steele采访Lisp之父John McCarthy
录制于:

| 受访者 John McCarthy 关注 1 他的粉丝 作者 Guy Steele 关注 1 他的粉丝 发布于 2009年8月7日 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。
56:06

个人简介 John McCarthy自1948年就投身于人工智能的研究,这个术语也是他在1955年提出的。他主要关注在对于普遍常识的形式化研究。他于1958年设计了LISP并发展了分时这一概念。特别地是,他是图灵奖,研究杰出奖,与京都奖的获得者。

   

1. 我是Guy Steele同时也代表Alan Kay,您已经有一张问题列表了,P.Gabriel转给你的而且我相信你也浏览过了。我打算把其中一些问题过一遍,当然不一定要按照原来的顺序,让它自由连贯会更好。同时我还准备了一些你没有看到的问题,比较简短,我想可以把它留到这次谈话的最后来进行。那不如让我们从这个列表上第4个问题开始:在 Lisp的早期概念与早期开发中,谁对你的帮助最大?

我也愿意谈一谈这个问题因为我可能会遗忘一些人。用Lisp结构来表达数据和表达程序这一思想我是从NewellSimon那里借鉴的。他们并没有意识到这会对我有帮助,但无论如何,这是从他们那里得来的。而函数式编程这一思想我又是从John Backus的 FORTRAN那里得来。...作为函数这一概念来自于Herbert Gelernter和Carl Gerberich。当时我正在指导他们工作于一项FORTRAN-Lisp处理语言,我当时提倡用它来实现Minsky的几何机器。 然后Steve Russell提出了使用我的eval作为解释器,于是初始AI项目的6个数学研究生和两个程序员,Russell和...完成了最初的开发工作。 Phyllis Fox编写了第一版手册,而来自IBM的Nathaniel Rochester也作出了一部分最初的编程工作。这些就是最初参与的人员,也许还有一些我忘记了。

   

2. 你能告诉我,在Phyllis fox之后,手册的后续版本是由谁负责的吗?

当然是Mike Levin了,我不知道还有别的人。我想,我和他应该算是1.5版手册的作者。

   

3. 现在让我们来看列表上的第3个问题。如果时光能够倒转,你会为Lisp加入什么?你将会删去哪些部分,而哪些部分又需要修改呢?

人们已经加入了一些英语化的成分,至少从语法上讲我认为这并不符合Lisp的精神。我对这一内容并不存在任何反对,实际上整体而言我对加入到Lisp的东西都不存在任何反对,因为你完全可以不用它们。就目前而言,我并没有什么特别的追求将某些特定的东西加入到Lisp。我想要加入一些直接逻辑,但我找不到很好的实现方式。

   

5. 能否举一例说明一下Lisp里面什么样的英语化特性是你所不愿使用的呢?

在我看来一些关于对象的成分是以一种英语化的方式加入的-我已经忘了。你肯定应当记得。

   

7. 现在我们上到第2号问题:一个好的编程语言与一个不太好的编程语言区分在哪点?

对此我没有一个一般性的答案。我有一个主张,现在来想的话,Lisp部分具有这一属性,而且我也许应当主张将它显式地加入到Lisp以及其它的编程语言当中。而这一主张就是,一个语言应该能够使用其自己的抽象语法。抽象语法是我在1962年的一篇论文中提出来的一个概念。现在要过多的讲它就太费力了,但它的基本思想是,在抽象语法看来,无论“加”是被表达成a+b还是(+ a b),就像Lisp所做的那样,还是像哥德尔数所做的那样,哥德尔数a(其值为19) x 哥德尔数b(其值为19),没有任何区别。你仍然需要辨别辨一个表达式是不是求和,获得2个加数并组成一个加法表达式的功能。这就是抽象语法,我相信一个编程语言应当有其自身的抽象语法函数作为组成部分。

   

8. 当然,你在Lisp中加入抽象语法的一个重要目的之一就是让它可以编写自己的分析器。与此同时,你还有其它的目的吗?

是的,任何对同一语言的程序进行操作的程序,不管是分析器或是编译器,还是出于某种目的判断一个程序是否合格,都会牵涉到该语言的抽象语法。如果你看看普通的编程语言如Java或其同类,如果你要写一个Java程序来处理Java程序,它必须要扫描并判断一个事物是否为“加”,它必须要寻找“+”记号并判断它是否运用了其先例的规则。

   

9. 让我们继续,看看列表上第一个问题:编程在AI研究中扮演一个什么样的角色,它应该是一个什么样的角色?

这里有两件事,一是程序员们所编写的做AI的程序,另一个是他们编写这些程序所使用的程序。目前我并没有什么特别的东西可讲,后者十分的重要,而这也正是Lisp显得方便的地方。考虑抽象语法与Lisp,Lisp虽说并没有显示的抽象语法,但至少,从Lisp的语法很容易容易得到抽象语法。而判断出一个事物是否是“加”也并不困难。因此可以说它几乎拥有了自己的抽象语法。

   

10. 我见过其它编程语言所定义的抽象语法的数据结构,比如Ada。看起来还是少用它们或者少学它们为妙,因为它牵涉了许许多多非常特殊数据结构,每一个对应一种抽象语法,而不是一般性的使用一个表达式来表示所有的抽象语法。你对使用统一的表达式表示的利与弊有什么评价吗?

我没有研究过他们是如何使用的,但可以肯定的是,有不同的方式来给语言定义抽象语法。首先,对抽象语法的使用-在我的论文大力提倡它以后,被用于定义了PL 1语法的抽象,这是由IBM Vienna小组所做出的,但我认为他们的工作并未被这个大公司的其它成员所认可。

   

12. 那个时候我还太小。我准备暂时抛开你面前的这个问题列表,问问大家提出来的一些相对简短的问题。其中有些人在1958年曾经参与过Lisp的一些相关的早期活动,希望你能让他们满意。第一个问题是,特性表(property list)这一想法是从何而来的?

这一想法,某种程度上讲是对象这一概念的实现,实际上早于Lisp就在我脑海里形成了。我在programs with common sense这篇论文中就提到了,你能给对象加上某种指代并作为其结构的一部分。我记得当时以1776这个数字为例,除了其算术结构之外,你能记住它还因为它是美国独立革命的日期。这就是这些对象,并且我给出了好几个例子,在Lisp当中,我想到了使用这个特性表。它们的使用已完全超出了我的想像。

   

13. 你原本是怎么想的呢,又发生了怎样的出入呢?

首先,我的想像——因为它并没有和任何提出的实现联系起来,某种程度上讲是比较模糊的,我也记不得了。现在,你们也试试假设五十年之后,人们问你:“你当时是怎么想的呢?”我想对于这个问题恐怕我没有什么更好的答案了。

   

14. 你的评述引起我了两个问题。一个是,如John所说,人们会在50年之后问这个房间里的人:“你当时在想什么呢?”。我希望你们能够从历史学家那里学到,把东西记下来,或者你可以保存你的电子邮件,甚至是将它打印出来以保存得更长久。实际上这就引出了一个列表上的问题:John,你在standord时期的笔记和手写材料还在吗?你仍然还保留得有MIT时期的笔记吗?在你致力于Lisp的时候你是否有记录某种形式的实验笔记的习惯?

它们大多是陈旧的文件,一部分得到了保存。当Herbert Stoyan来美国的时候,他对Lisp的历史产生了浓厚的兴趣,他去了MIT和Dartmouth,翻遍了属于我的文件柜,这些柜子还在那里。我不是很清楚了,也许它们都被扔掉了。我想从现在到未来的50年间,情况会变得好很多了,因为所有的东西都可以是电脑文件,有希望被保存下来,你只需要编写正确的程序就能把信息挖掘出来。

   

16. 两个不同的程序员,又相互都比较粗枝大叶——似乎说不通。

我想它们两个都是我发明的,不管那个在前哪个在后,我在发明时并没有考虑到我之前所做的。

   

17. 这是一个很小的点,但却引起我的好奇,你在1958年之前有什么样的实际编程经验,在你处理Lisp之前?

我编写过一些FORTRAN 程序。特别地,我为我将要编写的国际象棋程序编写了合法行棋路线程序,后来由[Alan] Kotok和[Elwyn] Berlekamp等人接手过去,成为了MIT国际象棋程序的基础。我实际上并未实现策略部分,因为我想先有一个宏观的计划随后再去实现。我没有完成,所以他们最后实现了一个非常直接的程序,但却实现了一个非常好的政治目的:Hubert Dreyfus声称没有国际象棋程序能打败他,实际上Dreyfus作为国际象棋选手也比较拙劣啦,因此一个非常原始的程序就击败了他。

   

18. 当你开始Lisp的工作时,特别是从1958年的9月到11月这段时间,你每天投入多少时间在Lisp上呢?你是100%的投入呢,还是说在进行其它项目的同时投入部分的时间在它上面?

我不能这么说,但实际上,当那个夏天的末尾我在IBM的时候,我就开始这项工作了,我决定为代数表达式的微分写一个程序。我所注意到的是,我可以编写条件表达式,在我为国际象棋程序编写的合法行棋线路程序中就曾经用过,它们能够以一种非常直接的形式包含微分文本所给定的规则。代数表达式的微分是启发Lisp程序函数式形式的首要例子。

   

19. 在50年代末期,你也参与了ALGOL的设计工作。我们想知道你是否考虑过以ALGOL 58作为基础来设计Lisp而不是使用FORTRAN,或者Lisp是否因为你对ALGOL 58的参与而带来的间接影响?

我并未参加最初的ALGOL 58会议,所以对于基本结构的建立没有包含我的任何贡献。我也没想过要对其产生重要的影响,因为他们更倾向于创造一个能够作为数字运算的标准语言。我很赞同应该有这样的语言的想法。到ALGOL 60的时候我是委员会的成员之一,而整个委员会更加雄心勃勃,我提交了条件表达式和布尔表达式,尽管它们的实现可是糟透了。在ALGOL 60中的a AND b运算,你必须先对a和b都进行求值然后才能运算结果,而这是不正确的,如果写成条件表达式,当a的求值为假时,就根本不需要再对b求值了。

   

21. 你第一次接受递归风格的编程是什么时候?

一方面,我从Newell和 Simon那里学习而来,另一方面,来自于递归的函数风格,那是在1958年的夏天,我做微分程序的时候。而Newell与Simon在1956年来 Dartmouth参观夏季AI项目的时候曾经说到过它。那时他们已经完成了IPL或者第一版的IPL。

   

22. 这一将计算机程序以递归的方式组织起来的想法也是随着Lisp本身逐步进行的吗?

是的。但是我的意思是,IPL某些方面做得很不好。在当时看来似乎很糟糕,所以我并未想过照搬它们。

   

23. 你所不想照搬的不好的方面指的是什么呢?

它不是可组合的,也就是它并非基于可以组合的功能。它是基于子程序的名字,比如J45,别人告诉我说,这是依据老式的JOHNNIAC装载程序来的。

   

24. 我看过一些IPL-V的代码,看起来它确实是非常声明式和命令式的语言,而命令又夹杂着十分神秘的名字和数字,这让我想起Lisp机器上的汇编语言。你现在相信S表达式或者以S表达式编程不是一个好主意。对此你有改变看法吗,如果是的话,是什么时候?

我一开始的想法是把它做得像 Fortran一样,这样你可以使用M表达式编程。接下来,当Steve Russell吸取我的eval之后,他告诉我可以直接使用S表达式编程。这是一种创新,而作为一个保守派,我当时是倾向于抵制创新的,所以我用了好长时间才慢慢适应了它。

   

26. 我现在准备回到你面前的问题列表。从第5个问题开始,然后向前进行。编程语言应当为理论家的推理而设计呢,还是为实践者构建系统而设计呢?或者对于这两种目标各有语言呢?不同的语言设计者的技术集是不同的吗?

我的观点是一个语言应当从一个抽象语法的层面上来进行设计,并且它也许应当有好几种具体的语法:一种是易于编写并且非常缩略的;另一种是非常好看很迷人的,但最终,计算机将会产生它;另一种是使得计算机易于操控的。还有其它的情况,让计算机证明事物应当是简单的,而且它们应当基于同样的抽象语法。对于你的问题上,抽象语法就是理论者将要使用的,而一个或多个具体语法则是实践者要使用的。

   

27. 这实际上让我想起了ALGOL项目早期的机器可读的语法与用于发布中的参考语法之间的区别,这一区别是从你这里来的吗?

没有。但他们没能够走远。我没有在ALGOL委员会上提出抽象语法这一问题——我应该这样做,但是我没有。

   

30. 你在回答前面的问题的时候,你指出人编写程序是重要的,同样,能编写程序的程序也是重要的。你认为同样的编程语言可以很好的服务于这两个目的吗,或者它们具有同样的抽象语法,而人类也许想使用不同的具体语法?

我认为同样的抽象语法就是派得上用场的,除非没有这样的抽象语法,因此至少我并没有直接地见到真正很好的例子。也许其它的人有——那就是用于编写Lisp程序的Lisp程序。

   

32. 实验效果好吗?你认为Lisp的设计有什么特别的地方可以促进了实验或者说让实验更容易?

当然,不存在什么老大。我从未想过当大哥。如果你看看Fortran或者IPL,它们都有所谓的老大——APL也有老大。

   

36. 我想知道的是最重要的一个贡献。我会列出4到5个其它我能想到的点并且征求你的意见。与Lisp程序以及Lisp数据密切相关的是它支持编码,应用与求值(eval),就好像作为这一语言的普遍实现一样。求值(eval)的思想是一个通用的图灵完备函数,这也许是一个重要的思想。它还包括了面向表达的语言,对于递归函数的支持,影响到其它所有语言的麦卡锡条件表达式——甚至是C,虽然有着怪异的语法,但也支持了它——,以及垃圾回收。我有没有漏掉什么重要的概念?也许有。我准备问问观众:我的列表上遗漏了什么吗?高阶函数,符号,动态编程。我想请问你,John,你对于这些概念有什么评论吗,比如它们是如何适应于Lisp这一宏图的,而你当时想要完成的目标是什么呢?

就说垃圾回收吧——当我编写这个微分程序的时候,是以一种非常直白的方式来写的,使用cons来组合导数的部分,而要编写一个擦除器,即擦除数据的工具,却十分的笨拙。IPL需要显式的擦除数据,它有一个责任位的符号,因此,当两个Lisp结构合并的时候,其中一个将负责它们的公共结构,它需要被编程。因此我深入地思考,“有没有什么方式我们可以消除显示的擦除器,这样就可以按照数学家描述微分函数的方式来编写它们了?”他们并没有描述,他们也没有在微分学教材中提到关于擦除的事儿,因此我不断的努力,最后得到了垃圾回收。 也可以通过使用引用计数的方式来达到这一目的,但当时的IBM 704的字没有足够的位来容纳引用计数。使用CDC机器的可以做到,但我认为垃圾回收不管怎样也是需要的。这个例子体现了将事物按照合适的数学的抽象标记来实现所带来非常重要的实际好处。当然,有的人告诉我说:“你并不是第一个想到垃圾回收的人。在此之前在这样或那样的程序里就有出现了。”我并不讨厌这么看,不过我想这可能是真的。

   

37. 回首往事,在你职业生涯中最值得你骄傲的是什么?而你想收回想法的又是什么?还有没有什么思想是你提出来的而没有被注意,但你想让它产生更多影响的?

我想那就是如果IBM能采用我的时分共享的思想的话,具体的讲就是Gene Amadhl能在做360项目的时候采用我的时分共享的思想,那在60年代事情就会变得好很多了。因为他所做的不过是对Bell实验室设计的磁带对磁带操作系统的一种复制而已。如果说要产生更加实际的影响,那么这就是了。

   

38. 我听到观众都在说:“阿门”。这里有一个稍微奇怪一点的问题,列表上的第9个问题。斯坦福的AI实验室是一个独特的地方,远离校园,而且由一组不拘一格的组成,包括了搞软件的人,搞硬件的人,还有音乐家,每天都有排球比赛,而且有自己的计算设施。这些因素对于做这种有深远影响的研究有所帮助吗,或者这些因素其实没什么相关?

我想可能没太大关系吧。Doug Lenat曾经说如果我不牵涉斯坦福AI实验室的话也许更好,坐在一个办公室里致力于将数理逻辑中的常理形式化。可以说Lenat也许是对的,如果我能够在形式化数理逻辑的常理方面取得成功的话,但我不敢打保证我能成为的那个人。也许氛围也起了一定的作用吧,但这种自由氛围其中的一部分原因却是来自于我没办法将DARPA给我的所有资源都用于对我最重要的工作上,也就是形式化常理,因为我没法想出一个项目来做这件事情。因此,每个人都可以做他们想做的事情了。

   

39. 这也是你不想做领导,让人们做他们想做的事情的又一例子吗?

我告诉你吧:如果我知道我想让他们做什么,我可能会试着当这个领导了。

   

40. 我认为,形式化常理是一个非常困难的问题,到现在仍是。

确实如此。例如,我启发人们进行视觉研究,一部分是因为我参与了50年代关于视觉思想的争论,而这与歧视又有一定的关系。我创造了这一口号:“描述,而不是歧视”,并且给出了一个例子,如果你想要机器人拾起什么东西,而你不能认定它,你必须描述它的形状以及它排放的样子。所以我们从事机器人研究并从 DARPA拿到了赞助。

   

42. 计算机视觉仍然是一个困难的问题。现在我将再一次把这个列表放到一边,让我们的观众有机会向你直接的交流。在这个房间里我们准备了麦克风。如果有谁想向 John直接提问的,那就来吧。(Herbert Sterns提问):在Lisp的发展中,Marvin Minsky产生了什么影响?

我不认为他有什么影响,也不认为他尝试过有什么影响。他所做过的一件事是,做符号化集成程序的James Slagle是他的学生。Slagle对Lisp产生了一些影响。他对于自由变量的问题做了一些工作。他发现我所假设的这一问题可以解决其本身的方式存在一些不足,但我不知道他的问题是否有受到Marvin的直接影响。

   

44. 我直到六年之后才参与进来,所以我不知道——不是我所工作于的那个Lisp。

不是很清楚,我记得曾经读过关于这个的一个备忘录。但不知道它是否真的被加入了生产环境的使用中。

   

46. 前一个问题是关于Marvin Minsky对于Lisp的影响。

我问到:“他是否加入了Lisp呢?”。这是一个真诚的问题,因为就算是在早期我也不是Lisp的领导。Lisp会有新的东西增加而不经过任何人通知我。我并不是——所谓的——看护者。提示一下现在这个问题。

   

48. (Kent Pitman)我没有一个专门的名字好建议,不过我还有一个与此相关的问题。你如何评价动态类型,我认为这是这一语言的中心之一,而静态类型的缺失是一种特性呢还是一个bug呢?

我想两者都有吧。作为我的想法来考虑它是一个bug。实际上,我记得关于Slagle的问题第一次的讨论,我的态度是:“欧,你们总得把这事儿搞定!”之后我们有过严肃的讨论最终的结果是他们谈到有两种不同类型的变量等等。我实际上并未参加这一讨论或决定,都是由他们来做的。所以,这不是仅仅跟Lisp相关,其它的编程语言也是这样,我直到很后来才能完全理解。

   

49. (John White)当我在卡耐基念本科的时候,Perlis所追求的圣杯就是用符合和代数来对数学进行形式化,但他走的是ALGOL的道路。而你确实提到了关于 ALGOL的一些事以及对于它的一些想像,于是他长时间寻求公式化的ALGOL以成为Slagle工作的竞争者,直到很多年之后他个人致歉并表示他对 Lisp的赞同。我想知道的是你是否听过“formula ALGOL”这一术语,如果是的话,那么这种工作以及它在符合代数,数学实验室,极值等等方面产生的分支,是否可以以一种类似于ALGOL的语法和语义来实现?

当formula ALGOL一被提出的时候我就看过了。我认为它很不好,它很混乱,而这混乱之处来自于:它重载了代数操作符并将它们用于公司。在一定程度上,你可以这么做。但另一方面,你有着加法,减法等操作,你可以将它们用于公式而得到两个公式的和或者两个公式的差。但一般来说,你并不想这么对公式操作。至少在他们给出的例子中,他们没有包括对公式的微分等等。

   

50. John,现在我回到这一问题列表。你能看一下第14个问题吗?你认为好的标记能促进好的思想而不好的标记会妨碍它这一说法吗?

我想抽象语法是一个好的主意,而并不是标记。抽象语法可以工作于特定的标记的幕后。然后,因为人们并不使用抽象语法,所以你会问:“从历史来看,标记扮演着怎样的角色?”——我想我只能说我不知道。

   

52. OK。我只是想知道:抽象语法只是抽象的吗还是它是其他样子的,或者对于抽象语法是否也有良好的设计与不良的设计呢?

我不知道有什么其它替代的抽象语法。就“和”而言,就抽象语法而言,真的不存在任何替代。

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT