时慧 2009年08月11日 星期二 22:45 | 1963次浏览 | 28条评论
昨天有人回
昨天写了一篇自己对于 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 © 2025
京ICP备05028076号
回复 陳木生 2009年08月15日 星期六 20:59
程序员又
人生
回复 时慧 2009年08月15日 星期六 21:01
回复 陳木生 2009年08月15日 星期六 21:05
因为这样
回复 时慧 2009年08月15日 星期六 21:07