我是一个Java的反对者,至于为什么,我想最大的一个原因是它不实在,不管是当年sun所说的一些言论,还是如今Java用户的一些言论,都有蛊惑之嫌,甚至很多太假了,而这些言论层出不穷,其实就语言本身我不想说什么,任何语言存在都有它的道理,而且都有适合它的应用场景,但是如果总是夸大实在让人不爽
一、Java是简单的
Java简单吗,反正我不觉得,当然这是Java刚问世时说的,在当时看来还勉强说的过去,不过这句话至今仍在被引用,而且总是在和C++对比,不能说比C++简单就叫简单吧,难道会有人认为有比C++还复杂的语言?这样的对比显然是有问题的
二、一次编译到处运行
这句话应该有个前提,就是只要那个平台上有JVM,不过我不想咬文嚼字找漏洞,这样也没什么说服力,我认为这算不上什么优点,首先对于脚本语言而言,一次编写(不需要编译)就到处运行,岂不是更有优势,然而没有哪个脚本语言拿这个出来说事儿,为什么Java总是拿这个说事儿,况且一次编译到处调试这句话也不是空穴来风。还有经常会拿它的字节码来说事,仿佛只有java有中间吗一样,实际上解释型语言几乎都有中间码,这就是解释型语言的特点,这个特点在没有Java之前就有。让Java说的好像是它创造的一样,别的语言都是模仿它
三、JIT优化技术可以使Java的运行速度接近C/C++,甚至有些场景下会超越
Java的性能一直是Java开发者心中的痛,无论是当年的sun还是现在的oracle,几乎每一次的版本更新都会着重说明性能有很大的提升,而且每一次都像一颗定心丸一样安慰这它的用户,使大家对Java的性能有信心。不过从Java诞生起,提升了这么多年,提升了多少呢,不管提升了多少,客户端(除了andriod)用Java的太少了,就算是不是纯java的eclipse的性能也让人难受,服务端也要分应用,也不是什么服务端程序都适合用Java,通常都是语言本身的性能不会是最大的瓶颈的场景,因为有些场景最大的瓶颈可能是IO或者数据库等。为什么JIT不能让Java赶上C++呢,理由很简单,编译型语言也不是只有C/C++,还没有哪个语言做的到,JIT就能?显然不现实,其实这是语言的特性决定的,C的实现是为了性能可以放弃高级特性,C++的性能也是其最重要的目标之一,而其它语言都是为了高级特性可以牺牲性能,从语言定位上来说,再怎么优化也不可能赶上C/C++,因为优化是不可能违反语言的定位的,这其实是鱼与熊掌不能兼得的问题。只要在性能能满足应用的情况下就可以用,但不要老夸大,越自卑的人自尊心越强,人总是不喜欢承认弱点,但也没必要过分强调这不是弱点,越强调反而越让人怀疑
说到性能问题我觉得.net 相对还是比较实在的,当年我用.net 1.1 的时候,性能是非常差的,一个普通的WinForm窗口,如果在里面排列多一点的控件的话,运行时都能看出来你拖放控件的顺序,非常明显,但现在好多了,基本上眼睛是看不出来的,都是一起出来的,所以现在很多Windows程序用.net 表现也非常好
四、GC是Java性能的罪魁祸首之一
我觉得说反了,应该说是Java败坏了GC的名声,因为很多人都是通过Java认识了GC,导致在很多人心中,GC成了慢的代名词,实际上这是普遍对GC是的误解的,GC其实只是个概念,GC曾经考虑过由操作系统实现,自从操作系统都没实现,就由编程语言来实现了,也导致实现的五花八门。至于性能要看具体实现和算法选择,这是一项动态内存管理的技术,与C的malloc/free的作用一样,只是GC可以更高级,malloc/free 通常要按照一定的约定来使用以避免内存泄漏问题,GC与手动内存管理主要区别是GC需要一定的算法来选择如何释放内存,手动的不需要。另一个是释放时机的选择手动的更*,通常GC不是很*,我说的通常是指一些语言不允许GC的可控,事实上GC的实现都是可控的,只是一些语言不允许这么做,问题就出在这了,GC的算法需要时间,而GC的算法并不能保证最优,所以会产生性能问题,实际上一个可控的GC对性能和开发效率才是更好的选择,根据情况选择是否要GC自动管理还是手动控制,就像D语言的方案,它使用GC,但性能确很高,而且GC是可控的,你的程序不必完全依赖GC的算法,我一般把这种方式叫半自动的,这样更好,如何管理内存应该是开发者的*,因为全自动管理的GC有的时候会造成应用程序的卡顿,特别是在不适合的时候出发GC的内存管理,这让有些类型的程序很难接受,比如在射击类的游戏中,或者视频解码程序,哪怕是一点点的卡顿体验也是非常不好的(一秒内少于24桢),但在web这样的应用中,服务端程序短时间暂停客户端几乎感觉不到,即使时间长点用户也会认为是网络问题或者浏览器问题
更多关于GC的内容请参考 http://www.iecc.com/gclist/GC-faq.html
五、网上有很多帖子通过具体代码测试,Java性能超越了C++
不管代码是什么,只要是结果上真的超了,那一定是作弊了,不信你可以亲自验证,前提是你真的懂C/C++,不然可能你会中招,但这些帖子很吸引眼球,引来了众多的不明真想的围观群众。我的观点是在性能可以接受的情况下,语言的特性能带来更多的好处,就是好的选择,这也是PHP为什么能在web开发方面能流行的原因之一。但是有些Java人老是发这种帖子的行为着实让人鄙视,而且我发现好像只有Java喜欢挑战性能,在其它语言上确很少见,这点上值得Java人思考
写在最后:
看到这Java粉们一定会不高兴了,Java优点也很明显,库多,非常多。还有一个很大的优点是,Java开发者不需要对底层技术网络技术等有多么深入的了解就能开发出重量级的应用软件来,从某种意义上讲,这把开发者们从技术细节中解放了出来,更专注于应用逻辑。于是很多重量级的软件就这样诞生了,然后就会有一些人质疑,为什么这样的软件要用Java开发,然后就有人出来说Java一点都不慢,然后 ...... 然后不了了之了。其实就语言本向来说,Java曾经还是不错的。
我们总是谎言听多了慢慢的也就信了,因为很多时候真相是什么可能并不是那么重要