论坛首页 入门技术论坛

Python, Ruby 与 Groovy,谁与争锋?(11/09/2008更新)

浏览 9559 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-29   最后修改:2008-11-10
Python, Ruby 与 Groovy,谁与争锋?

SleekEngine

随着计算机硬件的快速发展,10年前因为速度问题而被诟病的Java现在成了计算机流言语言中的老大,但是它却仍被认为复杂笨重,近几年来动态语言却有后来赶上的趋势,掌握一门动态语言成了程序员需要考虑的事宜。 近期接触了几种流行的动态语言Python, Ruby, Groovy,它们相比静态语言Java/C++来说,大为简单,灵活,省时,那么选择何种语言? 浅尝三种语言后,写下此文,作为在JavaEye留的第一爪。

从TIOBE网站的语言排名可以看出,比较2000与2008年,Java 从30%跌到20%左右, C++从18%跌到11%, 静态语言从72%占有率降到了60%; 动态语言由27%升到40%,其中Python从1%到5%, Ruby由 < 1%到2.5%。PHP由5%长到11%。(以上数据为大约估算)

从企业界角度看,语言的流行性与以下几点有关:

1)  成熟的库(library)
   Python的库非常多, Groovy可以调用强大的Java所有的库,ruby差些,但是正在赶上。

2) 流行框架
  如果某种语言有个流行框架,那就能吸引过来很多使用者。Ruby on Rail是杀手级框架。Python 框架很多,但是目前尚没有特别突出的。Groovy还年轻,只有个Grails,但是可以利用JAVA已有的框架如SPRING HIBERNATE。

3) 流行程序
   如果某个流行程序使用了某语言,那么这种语言不可必免会被多人使用。比如iPhone的出现使一种可能没多少人听说过的 Cocoa热了起来,因为人们用它编写在iPhone上运行的手机程序。这三种动态语言中Python在图象处理,或科学计算界已占有一席之地。Ruby可能落后一些,Groovy几乎没有。

4) 企业界的倾向
市场通常会倾向于简单好用省时省力,易于使用维护,稳定,能承受大负荷(scalable)的语言,这也是JAVA的流行性当时超过C++的原因,这三个语言比静态语言都简单,其中Python由于其语法和句法简单,所以可能是最好维护,而且能够承受高负荷(Youtube每天数亿点击为证);RUBY 有些魔幻语法也能使程序写得很简单,总体维护上比Python感觉差了一点,让其他人看程序可能不是非常直接易懂,性能上目前也差些。Groovy 模仿了大量RUBY,也借鉴了少量Python文法,由于在JVM上运行,性能上应该是不错的。

5)对硬件的利用
对着双核的出现,可以预料双核,四核,16, 32..核CPU都可能在未来出现。如果未来语言只能利用多核中的一核,那未免太浪费了,也可能因此而落于人后。从这一点上看GROOVY有天然优势,能借助JVM完成这一任务;PYTHON 正在积极研制新的方法实现,也可以在JVM或WINDOW环境下运行JPython 与IronPython;Ruby落后些,但是也有JRuby和IronRuby。

6)语法不一定起决定作用
语言中有好用的语法糖可以给程序员带来方便,但是并不一定对语言未来的流行起决定作用,因为好用的语法可能会被其它语言学去。想想C#学Java知道了。ruby借鉴了许多语言的优点,Groovy 借鉴了ruby与python,而新版的python又借鉴了ruby的block用法(用来自动释放资源)。

从语言的各自优缺点来看:

Python:

1)三者中最成熟,通用,工具库多,资源丰富,文档等支持强大,几乎能做任何事:网络,图形界面,桌面程序,服务器,图形处理,算法等。

2)相比之下性能好,运行速度快,负载力强。

3)简单易学,文法简洁,其使用空白缩进代替花括号或END使代码看起来很干净,易读易懂因此易维护。

4)基于尽量使用一种方法完成一件事,越简单越好的哲学。这种哲学适合大型项目,因为让其他人看着易懂,好维护,不至于过多灵活繁杂的语法使自己玩的爽了,别人看得傻了。这与RUBY的用许多种方法完成一件事的哲学正相反。GROOVY感觉在两者之间。

5)得到业界承认

    a) Mac机,还有大多数Linux,或者流行Linux中绝大多数都默认安装Python,这意味着不管你是哪国人在哪里,想用哪台Linux机子,想用Python就可以用,省时顺手;要用Ruby Groovy还得另外安装。

    b) 有巨头支持。几个例子,Google 互联网老大,公司内部中Python是官方的第三语言,有内部员工说他们是能用Python就用Python, 实在不行才用C++;   Youtube 大部分是用 Python写的;著名Linux发行版Ubuntu的发行公司的官方语言,也是其创始人的首选语言;

     c)其他还有Redhat Linux, 美国宇航局,金融系统如纽约股票交易所,摩根大通,电影动画制作如Disney,Pixar和DreamWorks,星球大战的特效公司ILM等一系列著名大型机构中使用。桌面程序如流行程序BT客户端等。

