Lisp印象

最近逝去了好几位IT巨匠。人工智能之父、 Lisp语言发明者 John McCarthy昨天也去世了,R.I.P.
高中刚刚学编程时,我天真的认为会用的编程语言越多越牛逼。那时还给自己列了个有很多语言的清单,并信誓旦旦的计划大学毕业前把清单上的语言都学会。当年我还只会BASIC,Lisp连听都没听说过。
在论坛里(尤其是遇到和语言之争相关的讨论时)常见到有人说“语言不重要,思想才重要”。有底气说出这句话恐怕要建立在对各种编程范式有足够了解的基础上;不能以此作为自己为对不熟悉的事物排斥、恐惧、开脱或与人争执时呈口舌之快的借口。想脱离繁文缛节的谈思想,也要有过大量相关细节的经历,才有料。有人说语言不过顺序、条件、循环,各种语言都是相通的,学会一种很快就可以上手另一种;的确掌握了一种语言的结构化程序设计方法再学另一种会因为有已知知识作参考顺利许多,但写if和for这类东西只是使用语言的最小子集,会用不代表能用的地道。学语言,在掌握了基本的语法规则后最重要的就是学会那门语言独特的惯用思维方式。
Lisp是门很古老的语言,古老到是仅晚于FORTRAN的第二款高级程序设计语言。最初接触到Lisp我了解到它是函数式编程范式语言,函数和数据一样是第一类对象;当时我很不解这些概念并迷惑函数是第一类对象又如何。孤立的感悟这种东西太抽象太不知所云了,那时我看了一些概念就作罢了。随着后来逐渐接触到别人写的博客和代码里的一些函数式编程主张,我渐渐对函数式编程懵懂了起来。如今再看Lisp的一些特性对其“纯粹”度很是惊讶。Lisp的介绍可以看 Wiki。Lisp首创的函数式编程依赖于 Alonzo Churchlambda演算理论。形式语言、自动机、lambda演算是我认为很重要的计算机理论基础,可惜没听说过周围人在大学里学过(顶多编译原理顺带一点点形式语言和自动机)。
Lisp有很多首创的编程思想在今天来看仍然高瞻远瞩:if-then-else控制结构,递归函数调用,动态内存分配,垃圾收集,第一类函数,词法闭包,交互式编程,增量编译,动态类型。当前主流编程语言正逐步融入函数式编程特性,越来越多的现代语言加入了函数对象、lambda表达式、函数闭包等概念,actor、map reduce等编程模型也得到越来越多的关注。关于编程语言的发展趋势,老赵有一个翻译的系列文章很好:
就Lisp来说,在国内非常小众,但在国外Lisp语系却长久以来都是很多计算机科班学生的入门或必修语言。在应用上AI应该是我见过和Lisp最紧密的领域,每本讲AI的书上也都要花一些篇幅介绍Lisp;Emacs是和vim齐名的编辑器,它就是用一个Lisp驱动的;AutoCAD软件的二次开发也要用到Lisp,一些在设计院或铁路部门工作的程序员同学应该更了解一些实际情况吧;web开发也经常有Lisp的影子。我学习Lisp没指望能直接受用,更多的是兴趣使然,但种种体验能潜移默化的影响到我的日常编程吧。周围同学和我说过对什么什么感兴趣但是一直忙啊没时间啊;不忙时也可能发现自己未必每件事都能坚持;试着做一些业余项目也时常不了了之,项目的最后10%收尾性的工作往往是最难完成的。建议看看《 你是像我一样?还是很有自制力?》,狠下心,总会达到目标的。
高中的编程语言清单计划我差不多就从来没有正儿八经实施过,一般我是遇到一种应用不得不迫使用一门我不会的新语言去开发的时候就半被迫半好奇的去学了,这么多年过去了,我用过的语言数量不知不觉早就超过当初的清单所列了,但我能熟练使用的用一只手就能数过来。我对“熟练使用”的定义是不光知道它能做什么,还要知道它不能做什么。显然我还是个Lisp初学者。
刚学一样编程手法后经常对这种手法大为欢喜,比如刚学会list就到处用list不用数组,刚学会dictionary就遍地用它不用list,刚学会断言、一两个设计模式或是其它奇技淫巧都屡试不爽甚至在技术交流时大加溢美。但是我想,一旦自以为找到了解决某一方面问题的银弹时,就应该查找补习自己未知的死角了,随后很可能有新的发现。技术成长是两个步骤的反复迭代:探索发现,质疑否定,或者说学习自己知道但不会的和发现自己不知道的。深度是一方面,广度是另一方面,经历的多了,在遇到没写过的应用时就更容易下意识的就把它恰当的做好。

你可能感兴趣的:(lisp)