时慧

时慧的博客

他的个人主页  他的博客

关于C++,Java与Python的一点看法

时慧  2009年08月10日 星期一 23:47 | 9496次浏览 | 24条评论

本人身在Java心在Python,这些日子与Java纠结不清,对于二者的一些看法

本人原来是C++的忠实粉丝,当然大学里真可谓C++的铁杆,Java声名大噪,就是我进大学那会儿,可是这么好的机会,我却“波澜誓不起,妾心古井水”啊,要不然,毕业时找工作,真是要疯得疯,要盂得盂啊,这当然是其他的话了。当时看了二十来本C++的书,基本市面上有些名气的书都看过了。后来C#出世,本人看在比C++还多了两个+,而且又是Delphi的大牛Anders操刀,也玩过一阵子。

进了公司6年多,前6年全都是C和C++d项目,要不是嵌入式的开发用C,就是CAD类软件,讲究一个快,所以用C++。但是本人越用C++,越觉得C++不爽的地方。首先不爽的,当然是他的学习曲线了。当年大学里,不停的研究C++的细微末节,乐此不疲,略有小成,到了公司,也由此受到器重,沾沾自喜。但是到了自己开始带队伍的时候,有时候看到新人不怎么会用C++,写出些令人咋舌的代码来,忍不住就要教训两句,然后想给他讲解一些,为什么这样写会错,或者说不好,但是讲着讲着,我就发现,一下就掉到细微末节的沟里去了。我讲得累死,对方听得也累死,还五里雾中。我渐渐发现,C++既为了和C兼容,又为了OOP,又有对性能的承诺,几方的相互作用下,造成了一个死结——就是无法逐步的加深了解。学习C++,要不就是初学者,要不就是精通。另外,缺乏metadata,没有明确统一的标准(C++的规范可能是所有语言里最含糊不清的规范了,连最简单的 int i = a++ + b++,各个编译器都解释不一),万众瞩目的C++ X0标准,看来也要跳票了。

我后来不知不觉就是用上了Python,当然我也肯定是看了不少关于Python的介绍啦,但是我真的不记得自己是从什么时候用上Python的,感觉很自然就上了Python的贼船。起初只是作为一种简单易用的脚本语言来进行一些小工具的制作,比如算算编了几行代码,有时就是替换某个目录夹里的文件内容等等,后果就是我当年苦苦学习的sed,grep等细节,现在都忘得差不多了,因为基本linux都自带Python了。也写过一个代理服务器,不过那是用curl的python绑定写的,实在没有什么技术含量(基本我没做过啥有技术含量的东东,咔咔)。当时项目用到的一个核心库,竟然有Python的绑定,当时也用它做了一个工具,不过由于那个是CAD软件,所以性能上还是达不到要求,就作罢了,所以对Google正在开发的Unladen Swallow还是挺关注的。

长期看limodou的博客,Django开始的时候,我也跟风学了一段时间,后来也跟着朋友一起研究过Pylons,当时确实觉得挺厉害的,原来网站还可以这样设计(之前我只有PHP和ASP的网站设计经验)。不过也没有觉得有什么震撼的。(现在越用Java开发web,越觉得Django,Pylons,Turbo Gears这样的框架NB啊,也真正感觉到Python果然强,以前是身在福中不知福啊)

到了今年3,4月份,接到一个欧美项目,是做网站的,和对方一起开发。他们公司的IT Guys,全都是Javaer,所以自然就用了Java了。这时,这些年来一直无法理解的Python的好,全都顿悟了。当然说是Python的好,也可以说是动态语言的优点。

首先就是Spring那个IoC,我就觉得这个概念很奇特啊,后来看懂了才领悟,哦,原来对于Python来说,这些功能是自然而然的事,不需要库来支持,就好像对于C++而言,不需要写一套支持OOP的库一样。

然后就是XML,当时对方Interview的时候,问我对XML有什么了解,我说我写过一个自动测试的工具,配置就是XML的,感觉是一种类似ini的东西吧,当时对方就High了,跟我讲了很多内容,目的就是一句话——XML是世界上最NB的编程语言(我同学毕业后做了IT顾问,他的一个课题,就是要让别人相信,PowerPoint是世界上最NB的编程工具,呵呵)。真正接触到项目,才发现,果然Java的工程里,一半是Java代码,一半是XML啊,对于我一个Python的粉丝而言,这不是自己找抽吗?