6)语法灵活亦相对严谨
除了动态性外,类也是开放的(但是底层内置的不是),可以动态增加删改类及其属性函数等。

缺点:
1)不是完全的面向对象,语法中混杂有函数调用方法。
有些语法一些人不易接受:比如代码中的出现不少类似"__str__"的字眼,类函数中的变量表中self等。
2)使用空白缩进代替截止符在网页制作有点问题,这时还得需要新语言或语法,代码Copy Paste等时,使用Tab时也可能有点麻烦,这一点有些人很难接受,加上1)中的情况成为ruby创始人另立门户的主要原因。
3)好象目前还不支持多核CPU
4)尽管创始人说Python这一名字取自一个喜剧团体,但是其名字或图标可能会使一些人反感,有些Python语言网站的的Python图片着实不令人喜欢。不喜欢这种动物的人可以考虑选其它的,比如Python的弟弟Ruby。

简要:Python适合大中小型企业各类开发,几乎无所不在,无所不能,想跟紧大型企业或者需要成熟的库,Python可能较合适。

----------------------

Ruby

1) 语法是更纯正的面向对象语言,许多功能让从Java/C++世界过来的人耳目一新;因为它借鉴了包括Python, Smalltalk, Lisp等在内的一些其它优秀语言的优点。一切都是Object,如避免Python的类似len("name"),而采用 "name”.length, 还有提供类内部参数数据的保护等;提供的更多语法, 比如它有python没有的块与闭包;它有更易懂简练句法,如用' < ' 来表示类继承,用?来表示返回是否的函数。

2) 灵活的魔幻语法,如模块的混入,块,开放式的类定义,加上已有的动态性使其变得极其灵活;各种繁多的著名设计模式在它手中好象都失去了意义,Java做梦都想达到的灵活性在RUBY手中轻而易举,Spring AOP相比也失去了光泽,设计大师们的法则与多年经验也好象都不再适用。

3) 相比Python提供了End作为程序块的截止符,这是Rubyist们自认为的一大进步,也是与Python的一个重要区别。

4) 杀手级框架,Ruby on Rails,及还有些其它杀手级框架正在一一跃出。

5)有跑在JVM的JRuby和微软的IronRuby

6)名字与图标很好    Ruby 红宝石是瞄准Perl (珍珠)的继承者而来的,名字与图标都优雅端庄赏心阅目。

缺点
1)灵活可能有负面影响

开放的类(尤其是底层的)在大型程序中可能会造成混乱,不易懂不易维护,类可能会不知道谁在哪个角落就能够改动(不过有了IDE的支持这种情况可能可以解决);语法方法的灵活可能使代码不规范,一个人喜欢写魔幻代码的有可能使后来人看不懂,其用多种方法实现一个目的的哲学好象是在鼓励代码的多样灵活性,这在大型项目中会加大维护难度。这可能也是为何目前尚未有大型企业界使用Ruby的原因。针对这一情况已经有人提议对修改底层的类加以限制。

2)性能相对不强   原有的Ruby速度慢,稳定性相对差些,据说是原有的GC写的不强。不过随着新的更好的一系列Ruby解析器的出现与硬件的快速发展与价格降低,此性能问题应该能够在不远的未来解决。据Java Eye的Robbin讲,即使有此性能问题,扩充硬件或设置系统也多可解决问题。

3)对线程支持不强,Ruby 2.0据说要加强

4)好象尚未支持多核,不过未来可能解决,道理同2)

5)对End的意见  不少人认为Ruby的End过多,显得不好看。代码在写很多层时尤其如此,这样使查找相应的起始位置增加难度。有人建议其创始人Mats提供End的替代字符,他有此意,但是好象没有他看的上的,如果谁不喜欢End的,找个自认为不错的字符发给总部吧,要趁早,否则以后越来越难改。

综述:Ruby是令人兴奋的,学习Ruby可以加深程序员对面向对象,及计算机语言的理解,从这一点上说,Python更只象个工具,Ruby灵活却又很有深度,值得一学。Ruby的主要缺点是其GC及性能,近年来已经涌现一系列新的解析器号称能解决GC问题;有关性能看看Java的历史可知,当时Java的速度被评为比C++差得太远,可是几年后性能随着硬件的发展而大大加强,所以Ruby的性能应该在未来不会是大问题。

ruby目前最主要的应用也是其杀手锏Rails框架具备快速开发网站的特点,一个或几个人就能快速开发一个网站,能节省很多人力时间,较适合创业型小公司,负荷量不是非常大的中型公司,或大型机构的内部网站。

