Java——生于忧患,死于安乐

  近日,在CSDN首页上看到这样一则新闻:从容面对五大挑战 问谁敢说“Java已死”?文中提到“许多作者都对Java进行口诛笔伐,一些人甚至似乎认为Java就此“落魄了”,而原本那些“狂热的支持者们”也销声匿迹了。”由于一直忙于工作,对这些口水战没有太多关注,也没有耳闻太多的事情。但就Java而言,我的确有些自己的反面声音;但首先表明我的观点,我个人不喜口水战,只是想以一个喜好技术的人的角度对Java表示一下惋惜,并非“口诛笔伐”。

  从起源上来讲,Java并非“系出名门”。尽管它的缔造者是大名鼎鼎的Sun Microsystem,尽管它的语法是“类C/C++”的,但这并不能说明Java就是名门子弟。众所周知Java最初只是为了开发动态网页而产生的一种脚本语言,而并非专门作为一种软件开发语言而设计的,这就导致其语法存在固有的缺陷。过分简化的语法使得语言丧失了很多原本非常强大的功能。Java鼓吹“纯面向对象”,真正面向对象的系统的主导机制是封装、继承和多态,这一点Java做到了,而且做得不错;并且将接口作为一种显式的语言构造提出,为实现大型系统提供了保障。然而,继承、封装和多态都是通过“类”这种特殊的语言构造来实现的,而且“类”也是面向对象体系中重要的概念和实体。并且,在面向对象世界中,一个类应该具有这样一些成员:域(字段、成员变量)——用于存放于一个对象相关的状态和数据;方法(成员函数)——表示一个类或一个对象所具有的行为;属性——表示一个类的特征的数据;以及事件——一种表示某种事件发生的语言实体。而Java中类的成员只有域(字段、成员变量)和方法(成员函数),这就导致了Java语言根本无法精确地描述一个面向对象的世界。属性需要靠方法来模拟,事件则必须通过接口和方法一起模拟。

  于是,设计模式诞生了。什么是设计模式呢?在Smalltalk、C++这样没有接口和事件的语言中,大部分设计模式其实就是告诉我们如何用现有的语法实现和使用接口、模拟发送和接收事件。Java有接口,但没有事件,因此,传统设计模式依然存在。目前有一项很有意思的课题,就是研究GoF所提出的23种传统设计模式(参见《设计模式》)中,到了Java时代,应该取消那些模式。我也有个很有意思的答案:与接口相关的都应该取消,因为Java有接口;与事件相关的和其他大部分都应该保留。

  然而,是什么导致Java风靡世界呢?无外乎这两点:虚拟执行系统和垃圾收集。

  虚拟执行系统的确是一个很新鲜的创意,虽然不是由Sun最先发明的,但的确是Java令虚拟执行的概念深入人心的。但Java由于一直以简单、安全为其目标,因此虚拟执行系统的设计非常之不完善。另外,由于采用的是虚拟机的概念,所有bytecode有虚拟机来执行,效率偏低。(.NET CLR没有采用虚拟机,而是通过JIT编译器将IL编译成Native Code,然后交给CPU执行,效率略好一些。)

  同时,JVM不允许并行版本,也就是说,如果安装了5.0,原来的1.4就不能用了。这是个很严重的问题,这极大地限制了语言的升级,因为每一次升级,就必须考虑到向后兼容的问题。这个问题在Java5时代已经凸现出来,那就是对泛型的支持上。Java5貌似支持泛型,然而实际上,这只是一种“语法糖”,编译器在编译过程中,就将泛型类型替换为了object类,这几乎完全丧失了泛型所带来的效率优势,最关键的是,在转换为object类型后,丢失了很多类型信息,这直接影响到安全。

  那么,为什么Java如此成功呢?这首先是因为Sun最先将虚拟执行系统和垃圾收集的概念带出实验室,带入人们的生产活动中;这导致很多大厂商比较早地接受了这种思路,并对其提供支持。从而使得Java拥有了软件开发领域中最大的市场。

  我们可亲可敬的James老爷爷,虽然我是微软技术阵营的人,但我大学时代的床头曾挂着两幅头像,一是Bjarne Stroustrup、另一个就是Java之父James Gosling。因为他们的人品和技术都是值得尊重的。然而,最近几年,James不知怎么了,疯狂地在媒体露面,从Java5发布会开始。前一个月还到中国来溜达了一圈,还来了CSDN。虽然这样能够贴近一线开发者、能够拉拢人气,但您老如果不踏踏实实在实验室里研究,怎么能让您一手缔造的Java再上一个台阶?语言有缺陷可以改进,但如果放任自流,其必将走上不归之路……(我尽量避免拿Java和.NET对比,但这里我不得不提,虽然微软也近乎疯狂地为其.NET大肆造势,但.NET幕后真正的主使——Anders Hejlsberg却一直悄然藏于微软总部,踏踏实实地进行着研发,除了很少几次接受MSDN Show的采访外。)

  Java生于忧患,在一个传统编程技术继续被突破的年代,在一个大多数C++开发者在徘徊的年代,Java革命性地将虚拟执行系统和垃圾收集机制引入软件研发、生产活动,建立了一个也可堪称“帝国”的社群。然而,打江山容易坐江山难,这样貌似庞大的一片基业,如果不通过再继续努力地研发,极有可能就丧生于安乐。诚然,Java市场拥有率仍高居榜首;但看看它的发展曲线呢?是不是每年都有增长呢?如果是的话,再看看增长速率,也就是所谓的加速度,是否仍然是正值呢?

你可能感兴趣的:(java,设计模式,.net,虚拟机,活动)