还是从我在 Ruby 和 Python 上的经历说起吧。
大二暑假的时候学了 Ruby,但是到现在为止只用 Ruby 做过文本处理,还有一次做 Linux 网络编程作业的时候用 Ruby 实现了一个服务器的原型,还稍微尝试过一下 RoR,不过因为我对 Web 开发没什么兴趣,所以是浅尝辄止而已。平时自己机器上能够用到的 Ruby 程序也只有 deplate 而已。
今年寒假的时候开始考虑毕设的事情,考虑实现语言的时候也曾考虑过 Ruby。但是我要用的 dazuko 的 Ruby 绑定可能存在内存泄漏的问题,引起内存泄漏的原因应该在 Ruby 的实现上。考虑到 Python 的实现更成熟,对于要求稳定的系统程序来说可能更为合适而开始考虑 Python。于是开始看 Dive Into Python,被这本书吸引而继续学下去。我之前的介绍过这本书,很欣赏它。
最经开始更多的实际使用 Python 了,很自然的会想把它跟 Ruby 做些比较。因为我对 Ruby 和 Python 的语法和特性的了解只是一般而已,所以对语法的比较我说不出太多的东西。在我看来语法上来看它们相似的地方多于不同的地方,在它们中进行切换是很方便的。我很喜欢 Ruby 的 block 语法,但 Python 有 list comprehension 和 generator,很多 block 的用法都可以用它们来完成,所以我并不会在使用 Python 的时候非常的渴望 Python 也有 block 语法(仅有的时候是文件打开完成任务以后自动关闭这种地方,Python 里还没有很好的解决)。就语言本身来说我更喜欢 Ruby,个人觉得用 Ruby 写程序更为舒服,而且通常完成同样任务的 Ruby 程序也比 Python 更短。但是 Python 的优秀的社区使我选择 Python 而不是 Ruby。
在 Python 和 Ruby 中我只想选一个,用它来完成一些 quick and dirty 的任务,我希望一切越简单越好,最好就是别人已经帮我完成了,直接拿来用就可以。随着越来越多的使用 Python,看到 Python 社区所完成的工作,我觉得 Python 才是这一任务更好的选择。Guido 在一次访谈中说:
对于杀手锏应用(killer application),我个人并不十分迷信。如果你太看重杀手锏应用的话,实际上你可能会把焦点放错地方,或者你可能太专注于某一个方面。
以前对这话觉得不屑,觉得是酸葡萄心里而已,现在越来越觉得 Guido 是对的。Python 现在已经进入很多领域,在科研领域,已经出现像 NumPy, SciPy 这样优秀的软件。我也看到生物信息学研究者写的用 Python 编程来处理生物信息学问题的文章。在图形处理方面也有了优秀的软件,如 PIL。而 NASA, Google 等组织也在大量使用 Python。而在 Web 开发框架上,Python 有不止一个,另外还有像 twisted 这样高层的互联网应用程序开发框架。实现上 CPython 比 CRuby 也要成熟,两者都有许多实现,以前很看好 Rubinius,但现在我知道了 PyPy,如果 Rubinius 能够使得 Ruby 在性能上有很大的提升,那 PyPy 肯定也能,事实上 PyPy 现在应该比 Rubinius 更成熟。而我现在自己常用的 VCS 工具 Mercurial 就是用 Python 实现的。
从使用的广泛程度来说 Python 目前远超过 Ruby,记得 2008 年 1 月的程序设计语言使用广泛度统计中 Python 排名首次超过 Perl,而 Ruby 的排名反而下降了。不知道是因为 Python 有大量优秀的软件导致大量的使用,还是因为大量的使用导致有如此多优秀的软件,但现在的社区已经使得这两个方面可以互相促进,形成一个良性循环了。如果 Python 社区的注意力都集中在 Web 开发上,或许它可以出一个类似 RoR 的 killer application,但它就不会产生如此之多不同领域的优秀软件,也会使得 Python 的使用达不到如此广泛的程度。在我看来这是得不偿失的。
即使我不喜欢 Python 中一些 Guido 强加给我的限制,但是只要它能够让我把那些 quick and dirty work 以最快的速度最小的精力做完,我就不在乎,而那些限制在构建大型软件上可能反而能够带来好处。如果哪天 Ruby 能够像 Python 社区这样成熟,提供更多的优秀的软件,那我在解决个人的 quick and dirty work 时就会选择使用 Ruby。但是现在,我选 Python。
我仍然会花时间去学 Common Lisp,但 CL 现在不擅长跟 OS 和其他基础设施交互,所以我不会用它来完成日常的工作。我目前只打算想把它作为一个研究性质的语言,满足我对程序设计语言本身的兴趣。一方面,SLIME 提供的交互式的开发环境更加合适探索性的任务(ipython 虽然不错,但是跟 SLIME 和 CL 提供的环境比起来还是差了点);另一方面,正因为有许多工作在 Common Lisp 中还没有完成,我可以尝试自己来研究解决,在其中得到锻炼。我也希望在真正领悟 Common Lisp 的时候我能够成为一个更好的程序员。
语言的选择并不是至关重要的,但是我希望能够使用一个使得编程更加有趣的语言。以前在语言上花了太多的时间,现在决定把语言逐渐固定下来,把注意力放到更加重要的问题上,为我以后的研究做准备。
PS: 现在在浦口每天的时间都可以自己支配,太爽了 :–)
不过想看的书太多了宏观经济学(微观已经看完了),算法导论,线性代数,Ansi Common Lisp,还要每天在毕设上投入一点时间(现在还在准备阶段),再加上要利用本科最后这个学期好好练小提琴,有点安排不过来了。为了集中精力,有些书看了一点又要停下来了。
最近回到浦口真开心,爱死浦口的食堂了 :–) 我现在的日子跟查师兄去年的比真是太舒服了,这两天有点堕落,明天起要鞭策自己努力了。