对Python的空格缩进,非面向对象语法,self, "__xxx__", 跛脚的lambda难以忍受的可以尝试一下ruby

------------------------------------
Groovy

1)初看起来Groovy好象是Ruby on Java,它几乎继承了ruby所有的优秀语法,也添加了少量Python的东西。Ruby中引以为傲的一切是对象,Groovy也可以作到,如 3.times { ...},   块传递,动态改变类,增删类函数等。它借鉴了大量Ruby优秀的语法,保留了C/C++/Java程序员熟悉的花括号,没有用Ruby无所不在的"End”。也支持开放的类,此外还支持将修改的类在一定范围内使用以减少负面影响。对Ruby的一些生僻的字符进行了改进,使得更加友好易懂,如块中的 | x | 换成了 x→;

2)被Thoughtwork(就是写重构那本书的Martin Fowler所在公司)经理称为 “Java 2.0” ,可以“无缝”结合Java 代码,你可以在Groovy文件中写Java代码,用Java库。Groovy象是个轻量级的动态版Java,而且加大扩展了许多易用的句法,以前曾想过的一些"Java 要是这么写多好啊" 竟然在Groovy中实现了: 如去掉了多余的分号,三引号使得多行的文本变量整洁好看,砍掉了没多大用的getter setter等。

3 )可以使用所有Java的库,因为Groovy"就是Java”。相比Ruby爱好者在一个一个辛苦编写各种库的时候,Groovy已经是站在Java 的车头上向前冲了。
        
4)支持多核CPU,未来的硬件是多核CPU的世界,谁不支持多核可能不是淘汰就落后。由于跑在JVM上,Groovy再次领先于Python和Ruby;有人说,也有Jython 和Jruby 啊,但是从与Java的结合性及调用Java代码或库来说,Groovy无疑是极佳的结合,Jruby或Jython相比下显得并不很自然。
 
5)性能不错
Groovy不再是一个玩具或试用品,一个已经使用Groovy的公司其正式发布的产品中有超过十万行Groovy代码。
其性能相比Python我不清楚,但有测试说Grail性能不亚于,甚至更强于Ruby on Rails.由于Groovy跑在JVM上,性能应该不会太差。

6)业界的支持
Groovy 2003年左右刚出现,还是新生儿,还谈不上大型业界的大量支持,就连Sun公司也对Ruby青眼有加,使得Groovy爱好者大抱不平,抱怨Sun偏向外人,不向自己这个Java嫡系。目前可能只有Oracle与Thoughtwork支持。 那么目前业界还未大力支持,谁可能会支持Groovy呢?私下认同这种说法,就是全世界Java与C++的几百万程序员中可能会有不少支持的。这是由于Groovy与Java,或C系列语言句法的近似及与其与Java“无缝”结合的特点相关的。流行语言的发展目前为止是在相似的基础上发展的,想想C → C++ → Java 他们的句法是不是相似?从这一点上看,Groovy最与Java类似; 试想,如果有两种语言有相近的功能,一种有你熟悉的句法,另一种却较为生僻,哪种语言更易上手?从企业界的角度来说,Java的业界(Sun, IBM Oracle等)在过去十年中已经投资了大量金钱与时间在Java上,如果一种语言能与目前的Java项目自然结合使用调用,另一种语言有全新的语法要员工学习,企业界的项目经理会选择哪个? 即使Ruby On Rails再强大,如果使用Ruby Python意味着十年来的人力,资源,框架(Spring Hibernate)库等投资大部分作废,在Grais能带来Rails 70%的编码效率,120%的性能,并且利用已有的框架与员工的情况下,企业会选择哪个?所以个人认为Java程序员或企业界可能会以后认识到Groovy能带来的益处。

7)名字起的也不错
名字是“很棒“, ”极佳“, 有着很积极正面的含意

缺点:

1)Groovy就是Java, 目前只有JVM的实现,只能跑在有JVM的机子上。做桌面程序有着Java相同的弱点,不适合做小巧的Window GUI程序。
2) Groovy不适合作手机或嵌入程序。


综述:Groovy较适用于需要调用已有的Java库,或者项目中想利用已有Java人力与资源的情况。如果以使用Java为主的公司不十分愿意换一个新语言,Groovy和Grails是ruby和rails的一种可考虑的替代选择。

对个人来说,喜欢ruby的,但对End不甚习惯仍偏向Java的花括号的,可以尝试下groovy.

----------------------------------------------------

三种语言各有特点,选择哪种语言与您的工作环境,项目特点或个人爱好有着关系。随着动态语言的向前发展,他们的简单灵活与强大能帮助我们节省时间与资源,学一种有潜力的语言能让程序员们站得更稳,立于领先之地,如果有天动态语言发达了,设计模式们很多都用不上了,这不是多年的经验淘汰了吗?程序员们不要忽视了他们了啊。

