首先说明一下这个”快”的含义,我想以前那些讨论这个话题的人当然认为这个快是指程序的运行速度,至于”软件开发速度”恐怕想也没想,或许认为软件开发速度和这个话题扯不上一点关系.那么这个问题在网上搜搜,搜的一大堆,那些c/c++阵营的列了很多例子来说明c/c++快, java阵营的也是如此,还提供一些机构的数据来说明java并不慢.可是仍然没有让大家都信服的理由或者结果.从这些讨论中我们应该得到一些启示,那就是讨论这个话题的前提是讨论的人必须既对java有很深的了解还要对c/c++有很深入的接触,否则都是偏面的.
另外从网上的结果看大家都谈到了一个共同点,编译的方式或机制是对速度是有影响的.在这里提到了java的动态编译的问题JIT(just in time).很明显很多c/c++程序员他不了解java的运行机制,java的动态编译是这样描述的,首先写完一个helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe会启动Java Virtual Machine,并加载这个class文件通过JIT编译为本机的机器代码.特别要强调的是这个class文件,它是编译原理中所谓的中间代码,它并不是目标代码.也正因为有了这个中间代码才使动态编译得以实现,而c/c++是直接到二进制的机器代码,也不需要中间代码多次一举.不过不要认为java的class文件是多余的哦,它的真正目的就是整个java语言的承诺write once, run anywhere,也就是说不管你是在windows os平台还是在linux os平台,class都是一样的,只是Java Virtual Machine是不一样的,所以有不同os版本的jdk(要想运行java一般只要Java Runtime Environments就够了).同理.NET也是这样的,所谓的.net framework就是承担了JVM的角色.说到这有必要提醒一下各位java为什么要搞个JVM,.NET难道是仅仅为了和java竞争才搞.net framework吗?呵呵,原因也许很多,但一定会有软件开发周期,人力成本,这很重要哦,呵呵,快要扯到软件开发速度上来了.
在这里我要提醒各位的是关于编译器的,用java完全可以写出一个c/c++编译器,当然更可以写出一个java编译器,不要奇怪哦,如果你懂编译原理的话,你一定会赞同我的观点的. 鸡和鸡蛋的问题!!!
如果那种语言慢的令人无法忍受的话,那它早就推出历史舞台了,可是java退出了吗,我们先不谈现在java软件的全球市场份额,就看看TIOBE世界编程语言排行榜,排在前3位的是java,c,c++.Java的使用人数现在每年在小幅下降,不是因为它运行慢,而是相对有些软件.net的开发速度更快了,注意哦,是开发速度,不是运行速度哦!!!
计算机语言充其量不过是个工具,c语言在宿主的环境 (例如装有操作系统的环境) 中如果离开(操作)系统提供的API(Application Programming Interfaces)或者系统调用接口的话,那它除了做做数值计算什么也做不了,哦,顺便提一下那些stdio , stdlib等这些标准库它们的实现也是调用了(操作)系统的API,例如:malloc它的windows实现会调用windows api HeapAlloc来分配堆.所以你所在的系统不同,stdio,stdlib等这些标准库的实现也不一样,当然函数接口功能是一致的,要不然就不标准了吗!在学校的时候,似乎无人不说c语言难,我要说的是难的不是c语言,难的是c所应用的领域的业务理论,逻辑,流程.例如:使用c进行数值计算,难的就是算法,如果算法一旦给出,你只需用c来表达.如果c语言本身很难的话,它还会在TIOBE世界编程语言排行榜中占第2位吗!java语言也是如此,离开了那些java,javax packages那它还能干什么呢?
每种语言有它擅长的领域,也就是说它的发明出现是有目的的,并且伴随着软件开发理论的发展,符合软件工程的要求.在学每一种语言的开头都会介绍该语言的历史,展示它比以前的语言是如何如何进步的一面,他们都会强调该语言是如何如何符合软件工程的要求,如何如何提高了开发速度,而有不会大幅度降低运行速度.所以学习过c++,java的人都会发现在学习这些语言的时候居然要同步学习面向对象的编程思想,甚至还会附带更多看上去好像和语言无关的东西,其实就是这些开发思想,理念,原则,理论等等一大堆东东都体现在了这些语言里.所以学习一门语言不仅仅是语言本身的特性,更重要的是它所体现包含的软件开发思想.
下面的这句话是摘之孟岩写的“Java替代C语言的可能性”,他在文中说到:"Java在意识形态上是要面向企业应用软件的开发,所以特别强调架构,强调设计模式,强调标准,强调规规矩矩,强调高姿态,强调一种华贵的宫廷气质。在C 中,你吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,就好比吃饭时焚香洗面,漱口净手,战战兢兢,毕恭毕敬。在C中,遇到问题要像亡命徒,像流氓版程咬金,管你三七二十一,冲上去就是三板斧,还怕劈不死你丫的。在Java里,遇到问题要像宋襄公,要张榜檄文,要名正言顺,要礼仪之邦,要把架子拉开了,把谱儿摆足了。Java的口号是,不管劈不劈的死,先把你小子感动了再说。这套繁琐的东西,对于基础软件开发来说,既不必要,也很难习惯。需要说明的是,这不是Java语言的问题,其实Java本身不必如此复杂、如此巴洛克。"针对这句话我想说的是其中的java,java之所以像他说的那样所谓的繁琐,这恰恰体现了java这种语言所要表达的软件工程思想,java是面向对象的,面向对象的原则之一是面向接口编程,所以为了要干某件事还不像孟岩上面说的那样,应该这样,先定义一个接口类,再写一个实现类,再写一个工厂类用来产生前面的接口类的实例,而不是简单的new,你是不是已经觉得更繁了,呵呵,还有所谓更繁的呢,我不用工厂类了,我用了个抽象的工厂类,给它定义一个产生这个工厂类的实例的静态方法,得到这个工厂类的实例再用它来产生前面的接口类的实例.为啥这么做啊?因为java符合了面向企业应用软件的开发要求,因为企业需求变化很快,所以要接口,要通过工厂模式来create它,如果这样,当需求变化后我只需修改或添加新的实现类,再修改一下工厂类的create方法,而对该接口引用的外部或外层代码则不需作任何改动,你看接口引用,实现,创建各部分都分的清清楚楚,以后代码维护自然容易,又能适应需求的变化.另外对于程序员而言可不要以为写的代码多了哦,恰恰相反,你利用设计工具画几个类图它就会帮你自动生成接口,工厂类了,你只需在IDE中写实现类就ok了.
机器指令就不说了,汇编到c,c到c++,c++到java,脚本语言(lua,php,python,ruby)…从左到右程序运行速度是递减的,而软件开发速度是递增的.总之程序员写的更少,更快,但编译器做的更多(附加插入的机器指令也会更多), 设计和开发工具IDE也会做的更多,附加的标准库,标准模板库等等封装的更多,还有涉及方方面面的开源的库简直不计其数.好像程序员轻松了,其实更累了,整个软件业对程序员的要求更高了,但又不一定,因为大量的框架提供了开发的便携性,使得程序员只需到达会应用的水平,而不必知其所以然.所以大部分程序员又廉价起来了, 软件蓝领出现了,人力成本便宜了,这又是软件规模开发所期望的结果.早期MDA的架构理论者狂吹MDA的代码自动生成能力会让软件蓝领失业.
其实在这个”java快还是c快”话题中最”冤”的是java,因为有太多的人,证据来说java是如何的比c慢,如何的耗内存.之所以这样是因为有太多的人不了解java,甚至有太多的java程序员都不了解java,会写java程序与对java的理解是两码事.
Eclipse是一个用来开发java软件的IDE,是IBM开源的,悲哀的事情来了,有很多java程序员都不知到eclipse是用java写成的,他们一看到eclipse.exe他们就立马否定了它是用java写的,所以有这种想法的人请你把本机的JRE(JDK)删除,看你的eclipse还能否启动. 如果你还有疑问,那你一定不知道JNI(java native interface),JVM可是c/c++写成哦,呵呵,说到这是不是有点”同根生”的味道,现在却要”相争何太快”.请使用反汇编工具看看eclipse.exe都干了些什么,最好也看看JDK中的java.exe又干了些什么.其实它们的功能大同小异,它们都会加载jvm.dll/jvm.so(在JRE的bin目录中),创建JVM实例,通过JNI加载main class,并调用它的main方法.但是疑问也来了,不管是java,c/c++程序员可能都不相信eclipse这种用java写的窗口程序怎么会运行的如此之快,完全可以和vb,Delphi,c/c++写的窗口程序媲美.因为在他们的印象中java的GUI程序慢的要死,其实也正因为java的GUI慢给java一下扣上了这顶慢帽子.
在这个世界上JVM(jdk,jre)不是sun公司的专有物,IBM也有哦,只是我们常用的是sun提供的,很可惜它支持GUI的awt, swing包在最初的设计上过于抽象,使得速度不尽如人意,当然现在一直有改观.而IBM它提供了swt包来支持java的GUI编程,eclipse是基于swt的,eclipse plugin插件编程出现了,eclipse的插件体系和在GUI方面的积累和框架已经很成熟了,也很多,可惜知道的人很少,去www.eclipse.org看看吧.Myeclipse也是同理哦,它不仅集成了eclipse,还内置了jdk.有人说java做不了系统软件,是啊,我前面就说过了, 每种语言有它擅长的领域.
但是有必要提一下嵌入式编程,不要以为嵌入式软件都是系统软件,java在这个市场中的份额可是很高的哦,要不Microsoft怎么会眼红呢.J2ME,J2EE,J2SE是sun针对不同的应用领域提出的3套规范和API,其中J2SE就是指jdk,J2ME是专门用于微型设备开发的,它是J2SE的一个很小的子集,轻量了很多.J2EE是一套面向企业应用的规范,以J2SE为基础.呵呵,看看java的发展史吧,它天生就是为电视、控制烤面包机等家用电器(消费性电子产品)的交互操作而开发的.
最后提一下JNI,它是java可扩展能力的backbone, JNI是以c/c++的语言形式提供的接口,c/c++通过它可以和JVM通信,也就是可以和java交互了哦.我前面也说了JVM本身就是用c/c++写成的,都在jvm.dll/jvm.so中.
再说java的耗内存,这个如果在苛刻的硬件条件下确实是个问题,不过现在的趋势是硬件一直在降价,硬件的性能在提升.以前的c/c++程序员在硬件条件的限制下为了达到性能上的最优,写的代码是不太可读的,这是与软件工程理论相违背的,我们现在为了程序以后的可维护,降低维护成本,我们可以牺牲一定的性能也要维护程序的可读性,不仅如此我们为了项目的开发周期能在规定的时间内达到最大的完成度,在选择技术,框架的时候我们首先考虑的是开发速度,其次才是运行速度.在性能调优方面我们来看看<<c和指针>>怎么说吧, ”改进算法胜于优化代码”page403,这里的算法完全可以延展为设计,所以不要迷信某种语言或技术的快慢性能,如果设计本身就很糟糕,那么再优的技术,再快的语言也无济于事. ”实际上,在大多数情况下,若要提高系统的运行性能,增加RAM比提高CPU的速度所产生的效果更好.”摘之<<windows 核心编程>>中的第1 3章Windows的内存结构的page305.我想java的设计者不会傻的连这个都不知道吧!
性能优化无非是内存和CPU,空间和时间的博弈.
昨天又听到这样一句话”http比tcp慢”……哪位有空的仁兄也来谈谈网络吧, 呵呵!