时慧

时慧的博客

他的个人主页  他的博客

继续Python的话题

时慧  2009年08月11日 星期二 22:45 | 1860次浏览 | 28条评论

昨天有人回复说,感觉Python和Java什么的,没有什么区别,都是基于C/C++,忍不住写博回复一下,有什么 不对的地方,敬请指正。

昨天写了一篇自己对于 Python Java C++ 的感想,木有想到,第一个回复的,竟然说没有感觉到三者有什么区别,我的神啊——据说修禅者,有三个境界,第一个境界,看山是山,看水是水;第二个境界是看山不是山,看水不是水;最高境界呢,又回到了看山还是山,看水还是水了。不知道这位兄台是不是看任何程序,都是一串 0101 在眼前闪过呢?

其实,如果说 Java C++ 相似,我还觉得的确如此,基本相似的语法,都是 OOP ,的确是很像。当然形似神不似罢了,细细品味 Java 后,就会发现太多不同了——方法默认虚函数,对象传递默认是引用方式,不用 delete 也不能 delete ,有反射,有完整的基本功能支持,甚至连后来从 C++ 里学的模板,都是和 C++ 不一样的,当时一个 Map<?> 就把我看晕了。还有什么匿名类啊,原生对设计模式的支持啊,就不说了。

但是说 Python 和这二者相似,我就觉得讶异了。

首先来说说语言的分类法吧。

第一是语法。虽说无非循环,判断等几个方式,但是语法的差异,可以让人一目了然。比如 Pascal begin end C 语言的大括号方式,都是很明显的。 Python 的语法,和 Java 区别甚大,比如判断 block ,一个是靠缩进,一个则是靠花括号。 Python 定义方法,用 def 开始,且最后要加上:,而 Java 则是 C++ 风格的。

第二是语言对类型的判断。这里有显式类型和隐式类型之分。 Java C++ 都是属于显式类型的,任何变量的声明,都需要标明它的类型,并且一旦声明了,就不能换。而 Python 则是隐式类型的,变量声明不需要特别声明它的类型是什么,刚才还是  i=0 ,过会儿就可以 i='a' 的进行赋值了。类型的划分,还有强弱之分,具体可以看这篇令狐的博文, http://ch-linghu.3322.org/blog/entry/180  

第三是对象模型,由于 Python 是脚本语言,所以基本上是动态的,我印象里好像脚本语言大多是动态的,当然不能划等号啦!作为 C++ Java ,他们只能化为静态语言了。有了动态语言,就可以省去很多继承的麻烦了,某个对象要临时加个方法,直接加就 OK 了,这个 C++ Java 就傻了。

第四是 duck typing 。我感觉用了 duck typing 后,可以少写很多继承和接口,更加符合人类思考的方式,所谓管它黑猫白猫,能抓住老 鼠的就是好猫。关于 duck typing 可以自行 wiki 一下。

第五是他的执行方式。 Python 作为脚本语言,是解释执行的,而 C++ 则是编译执行的, Java 么,确实有些瓜三了,据说是两者都支持,但是基本用解释执行的,解释吧,也不是解释 Java 代码的,是解释 Java 代码编译出来的中间码 Bytecode ,真是太 BT 了。您说,这三个语言能说是相同的吗?当然,本人的意见是 —— 神一样的代码,不需要编译!!!

第六是执行环境, C++ 是直接在操作系统里跑的, Java 是在 JVM 这个虚拟机里跑的, Python 是在解释器里跑的,运行环境都完全不一样啊。

你看看, Python 和其他两个,从头到尾,就没有一样过,这,这,这也能算是没什么两样吗?我通常对学习 C 的同事说,你要学学 C++ 或者 Java 或者 C# ,总之你要学一门面向对象的语言,这样可以开拓你的思路。等到他们学会了,我又会说,你还要学习 JavaScript 或者 Python 或者 Ruby ,总之你总要学一门动态语言,这样还是可以开拓你的思路。当然,我也有追求的,我想学学 lisp ,据说这个语言也很怪异,咔咔,可能学好之后,对于 Python 里那些函数式编程特性,更能理解深刻一些吧。

评论

我的评论:

发表评论

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

回复 陳木生  2009年08月15日 星期六 20:59

不想争论那个语言比那个语言好,青菜萝卜各有所爱,只要能实现功能即可。
管它是不是一样。

释迦牟尼佛够佛力无边,同样无法渡完众生。
程序员又何必执着于用哪种语言呢。
人生是需要学习,但学习不是目的。
如果每种语言都学我想你学不完。

3条回复

  • 时慧

    回复 时慧  2009年08月15日 星期六 21:01

    希望大师先看完我的文章,我哪里有说哪个语言好,哪个语言坏呢,我只是想说,每个语言都有自己的适用范围罢

    2条回复

      • 陳木生

        回复 陳木生  2009年08月15日 星期六 21:05

        呵呵,不是针对楼主说的。--__--!!
        因为这样话题好像用哪个编辑器一样经常被讨论。

        1条回复

          • 时慧

            回复 时慧  2009年08月15日 星期六 21:07

            是啊,我只是想说一下,语言和语言是不一样的,但是我发现很多人都留言跟我说,语言都是一样的,最后都是二进制的,blablabla,唉

            0条回复

胡金

回复 胡金  2009年08月15日 星期六 17:37

用什么语言更关于的是什么系统吧?比如,如果我是在Windows上进行开发,我做的软件都希望最后是能运行的(.exe)文件吧?至于他是通过什么(jvm)或是其它你安装一个环境,然后就可实现了的,不都是要先“安装”,先.exe?电脑运行不就是是二进制?为何要把这些高层实现的区别当作“区别”呢?

1条回复

  • 时慧

    回复 时慧  2009年08月15日 星期六 20:32

    囧,小弟不才,您到底想表达什么意思?

    0条回复

mocibb

回复 mocibb  2009年08月13日 星期四 23:15

大哥,python不用编译pyc是什么呀

4条回复

  • 时慧

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

    这个是bytecode,不用编译不等于不可以编译。另外,编译成bytecode,和C那种编译成object file不是一个概念,只是为了让解释器能够更好的解释罢了,你可以理解成一个优化的过程吧

    3条回复

      • 时慧

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

        刚刚查了一下文档,一个错误,所有py代码都要先内部编译成bytecode才能被解释器解释,不过,这个编译,和C的编译真的不同。这个想法应该是受到java的启发的吧。

        2条回复

          • mocibb

            回复 mocibb  2009年08月14日 星期五 08:33

            1. 除了汇编不用编译,其他什么语言不用编译也不行。
            2. 不要把语言本身和语言的实现弄混了,
            按编译型,解释型划分语言是错误的。
            3. 人水平的差异比语言大。
            你用java写不出来的东西, 用python也写不出来。 说明你的python不比java强。
            别人用c能写操作系统,你不能。 说明别人的C比你的C强。
            有时间争论语言不如好好提高自己。

            1条回复

              • 时慧

                回复 时慧  2009年08月14日 星期五 22:46

                是啊,只要我够强,我就可以用扫帚打败坦克,继续YY……另外,第1条是错

                0条回复

李亚橙

回复 李亚橙  2009年08月13日 星期四 10:41

Java 是在 JVM 这个虚拟机里跑的, Python 是在解释器里跑的,运行环境都完全不一样啊
------------------------------------------------------
python没有vm么....

