田春:走在Lisp的岔路上

非商业转载请注明做译者、出处,并保留本文的原始连接:http://www.ituring.com.cn/article/553git

田春,Common Lisp 程序员,毽球运动员,跆拳道 2 级。网名“冰河”,Glority Software资深软件工程师,前网易杭州研究院高级开发工程师和系统管理员,资深Common Lisp程序员。他2003年起开始学习Commom Lisp,精通Lisp史和各类实现,2007年起成为 LispWorks 付费用户,Common Lisp社区的网络专家,开源项目cl-net-snmp(SNMP协议库)的做者,usocket跨平台网络库的主要维护者,common-lisp.net站点管理员,水木社区(newsmth.net)函数型编程语言(FuncProgram)版主,美国Versata/Gensym公司技术顾问。他曾在2008年翻译了Paul Graham的On Lisp一书,在ILC 2009(国际Lisp会议)上发表学术论文,在《程序员》杂志上发表Common Lisp专题文章,并在网上撰写过大量相关的技术文章。程序员

图片描述

图灵社区:你好,田春,可能你们更熟悉的仍是你的网名“冰河”,先向社区的读者介绍一下本身,好吗?编程

田春:你们好。首先,关于敝人的网名,实际上是自小学起就在使用的笔名或昵称,只是一个名字而已。但须要解释的是,敝人跟传说中的冰河木马没有任何关系,重名纯属巧合。安全

我从小学五年级开始学习计算机,早年在NOI信息学竞赛上只有一点小成绩,初高中阶段沉迷游戏和DOS/Windows编程,学习成绩很通常,高考时超常发挥才有幸考入浙大一个非计算机专业。 大学期间自学了包括Linux和Lisp在内的多种计算机知识,毕业后凭借在校期间Linux方面的声望进入网易公司从事系统管理,工做期间继续学习Common Lisp,在该领域写过开源项目、发表过国际会议论文、翻译过经典英文教材,最后因机缘巧合接触到国外的古老商业Lisp软件,通过两年多的努力,目前以维护该软件为生。服务器

图灵社区:你的经历真是跟Lisp是息息相关啊,但不少人对Lisp只有一个模糊的概念:这是一种中古语言,可否结合你本身的经历谈谈Lisp?微信

田春:在我计算机生涯的前十年,其实彻底没有想过未来会以此谋生。我选择计算机领域的具体学习方向几乎彻底是兴趣导向的。早期的时候,信息相对封闭,我和当时其余同行同样走的是从DOS到Windows,从BASIC到C或Pascal再到Visual Studio系列,这样一个循规蹈矩的学习路线。后来到杭州读大学,不久就开始学习Linux和Lisp。网络

个人Lisp经历能够分为N个阶段:socket

1) 人工智能编程语言阶段——小学五年级和六年级。那时有一本书,叫作《计算机应用指南》,里面讲述了1994年时整个计算机领域的情况,其中“人工智能与专家系统”那章里着重强调了Lisp和Prolog这两种AI语言的应用。这是我最先的Lisp印象。编程语言

2) GNU 和Emacs阶段——大学第一年。GNU工程的创始人R. Stallman早独立完成了两大自由软件:GCC和Emacs,后者使用一种Emacs Lisp语言来扩展Emacs环境。Stallman自己也是Lisp黑客,在Lisp机上写过真正的Lisp程序,还参与过Common Lisp语言初版(CLTL1)的标准制订工做。按理说全部学习Linux的人都多少会受到一些Lisp方面的熏陶,遗憾的是,最终多数人只是停留在Emacs和elisp层面上,我算是少数顺着这条Lisp道路一直走向终极(Common Lisp)的那些人。函数

3) Scheme阶段——大学的第三年。经过 SICP 一书和 MIT OpenCourseWare 的配套视频来学习,那个时候普遍接触了Linux系统自带的各类Scheme软件包,在学习计算机通常理论的同时学习Scheme语言。我逐渐发现Scheme语言自己太简单了,具体的实现又很是多,互相之间区别很大。不少人最终停留在Scheme阶段,其中少数有能力的人又本身创造了许多新的Scheme实现。但我没有停下来,继续向前走。

4) Common Lisp 阶段I——大学第三年晚期和第四年。学习 Debian 系统自带的 onlisp 和* Common Lisp the Language *电子书,而后用 Debian 自带的 CMU Common Lisp,Steel Bank Common Lisp,GNU Common Lisp以及GNU CLISP等环境来进行Common Lisp编程实践。

Debian里还有几个很大的Common Lisp写出的软件,包括Maxima和Axiom两种数学符号计算系统。CMU Common Lisp (cmucl) 的软件包文档里有The Evolution of Lisp这篇著名的论文。我读完之后,顺藤摸瓜经过学校内网的ACM Digital Library等论文渠道,把关于Lisp语言发展史的关键论文几乎全看了一遍。不过,这个时候还没写出一个像样的Common Lisp程序,彻底是在学习。

5) Common Lisp 阶段II——主要是发起本身的开源项目(cl-net-snmp),试图翻译各类Lisp资料——最主要的就是On Lisp一书。我认为这是一个领域的新手一般会作的两件事。

6) Common Lisp阶段III——参与维护别人发起的开源项目(usocket、cl-xml、cl-http、cffi 等),以及试图了解和改进各类Common Lisp 平台自己的源代码。捎带着参与Lisp相关的国际会议,把本身的成果整理成论文,以便跟其余同行创建联系,走向领域前沿。

我如今处在一个新的阶段,而且也走向了Lisp领域一条冷门的岔路上:维护前人留下的古老商业Lisp软件。我不认为这是一条终极道路,相反这是一条歧途,但我必须去作,由于若是我不作的话,这些有价值的东西就可能失传。我如今的工做与其说是为了谋生和我的兴趣,还不如说是像一个历史学家同样,在努力地行使保护历史文物的职责。Lisp领域可谓是浩如烟海,没有其余任何语言具备像Lisp这样的深度和广度,也没有哪一个语言的程序员能够像Lisp程序员那样热爱本身的语言。这是个人观点,但它的真正内涵须要人们本身去体会。

图灵社区:关于编程语言的学习,你有一个颇有意思的观点——C和Lisp是编程语言的两个极端。能否就此谈谈,并对如何学习编程语言提供一些建议?

田春:这实际是 Paul Graham 在The roots of Lisp(Lisp之根源)这篇文章中提出的观点。该文第二段里是这样写的:

“我认为目前为止只有两种真正干净利落, 始终如一的编程模式:C语言模式和Lisp语言模式。此两者就像两座高地,在它们中间是尤如沼泽的低地。随着计算机变得愈来愈强大,新开发的语言一直在坚决地趋向于Lisp模式。二十年来,开发新编程语言的一个流行的秘决是,取C语言的计算模式,逐渐地往上加Lisp模式的特性,例如运行时类型和无用单元收集。”

我是在赞成 Paul Graham 的上述观点的基础上,作出了“C和Lisp是编程语言的两个极端”这一评价的。但个人依据除了两种语言的语法风格迥异之外,还考虑了C程序和Lisp程序大相径庭的运行方式:C程序老是一些零零散散的独立可执行文件,由操做系统把它们拼接在一块儿;而Lisp程序本质上是对Lisp环境和Lisp语言自己的扩展,Lisp环境就像一个虚拟机同样,行使着操做系统的职责,把其中加载的全部Lisp代码运行起来(Emacs又未尝不是如此呢)。纵观其余全部语言,我看不出还有本质上的第三种方式了。

图灵社区:咱们知道Common Lisp是Lisp的一门方言,对这门方言的实际应用和将来前景,你有什么见解呢?

田春: Common Lisp 是 Lisp 语言家族中惟一具备工业强度的大型语言,它自己就是为了把以前全部真正用来通常性软件的 Lisp 语言统一块儿来,尽可能兼容它们并消除不一致的地方,最后获得一个完美的集大成体。这个目标事实上确实实现了。1991年,Common Lisp发布初版,至今全部代码几乎能够不经任何修改,就运行在目前还在流行的至少10种不一样的Common Lisp环境上,整整二十年来Lisp程序员的成果一直能够正常运行,这对Lisp程序员无疑是一种巨大的鼓励。相比之下,其余的语言要么消失了,要么已被改得面目全非。