最后是反射,当然这是Java能够绝地反击的一个原因吧。你看面对动态语言的进攻,C++只能靠着自己性能的优势来维持了,而Qt什么的,索性就自己弄个metadata出来,所以有了moc这样的工具。也就是说,它就不能你玩了,反正C++就是木有这个功能的。而Java呢,靠着反射机制,也玩出些动态的特性出来,虽然代码量会多很多,有时还会绕圈子的实现,总算能实现吧。不过经常是Python两三句就搞定的事,Java又要接口,继承,又要反射的,用好多倍的代码来实现它。C++么,索性就不挣扎了。

当然,Java也是有方便的地方的。首先静态语言+metadata,就可以使得工具可以发挥最大的作用,我先后用了Eclipse和Netbeans,他们的功能确实比C++的IDE强很多啊。代码的自动生成,代码的重构,代码的自动检查等等,以至于让我这个从C++和Python过来的人发出由衷的感叹——还要我们人来凑什么热闹,让IDE自己去玩吧!

另外,Java的社区真的强大到逆天啊,虽然什么功能,都能找到大牛写的jar,通常都是free+opensource的,论坛发个帖,回帖又快又多,当然C++也可以找到,但是C++由于标准不统一,很麻烦,我当初写一个视频播放软件的时候,用到两个库,都实现了一个mutex的class,我真正用时,都不知道用哪个好,最后全用了,真是囧啊。Java一般就不会这样,它的标准很明确,基本库里的东西也非常齐全。

而Python呢,由于是动态语言,又是弱类型的,IDE就不会这样NB了,但是呢,我感觉是完全走另外一条路的。它经常可以写一行代码,抵上其他语言写几十行甚至上百行的,所以它的重构,是人力所能及的范围,而代码量一多,就不得不靠工具了。就感觉华山上,所谓的气宗和剑宗一样,Python是属于气宗的,讲究心法,擅长灵活多变,一招胜十招,一个vim或者emacs,就可以闯江湖了,就好像高手随便拿一根树枝,就能当剑使一样;而Java呢,则是剑宗,讲究的是武器的强大,虽然剑法的变化显得不够自由,但是可以更好的和剑融为一体,发挥出剑的最大威力。当然气宗剑宗,无所谓谁强谁弱,金庸小说里也说了,他们相斗的结果,最后是两败俱伤。

C++呢?个人感觉,如果D语言能得到像Google这样的大公司的支持的话,多半可以取而代之。D语言现在最缺的,就是商业支持了。个人感觉罢了。

所以我特别希望,能够有一种方法,可以融合二者的优点,Jython和IronPython都是很好的尝试,不过好像不是很流行。我还是很乐意看到两者相互配合的,希望能产生更大的生产性,同时也是很好的切入点,否则硬生生要抛弃一切,改用Python,估计没几个公司愿意冒这样的风险。

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
陈祥

回复 陈祥  2009年09月07日 星期一 13:02

bruce eckel最爱的语言---python

0条回复

胡锦涛

回复 胡锦涛  2009年08月14日 星期五 06:23

编程语言仅限于 C javascript 和 3P了.python最喜欢干的就是通过重写Cgtk的代码 测试python的性能这里有没有lisp同人啊……

0条回复

bohemian

回复 bohemian  2009年08月13日 星期四 15:53

同样 CPP 转 PYTHON了

0条回复

谭东扬

回复 谭东扬  2009年08月13日 星期四 12:00

长见识了。。。C++ java 都是初学者水平。现在研读算法中
python 冲着Google 这点上,必须拿下

0条回复

赵威

回复 赵威  2009年08月13日 星期四 09:50

C++感觉语言特性过于复杂,需要花很多时候在语言层次的细枝末节上,而python语言简单,可以更多的关注需要解决的问题,节省精力且代码更容易维护。

1条回复

  • 时慧

    回复 时慧  2009年08月13日 星期四 09:54

    对的,C++为了支持各种特性,又要兼容C,又要OOP,又要模板的,结果就不可避免的使自己的语言特性过于复杂,甚至是反人类,呵呵

    0条回复

李洋

回复 李洋  2009年08月13日 星期四 00:47

很好啊,我现在就是从公司的C++Team转到了javaTeam(原来的Team解散,被挪到国外去了),感觉在一些地方限制很大,只能按照他那一套思想来,python学习中。。。