4条回复

  • 康上明学

    回复 康上明学  2009年08月13日 星期四 20:06

    Python中也有,叫做Python Virtual Machine(PVM)。

    3条回复

      • 时慧

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

        楼上正解,囧,不过解释器和VM有什么区别,倒是真是晕了

        2条回复

          • 时慧

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

            我有些明白了,所谓解释器,就是直接解释脚本语言的,所谓VM,就是执行编译出来的bytecode,bytecode里是虚拟机的一种虚拟了的汇编,当然,这种汇编也是很高阶的,直接对应了一些比较高级的功能

            0条回复

          • 康上明学

            回复 康上明学  2009年08月14日 星期五 00:15

            对java不是很了解。 不过Python的PVM有很多种,PVM解释的是由source翻译后的Byte code。Python默认是将source解释为C为基础的Byte code,用C为基础的PVM执行。CPython是默认的,还有Jython(Java)、Ironython(.Net)等等。他们的source都是一模一样的,但是程序执行起来却是不同的,这也体现了Python的高扩展性。 Jave只有一种VM。

            0条回复

康上明学

回复 康上明学  2009年08月12日 星期三 21:44

之前看到一篇关于程序员境界的文章,将程序员的发展做了一个总结。其实就是中国《易》中的思想。

世间万物,分久必合,合久必分。从统一到分散,从单一到繁杂,可是最后都又会回归

之前看到楼主书写此文的原因是有人说三者没有什么区别,我觉得说这句话的人,只有两种可能
一种是对三者都不了解,完全瞎说着玩呢
另一种可能便是他已经是大哲,参透了所有,最后达到无剑胜有剑,无招胜有招的高深哲学境界。

其实,最后的程序员最高境界,就是一个哲人。所以楼主不必太过亢奋。在大哲的眼中,也许三者真的没有区别。只是程序思想的不同表现形式罢了。

4条回复

  • 时慧

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

    囧,我有亢奋吗?另外,虽说最高境界是手中无剑,心中有剑,但是能到这个境界的又有几人。飞花摘叶即可杀人,通常只是传说,是茶余饭后的谈资罢了。

    另外,我觉得《易》这样极玄极东方的东西拿来解释西方文明的结晶,最多只是满足一下我们中国人的虚荣心罢了,不可取

    3条回复

      • 康上明学

        回复 康上明学  2009年08月13日 星期四 20:03

        《易》是中华民族文化的根源,也是中国哲学的启蒙。 吸收西方优秀知识固然重要,但也不要丢了自己的文化。

        2条回复

          • 时慧

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

            你不要误会了,我也研究易经,但是,试图从中国哲学来理解编程,是个曲折的过程,要精通两者,然后才能顿悟出其中奥妙,比如周爱民同学应当就是如此。但是如果想通过精通《易》来学好编程,这个就不大靠谱了,你还不如学好英语,更为实际一些

            外,《易》是中华民族文化之根源?只能说对中华文化有深厚的影响吧……

            1条回复

张中原

回复 张中原  2009年08月11日 星期二 23:51

C++,锻造钢,先有语言后有标准的东东,很硬朗,构造高效率下层应用必备,再下层就是C了..
Java,橡皮泥,积木,模具,练瑜伽的,身体柔韧性很好,速度不够怎么办?JNI?算了吧
Python,万能胶水,能把上述以及其余的其他N多东东粘在一起,想要什么就贴什么..速度不够怎么办?C..C++ 随你挑..

C++ -----------------------> 01010101 ---> Hardware
Java/Python -----> class/pyc ------> 01010101 ---> Hardware

0条回复

小包

回复 小包  2009年08月11日 星期二 22:56

lisp 难度高了点 去学scheme吧~~~加油~~python不会 希望多多指教~~~

5条回复

  • 时慧

    回复 时慧  2009年08月11日 星期二 23:01

    嗯?scheme难道不是lisp的一种吗

    4条回复

      • 小包

        回复 小包  2009年08月11日 星期二 23:07

        是LISP 的变种~~~~~SICP 就是讲这个 你可以问下SHAWN 那个家伙 那家伙 学得很好~~

        3条回复

          • 时慧

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

            此人找不到,我一直觉得这里没有搜索的功能,很奇特,很奇特啊

            2条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号