以上内容为参看一些文章与自己初步使用的感受的一些感想,与网友们分享,有错误之处,还请指正。
   发表时间:2008-11-02  
关于Groovy的Open class 好象说的不对,Groovy 提供有两种修改class方法,一种是限制被修改的class在一定范围内起作用,别一种是全局范围的,一修改所有地方的这个class都被影响。

Python的类好象也是开放,随时修改函数,添加删除类的属性或函数。怎么Python这么低调,没听到它宣传过。有了开放的类,和混入mixin,ruby还有啥优势?只剩下块传递?块传递不易看大懂,这是Python避免的,这时使用函数一般情况下也就够了。

这篇博客有时间再改。
1 请登录后投票
   发表时间:2008-11-02  
sleekengine 写道
这篇博客有时间再改。


正寻文对比这些动态语言,感觉归纳的很好,乐见早日完善;

1 请登录后投票
   发表时间:2008-11-02  
我也是上半年才开始接触动态语言的,当然那时候我尝试了一下ROR并用其做了个应用,效果很好就一直在研究了。今天看到这篇文章,我也想再去看看python了。
1 请登录后投票
   发表时间:2008-11-04  
ruby,python没有本质区别。
唯一的区别就是python早了那么几年出来,围绕pyhon的lib比ruby多那么点。
我先学的ruby,然后又想学学python,不过每次看到那么多不属于任何类的函数就让我倒胃口,每次学了点点,就放弃继续学下去了。
如果2个语言同时出来,那么python现在估计连ruby的地位都没有。
1 请登录后投票
   发表时间:2008-11-05   最后修改:2008-11-05
回kaven:
ruby应该是Python的孩子,所以两者不会同时出现。
从语言和语法上来说,ruby借鉴了Python和其它语言的优点,想象力与创造力几乎是动态语言中接近完美的了。

但是即使两者以现在的状态同时出现,私下认为它与Python相比在企业界的地位可能仍不占优。原因不是它的语法不优美,主要是其不成熟,不够稳定强大。一个例子就是用大部分由Python写的Youtube,每天能承受几亿点击,而一个ruby on rails网站,由于目前的ruby存在的内存泄漏问题,每天100万PV的rails网站需要重启若干次,这在企业界是难以想象的(这个比较并不太恰当因为两个网站的硬件不同,但是指出ruby的GC有问题)。随着新的ruby编译器的出现,这一问题可能会很快解决,但是目前来说,ruby性能不强速度不快是个事实,即使二者同时出现,性能上恐怕也只好排在python的后面。

另外一个企业界可能不愿面对的是,尽管ruby的创造与想象力几乎是无限的,这在一定意义上反而可能会使一些大型企业不愿意接受,rails给程序员带来了很多快乐,但是却使一些保守的大型企业界带来了担心与畏惧,就是ruby太灵活了,灵活到连最底层的类都可以随意更改。 Rails极其灵活的用法可能反而给ruby带来了负面影响,如果底层的类如rail般这么修改,那么还有什么类可以是信赖的,大型项目中往往涉及到无数的库与工具,如果这个把底层的类这么改,那个把类那么改,会可能带来预料的不到的混乱和冲突,会使得程序员调用一个类或其函数都不敢信任它,它会不会向我预料那样工作?它会不会被其它人在其它地方修改掉它的函数运行方法?一旦出现问题很难查出是哪里出问题。

所以在大型企业界,二者如果同时以此面貌出现,ruby地位可能并不一定占优。在小项目中,ruby rails还是有优势的。

1 请登录后投票
   发表时间:2008-11-06  
支持grooy~~~
0 请登录后投票
   发表时间:2008-11-07  
groovy加油!
0 请登录后投票
   发表时间:2008-11-09  
更新了一下:
从企业界角度增加了一点;
提到python的类也是开放的;
groovy的类也有开放并提供多种选择;
ruby与groovy的总结加了一句。
还有一些小更新。
0 请登录后投票
   发表时间:2008-11-12  
回sleekengine:
python,ruby者开发时间差不多,但是正式发布python早4年,不要小看4年,4年前ruby是什么样子?所以我觉得问题就是这4年。过4年,ruby的稳定性和速度肯定也会提高到应付大型系统的需求。
如果ruby VM问题解决,剩下的问题就是库了,现在python的库太多了,这个优势太明显,ruby VM成熟越晚,用得人少,这样在python上面开发的库,会像滚雪球越滚越大,如果真等4年后ruby VM才成熟,那真的就是python的天下了。
就目前来看,虽然我自己用ruby,不过我还是会推荐别人学python,目前看这个python是趋势。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics