編程語言中的 Ducati

原文:Lisp – The Ducati Of Programming Languages 作者:薛宏 原發表日期:2007/12/1 http://willy08.deviantart.com/

介绍

2003 年一个夏天的傍晚,我和一群朋友坐在纽约一个咖啡馆的阳台上。东海岸的潮湿气流还没有到来,我们一边享受着暖暖的清风,一边看着路上经过车辆闪烁的车灯。坐在我旁边的是一个不认识的家伙,他是一个朋友的朋友。他身着摩托服,大腿上放着头盔。为了打破沉默,我问了我想到的第一个问题:“骑摩托是什么感觉?”我对此很感兴趣,但并不期待得到什么新鲜的答案。我不能向别人形容开车的感觉,又怎么能期待别人向我描述骑摩托的感觉呢?实践胜千言。但他的回答让我惊奇。

“当你开车的时候”,他说,“你的思想和机器之间是不连续的。你可以通过仪表观察它,但你不能真正的感知它,除非它是辆摩托。如果你想加速,你加入一些汽油,但是你需要等待一定的时间后汽车才会有所反应。而对于摩托,这段时间非常短,以至于你更本不会察觉。你想做什么,你马上可以做到。摩托变成了你身体的一部分,一种有机的延伸。你可能需要一辆法拉利才能达到这种人车合一的境界。”

当时我就决心以后要学开摩托(首先我需要一些空闲的时间并且想办法不让我妈知道)。我花了几天的时间思考关于人机合一的哲学,直到有另外一些新的想法,然后这段对话便渐渐地淡忘了。

Common Lisp

学习 Haskell 就像挑战一条新的攀岩道,是一种非常慢,具有挑战性,十分紧张刺激,但却十分愉悦的过程。当我最终到达一个阶段可以休息的时候,我感到很快乐。为了防止我不可逆转的以 Hindley-Milner [1] 的方式思考问题,我决定离开 Haskell 一阵,在接下来的几个星期里用 Common Lisp编程。

有一天吃饭的时候,我和一个朋友谈起我正在做的一些事。他一直无法理解我对那些“怪异”语言的偏爱(很少有人会理解)。“那么用 Common Lisp 编程到底是什么感觉?”,他问。忽然间,那个三年前的比喻从我脑海的最深处蹦了出来,“就像骑摩托”,我说。

Common Lisp的编译器不仅仅是个工具,当你获得一些关键的知识后,她就成为了你思想的延续。你思考你想做什么,不一会儿你便做到了。你的大脑感觉不到延迟。用 Common Lisp 编程是一种非常流畅的过程,以至于你很难把电脑想象成一个外在的实体。Common Lisp 是编程语言中的 Ducati [2]

Haskell

当我朋友听到这个比喻后,有接着问了第二个问题。“如果 Lisp 是 Ducati,那 Haskell是什么呢?” 我很高兴他问了这个问题,对于我这样的 Haskell 新手,思考这个问题有助于我解决我心中最后的疑惑。

经过一些思考,我发现这个比喻并不能很好的适用于 Haskell。用 Haskell 编程并不像开车,缺少那种流畅性。Lisp 能让你即时地把思想变为程序,而 Haskell 却是用另一种方法提高你的编程效率。她强迫你仔细地思考和改善解决问题过程中的每一个步骤。缺少流畅性换来的是程序整体架构上的完善。你需要花很多力气才能写出丑陋的 Haskell 程序 [3]

你要先学哪一个,Lisp 或者 Haskell?这是由你性格决定的。不过有一点是确定的,如果你想成为一个好的程序员,最终这两个你都必须学。


[1]: Hindley-Milner 是一种进行类型推导的常用算法,Haskell 之所以是 Haskell,其非常弹性的类型系统是很重要的原因之一。

[2]: Ducati 貌似是摩托里面的老大。

[3]: 这段话我可是深有体会吖,我写的那个 Ball Clock 程序,也就二三十行,加起来却花了我十几个小时(相比 Python 版,我只用了 5 分钟,当然这和我刚学 Haskell 有关,但还是能够说明一些的问题的),有时候一两个小时就在那看着屏幕,发现代码实在是太丑陋了,写不下去了,只能从头来过。但最后的成果确是很令我欣慰的:)

註: 作者所寫的 Ball Clock: Solve Ball Clock Puzzle in Python and Haskell