Java的挑战与展望

从Java语言出现到现在的16年间,在Java语言本身发展演化的同时,整个软件开发行业也在发生着巨大的变化。新的软件开发思想和程序设计语言层出不穷。虽然Java语言一直是最流行的程序设计语言之一,但它也面临着来自其他编程语言的冲击。这其中主要是互联网应用发展所带来的动态语言的影响。

Java是静态强类型语言。这种特性使Java编译器在编译时就可以发现非常多的类型错误,而不会让这些错误在运行时才暴露出来。对于构建一个稳定而安全的应用来说,这是一个很大的优势,但是这种静态的类型检查也限制了开发人员编写代码时的创造性和灵活性。

Web 2. 0概念的出现和互联网应用的发展,为新语言的流行创造了契机。Ruby语言凭借着杀手级应用Ruby on Rails一举蹿红,而Google的Web应用开发平台Google App Engine最初也只支持Python一种语言,甚至流行的JavaScript语言也借助于node.js和Aptana Jaxer等平台在服务器端开发中占据了一席之地。这些语言的共同特征是动态类型与灵活自由的语法。开发人员一旦掌握了这些语言,开发效率会非常高。在这一点上,Java语言繁琐的语法就显得缺乏吸引力。Java语言也受到来自同样运行在Java虚拟机上的其他语言的挑战。这些语言包括Groovy、Scala、JRuby和Jython等。任何语言,只要它生成的字节代码符合Java字节代码规范,就可以在Java虚拟机上运行。前面提到的这些Java虚拟机上的语言既具有简洁优雅的语法,又能充分利用已有的Java虚拟机资源,相对于Java语言本身来说,非常具有竞争力。

基于前面的这些现状,在社区中有人悲观地预言:Java已死,COBOL式的死亡。COBOL这门诞生于20世纪50年代末的编程语言,已经被诸多机构和个人论证为已经死亡的语言。实际上,COBOL语言仍然在银行、金融和会计等商业应用领域占据着主导地位。只要这些应用存在,COBOL语言就不会消亡。Java语言也是如此。只要运行在Java平台上的应用还存在,Java语言就能一直生存下去。事实上,现在仍然有许多公司和个人在向Java平台投资。这些投资既包括投入资金和人力来开发基于Java平台的应用,也包括投入时间来学习Java平台的相关技术。

当然,Java平台也有不足之处,其中最明显的是整个Java平台的复杂性。最早在JDK 1.0发布的时候,只有几百个Java类,而现在的Java 6已经包括Java SE、Java EE和Java ME等多个版本,所包含的Java类多达数千个。对于普通开发者来说,完全理解和熟悉如此庞大的类库的难度非常大。在日常的开发过程中,经常可以看到开发者在重复实现某些功能,而这些功能在Java类库中已经存在,只是不被人知道而已。除了庞大的类库之外,Java语言的语法本身也缺乏足够的灵活性,实现某些功能所需的代码量可能是其他语言的几倍。另外一个复杂性体现在Web应用开发方面。一个完整的Java EE应用程序要求程序员掌握和理解的概念太多,要使用的库也非常多。这点从市面上到处可见的以Java Web应用开发和Struts、Spring及Hibernate等框架为内容的图书上就可以看出来。虽然新出现的Grails和Play框架等都试图降低这个复杂度,但是这些新的框架的流行仍然需要足够长的时间。

对于Java语言的未来,我们有理由相信Java平台会一直发展下去。其中很重要的依据是Java平台的开放性。依托JCP和OpenJDK项目,Java平台不仅在语言规范这个层次上有健康的开放管理流程,也有与之对应的参考实现。Java语言有着人数众多的开发者社区,每年有非常多新的开发者学习和使用Java。大量的开发者使用Java语言开发各种不同类型的应用。在社区中可以看到很多提供不同功能的类库和框架。Java虚拟机已经被安装到数以十亿计的不同类型的设备上,包括服务器、个人计算机、移动设备和智能卡等。依托庞大的社区和数量众多的运行平台,Java语言的发展前景是非常乐观的。

对于Java平台来说,未来的发展将侧重于以下几个重要的方面。第一个方面是提高开发人员的生产效率。由于Java语言的静态强类型特性,使用Java语言编写的程序代码一般比较繁琐,包含了过多不必要的语法元素,这在一定程度上降低了开发人员的生产效率。大量的时间被浪费在语言本身上,而不是真正需要的业务逻辑上。从另外一个角度来说,Java语言的这种严谨性,对于复杂应用的团队开发是大有好处的,有利于构建健壮的应用。Java语言需要在这两者之间达到一个平衡。Java语言的一个发展趋势是在可能的范围内降低语言本身的语法复杂度。从J2SE 5.0中增强的for循环,到JavaSE 7中的try-with-resources语句和<>操作符,再到Java SE 8中引入的lambda表达式,Java正在不断地简化自身的语法。

第二个方面是提高性能。Java平台的性能一直为开发人员所诟病,这主要是因为Java虚拟机这个中间层次的存在。随着硬件技术的发展,越来越多的硬件平台采用了多核CPU和多CPU的架构。应用程序应该充分利用这些资源来提高程序的运行性能。Java平台需要帮助开发人员更好地实现这个目标。Java SE 7中的fork/join框架是一个高效的任务执行框架。Java SE 8对集合类框架和相关API做了增强,以支持对批量数据进行自动的并行处理。

第三个方面是模块化。一直以来,Java平台所包含的各种功能不同的类库是一个统一的整体。在一个程序的运行过程中,很多类库其实是不需要的。比如对于一个服务器端运行的程序来说,Swing用户界面组件库通常是不需要的。模块化的含义是把Java平台提供的类库划分成不同的相互依赖的模块,程序可以根据需要选择运行时所依赖的模块,只有被选择的模块才会在运行时被加载。模块化的实现不仅可以应用到Java平台本身,也可以应用到Java应用程序的开发中,OpenJDK中的Jigsaw项目提供了这种模块化的支持。