为什么我选择Python,而非Ruby
2009 3 17 01:13 AM 10641次查看
然而这么久的比较,却让我明白了一点:没有一门完美的语言,只有更好的语言,以及更适合自己的语言。
语言一直都在发展,每个时代都有各自的主角,你可以一辈子用一门语言,但你半辈子都在浪费你的时间。
如果对于某人来说,某门语言是完美的,那么对于品味不同的人来说,这门语言就充满了瑕疵,原因稍后我再解释。
所以选择只是针对当时和个人,你无法叫一位资深的C程序员爱上Perl,我也无法改变1个月前自己最爱JavaScript的事实。
在我看来,一门语言最需要的几点如下:
- 能在合理的时间内,实现你想实现的。
- 能方便地实现。
- 能以你感觉很自然的方式实现。
- 能达到合理的性能要求。
- 能让你快速地学习。
要提醒的是,第5点不是学会,而是学习。任何一门语言都不是2、3天就能领悟精髓的,如何在“入门—掌握—精通”这条路线上快速成长,对程序员来说,也是个很重要的成本问题。
还想强调的是,第1点的重点不是“能实现”,而是“在合理的时间内”。汇编语言是什么都能实现的,但它在大多数情况下不能达到“合理的时间内”。
我的观点是时间最为宝贵,更具体地来说是程序员自己的时间。所以同样做一件事,如果方案A比方案B要节省一半时间,而完成情况又都能达到要求,我是不会为了对我来说微不足道的“更高的品质”,而去牺牲最宝贵的时间的。
因此,如果动态语言能做到,我是不会为了2个数量级的性能,而多耗费1个数量级的时间的。
在动态语言里,仍有无数的语言。我拿Python和Ruby来比较,仅仅是因为它们流行。
在2009年2月的编程语言排行榜上,前20名里可以看到如下的动态语言:PHP、Python、Perl、JavaScript、Ruby、D、ActionScript、Lua。
不考虑所用领域很有限的语言,就只剩Python、Perl、Ruby、D和Lua了。
其中D语言是我最不了解的,从目前掌握的情报看来,它还出于个人的非开源作品,甚至连关键字和操作符都一直在不停变化。
Perl我曾在大学时读过一本教材,可能是书的原因,看得懵懵懂懂的。但无论怎样,它怪异的语法阻碍了我的学习。
Lua也只在今晚看了3页的教程和官网上的5个demo。仅从语法上给我的印象来说,它没有Ruby简洁;从功能上来说,它应该也不及Ruby。
所以今天的核心就如标题所言,锁定在Python和Ruby。
先说下我对这2门语言的简单看法吧。
Python:
- 语法简洁,容易从类C语言转型,可以快速上手。
- 代码优雅,容易阅读。
- 使用方便,有大量的内置类型和模块,以及第三方模块。
- 思想和风格保持一致性,很多代码的思路都相通,很少出现格外突兀的诧异。
- 语法复杂,融合了众多关键字和操作符,且与一般语言不同。
- 代码简短。
- 使用方便,有大量的内置类型和模块。
- 完全面向对象,一律使用面向对象的方式。
你或许要花2、3天时间才能学完它的语法,或许能发现它不少的闪光点——它确实是块瑰宝。
然而它虽然吸收了各家的精华,却无法保持自身的简洁。
同样的逻辑判断,你即可以用if,又可以用unless,而区别只是逻辑表达式的真值不同。给予过多的自由并不是件好事,因为过多的选择,就让程序员不得不关注在选择上,而不是他想实现的事上。
再如异常处理。Ruby是用rescue和ensure代替C++的catch和finally,也算是创意吧。可是Ruby还有catch关键字,用法还不一样,一时让人不知道该rescue还是catch了。
接着看看循环语句:for、while、until、loop,而until仅仅是while的反义词,loop则是while true的同义词。
接着你又奇怪了,为什么没有do...while语句呢?因为do...end是用于异常处理的。
可是那个redo又是怎么回事呢?它是重新执行循环的。
那还有个retry呢?它既可以从头开始执行循环,又可以再次执行异常块。
最后看看那个@,不是说它代表实例属性吗,怎么还有个self关键字呢?self是指当前的上下文对象,用它操作属性是通过调用实例的方法,而@是直接操作属性。
说实话这些功能都很有用,可是我已经被弄昏了。
反观Python,很多Ruby中很方便的语法,它都没有(详情可以查看我写的语法比较);但它却以一套简洁的语法,加上众多的模块,既让程序员思路简洁,又不失灵活性和完备性。
Python的哲学不是吸取百家之长,而是发挥自家之长。它将关注点放在真正最重要的地方,而非华而不实的小伎俩上。
就拿Python的字典来说,它的形式和JSON完全相同,可以直接转换,这在web编程时可以很方便地将AJAX的XML去掉,改为轻量级的JSON。而Ruby和Lua等却只考虑自身的语法(其实最想批的是完全无用的end语句)。
当然,Python的语法也不完全符合我的胃口,至少我希望它支持更强大的匿名函数,提供Ruby那强大的区间和switch。可为了这3样东西,是否有必要接受Ruby那一大堆东西呢?
此外还得说说Ruby引以为傲的面向对象。
毋庸置疑的,Ruby是纯面向对象的语言,以至于你必须习惯于对象.属性/方法,以及为此而将方法写得像个属性。
而实际上,Python的len('123'),是否就比Ruby的'123'.length缺乏美感呢?
其实不然。面对简单的问题,人总是习惯于自己挥手搞定,而非让他人“代理”。更何况,Python也有这种难看的OO写法:'123'.__len__()。
如此比较下来,Ruby的2、3点做得确实不如Python,至少,它的哲学/美学不合我口味。
而第4点,Ruby的性能也算接近Python了,所以基本可以忽略。
再看第5点。
正如前面所说,Ruby的复杂使之难以入门。
而这并非重点,毕竟有心学都是能学会的,然而Ruby却没关注在帮助你学习上。
去找找Ruby相关的书籍,如果除去RoR的话,大概就不到10本了(我只看到1本中文教材)。而Python则要多2个数量级。
再看文档。Python的每个发行版本装好后都附带了文档,每个模块、类、对象和方法都能在命令行下用dir和help简单地学会。
而Ruby在很长一段时期里甚至是文档不全或不准确的,时至今日也没把文档放在发行版本中,而需要自己调用工具生成。至于命令行,我至今还不知道怎么查看帮助。
然后是开源项目。Ruby绝大部分的项目是RoR的,几乎很难开源;反观Python,目前仅在Google Code上就能找到2412个开源项目。前几天Google还开源了JaikuEngine,这可是个非常值得借鉴的好东西。
顺便说个题外话,Python受到了Google的大力支持,至少我就是因为Google App Engine才接触Python的。
而Ruby却得不到这样的支持。尽管Sun和微软都有自己的Ruby实现,但那也只是扩张各自的领域而已。双方的最终目的,都只是想把Ruby的思想融入Java或C#,而非让Ruby取代自己的主打产品。
当然,Ruby的这些不足都可以改进,或许可能超过Python,但思想却是固定的。除非Ruby能够斩去冗余和繁琐的语法,或者某个不爽的程序员,自己弄了个Ruby++、Ruby--出来,否则想取代Python是决无可能的。
向下滚动可载入更多评论,或者点这里禁止自动加载。