个人见解是,一个追求卓越的程序员应该普遍尝试多种语言,但如何他真的这样作了,他必定会在遇到Common Lisp时停下来,由于他发现这门语言是最强的,也是最美的,而且学习过程也是最艰难的,艰难到以致于学成以后,再没有精力也没有必要去学其余语言了。而后他就会想尽办法让一切编程事务都用Common Lisp来作,最后会奇迹般地发现Common Lisp什么均可以干,并且没有哪一个领域是干不了的,甚至于没有哪一个领域是还没有有Lisp程序员踏足的。

至于前景,就像我在《实用 Common Lisp编程》一书译者序里表达的:一门语言能安全地存活50年,那么它就必定能够存活100年。人生宝贵,若是但愿本身的劳动成果长久流传于世,那么选用Common Lisp来表达本身的思想是最稳妥的。

图灵社区:《实用Common Lisp编程》的做者,强调了Lisp的“可编程性”和“适合探索性编程”。就这本书,他是如何体现这些特点的?这些带来怎样的阅读体验呢?

田春:主要体如今贯穿于书中的实践性章节里。在不少其余语言的相似实践性章节里,多是把程序的最终版本逐个部分地向读者作解释,好比这个函数将会完成哪些功能,那个类是作什么用的,诸如此类。但在学习者把全部代码输入电脑以前,程序是几乎跑不起来的。而在《实用 Common Lisp编程》一书里,做者借助Lisp语言自己的强大优点,采用真正的按部就班教学法:每个函数,都从直接能够运行并完成实际功能的简单版本开始,而后再根据逐渐复杂的需求被不断改写;或者单个函数规模变大之后,再添加新的子函数,诸如此类。这样可以确保学习者每次都能取得阶段性成果,同时演示了Lisp程序员们真正写程序时,是如何从零开始,边设计边施工,最后一路积累千上万行代码的。

我本身也写过超过1万行代码规模的cl-net-snmp项目——一个完整的SNMP协议实现。在这个项目里,我甚至作出了MIB编译器,把MIB定义转译成Lisp,而后要么解释要么编译加载。这个项目就是从零开始,先解决ASN.1各类基本数据类型的BER编解码,而后封装SNMP数据包,再作MIB的语法解析,直到整个服务器和客户端都正常跑起来。Common Lisp开源社区的同行对个人成果极为称赞,虽然个人代码质量和程序效率还不行,但人们广泛惊讶我能够用Lisp,将一个看似简单的网络协议以最复杂也最贴近Lisp的方式成功实现。学完这本书的实践部分,就能够掌握编写Lisp程序的正统思路。而后不管多么复杂的程序,均可以用一样的思路逐渐写出来。

图灵社区:能不能向有志于学习Common Lisp的初学者,介绍一些网络资源呢?

田春:全部最重要的网络资源,都写在这本书的最后一章里。但我认为对于初学者来讲,看书是最重要的。Common Lisp the Language(CLTL2) 是最重要的 Common Lisp 语言大全。提及来, 《实用Common Lisp编程》一书只涵盖整个语言不到一半的特性。要想写出最专业的代码,必须了解而且灵活组合运用这门语言所给予程序员的全部东西。所以CLTL2是必定要看完的,遗憾的是仔细看完这本书至少须要半年。

不管如何,我不推荐人们过早地去参与各类线上讨论,由于Lisp社区对新手并不友好,国外的社区尤为是这样,贸然去问各类无聊的问题只会自取其辱。

图灵社区:跟你合做本书的过程当中,图灵的编辑都获益良多。在此次的合做以后,你对技术图书的出版,又有哪些见解和建议呢?

田春:这本书得以顺利出版,仍是要感谢图灵的编辑们的。尽管这本书8月份的时候离出版还遥遥无期,我当时采起了一个手段威胁大家(笑)。不过,有几点我仍是不太满意的:一是排版用Word太不专业,推荐用LaTex排版;二是这本书的最后没有索引,其实索引对这本书比较重要,由于全部粗体的字都是Common Lisp的关键字,写代码的人想用某个语句的时候,能够经过索引来查询;三是出版周期仍是太长。

至于建议,一是但愿图灵的书从此能保留索引,方便读者查阅;二是应在翻译合同中加入出版时间的约定,规定交稿后多长时间出版;三是但愿图灵能引进On Lisp的版权出版翻译版,我能够提供译稿供出版使用。

图灵社区:感谢田春接受图灵社区的采访,与你们分享本身学习Lisp的经历,以及对Lisp的见解。


更多精彩,加入图灵访谈微信!

图片描述

相关文章
相关标签/搜索