4条回复

  • 时慧

    回复 时慧  2009年08月13日 星期四 08:53

    Java和C++,差别很大。不过我不知道你所谓的限制,是对硬件的访问上的,还是语言自身的,语言自身我觉得没有什么太大的限制吧

    3条回复

      • 李洋

        回复 李洋  2009年08月14日 星期五 00:18

        好吧,怪我没说清楚,java指得是JavaME,现在有一个最大的困扰我的问题是各个厂商的的虚拟机实现都各有各的特点,举个例子来说,Nokia的6600这个设备,Image对象创建之后就不会被GC回收掉,就算强制置成null都不行,还有InputStream流对象一次读取多个对象的话会出错,使用CreaRGBImage函数会crash等等,其他手机就不会有这些问题,但又有可能有其他问题,但这些都是标准的MIDP2.0函数,怪只能怪当初发布的是JAVAME 实现参考,而不是标准,而像BREW这类的C++的手机的开发参考,就几乎不会出现这种莫名其妙的bug

        2条回复

          • 时慧

            回复 时慧  2009年08月14日 星期五 00:28

            是的,JavaME的实现太多了,个人感觉,所谓一次编译,到处测试,就是指的是ME平台吧。好像SE和EE版本没有这样的问题。据我所知,并不是把对象设为null,就会让它自动回收的,自动回收应该是程序员无法控制的吧。另外,检查一下是不是这个对象被其他例如list,map等引用着,试着换成弱引用吧,具体可以参考 http://www.javaeye.com/topic/401478 这里。如果有帮助,不胜荣幸。

            1条回复

              • 李洋

                回复 李洋  2009年08月14日 星期五 01:09

                其实刚才我说的这个问题是一个特例,这么说吧,同一份代码可能要给上百台不同型号的手机porting,而我刚才说的只是在单独这个手机上会出现的问题,而其他的都不会出现,当然其他手机可能有的出现的问题这个手机就不会出现,比如LG手机的半透明色的问题nokia手机就没有,这些问题基本上与代码的写法无关,完全是各个手机厂商自己定制的标准。你推荐的那个文章也不错啊,有时间的话写写几段代码看看实际效果

                0条回复

唐正华

回复 唐正华  2009年08月13日 星期四 00:32

如果有一天,我能驾驭于语言之上,那就好了。目前的状态仍然会被一些语言的特点所迷恋,如用c实现的lua,将弱类型、动态执行、解释执行的概念引入进去却又整合的相依无缝。

3条回复

  • 夏清然

    回复 夏清然  2009年08月13日 星期四 13:11

    国内lua搞的多的应该大多在网游公司。

    1条回复

      • 唐正华

        回复 唐正华  2009年08月13日 星期四 13:13

        恩,看了lua,我感觉到了一些快感,用它来实现c或c++难以实现的功能,但本人没有去做网游,呵呵。貌似魔兽的配置文件用的是lua

        0条回复

  • 时慧

    回复 时慧  2009年08月13日 星期四 08:54

    等你凌驾于语言之上,你就不是人了,是牛…

    0条回复

邵玉祥

回复 邵玉祥  2009年08月11日 星期二 14:04

C++学了一年 愣是没学会 越学越写不出代码

2条回复

  • 徐继哲

    回复 徐继哲  2009年08月11日 星期二 14:12

    弃暗投明,转入Python阵营吧。

    1条回复

      • 时慧

        回复 时慧  2009年08月11日 星期二 21:31

        想当年,在兖州!

        哈哈,说笑了,我当年学习c++,绝对是痴迷状态的,要是以我现在的状态,当然直接投奔Python阵营了,C++的心,海底针啊!

        0条回复

高峰

回复 高峰  2009年08月11日 星期二 12:54

可能以后我会慢慢的不喜欢C吧...

0条回复

夏清然

回复 夏清然  2009年08月11日 星期二 12:03

对于C++的感受和楼主基本一样,04、05年那会儿是C++的狂热粉丝,任何程序都想用C++来实现,再简单的功能都想封装成类。自己的C++程序在过了几年后看,都想狂吐...

0条回复

李迎辉

回复 李迎辉  2009年08月11日 星期二 11:21

好啊。写得不错。

0条回复

harry

回复 harry  2009年08月11日 星期二 11:07

感同身受 :)

0条回复

老子的姓

回复 老子的姓  2009年08月11日 星期二 10:05

java和Python都是建立在C/C++的基础上的,将一些常用的功能封装成包,直接调用,这个是我的理解

1条回复

  • 时慧

    回复 时慧  2009年08月11日 星期二 12:55

    我觉得关键是对象模型是不一样的,Java和C++也只是形似罢了,而Python和C++,则完全是两个世界的东西,一个动态,一个静态,一个强类型,一个弱类型,一个编译执行,一个解释执行,我都基本找不到有什么相似的地方了,呵

    0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号