根据荷兰研究公司Tiobe的总体流行程度,Java在1997年排名第5,在2007年排名第1,在2012年9月排名第2。在撰写本文时, Amazon上有超过2,000种以英语编写的Java编程书籍,并且有近300,000个线程与Java相关的Stackoverflow 。 但是,正如乔治·奥威尔(George Orwell)曾经说过的那样:“眼下谁赢了,总是无敌的”。 但是Java是否立于不败之地或开始消亡? 这就是现在越来越多的问题。
以我的拙见,对Java的挑战可以分为三类:
- 替代语言的兴起
- 可扩展性/多核处理器
- 胖客户的回报。
让我们详细说明一下...
替代语言的兴起
替代语言可以分为两类:在JVM上运行的语言(Scala,Groovy等)和不在JVM上的语言(Python,Ruby)。 一件有趣的事是,第一批人很大 。 在JVM上运行的语言并不是Java专有的,并且在某种程度上增强了Java的功能,这提醒了我们JVM是软件工程的一个杰出之处。 开发团队可以使用诸如Groovy之类的利基语言获得更多的表达能力,但是当他们需要一些很酷的Java库或只需要额外的性能时,仍然可以使用Java。 请记住,Groovy 2.0的优点可以加快它的运行速度,但是它仍然不如Java快 。
至于其中某些语言所提供的功能,这些功能不是Java所能做到的,虽然确实如此,但并非总是如此。 看一下Java 8的路线图及其将包含的功能。 就像Java EE 5和6从Spring / Seam汲取灵感一样,Java第八版主要发行版也将从其他语言汲取灵感。 例如,Lambdas将促进文字函数。 Java 8 Lamdas将支持类型推断,由于它们只是文字,因此有可能像String文字或任何匿名Object一样传递(并返回)它们。
这意味着不必编写Comparator的实现以传递给Collections sort实用程序以对字符串列表进行排序,而在Java 8中,我们将要做:
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
因此,替代的JVM语言不会完全将Java淘汰。 它仍然存在,但是在聚会上演奏的音乐有更好的选择,在聚会上客人鼓励主人做更好的主人。
在多核平台上扩展
至于多核和JVM,我们都知道,在单核上运行JVM可以在Java的第一个发行版中产生线程。 但是这些线程不是并行执行的,CPU很快在它们之间切换,给人以并行运行的印象。 JStack可能会告诉您,单核计算机上有50个线程的状态为“可运行”,但这仅表示它们正在运行或有资格运行。 使用多核CPU,可以获得真正的并行性。 JVM决定何时并行执行线程。
那么这是怎么回事? 首先,即使并发和线程从一开始就是Java的功能,语言支持仍然很有限,这意味着开发团队正在编写许多自己的线程管理代码-很快就会变得难看。 在JDK 1.5中,随着java.util.concurrent包中一系列线程管理功能的出现,这大大缓解了。 其次,为了获得更好的并行性,还需要其他一些东西。 Java 7中带有Doug Lea的Fork / Join框架 ,该框架使用巧妙的技术(例如窃取工作和双面队列)来提高并行度。 但是,即使使用此框架,分解(和重新排列)数据仍然是程序员需要完成的任务。
函数编程为我们提供了另一个选择,可以对数据集进行并行计算。
例如,在Scala中,您只需传递希望对数据进行操作的函数,并告诉scala您希望计算并行化。
outputAnswer((1 to 5).par.foreach(i => longComputation))
你猜怎么着? Java 8中将提供相同的功能。
Array.asList(1,2,3,4,5).parallel().foreach(int i ->heavyComputation())
由于可伸缩性和性能是体系结构的表亲,值得指出的是,在许多实验中,Java仍然比其他语言表现更好。 出色的计算机语言基准测试游戏显示Java胜过许多语言。 它在许多测试中击败了Perl,PHP,Python3,Erlang之类的东西,在几乎所有测试中击败了Clojure,C#,并且在性能结果方面仅落后于C ++。 现在,性能测试无法涵盖所有内容,并且上下文始终会有一些偏向,这会偏向于一种语言而不是另一种语言,但是通过这些测试,就好像Java并不是一个缓慢的教练。
胖客户的回报
自AJAX问世以来, 道格·克罗克福德 ( Doug Crockford)告诉人们如何使用JavaScript以及大量优秀的JavaScript库的兴起,使胖客户端真正回来了。 闭上你的眼睛,想象一下像gmail这样的酷炫单页Web应用程序的外观和感觉,如果它只是基于Spring MVC,JSF或Struts的瘦客户机Web框架–您将无法击败设计良好的胖客户机的性能。
可以节省的一个好处是,JavaScript难以实现,远比某些人认为的要好。 真正了解Closure,模块和各种JavaScript最佳实践需要花费大量的思考,而不是像在Spring MVC和Struts这样的Web框架中了解自己的方式。 此外,构建单个页面的Web应用程序(同样是gmail)不仅需要出色JavaScript理解,还需要了解Web的工作方式。 例如,浏览器不会在浏览器历史记录中放入Ajax请求。 因此,如果您希望后退和前进按钮对用户有用且有意义,则您必须对片段标识符进行一些巧妙的处理。
这里可能存在一些使用Web框架和JavaScript的混合方法,当然还有一些JavaScript库的空间。 这为开发人员提供了构建应用程序的结构,然后使您有机会使用JavaScript,JQuery或任何很棒的库,使该应用程序的重要部分变得花哨。 在真正的胖Web客户端方法中,不应从服务器提供HTML(即没有JSP),唯一从服务器返回的就是数据(以JSON的形式)。 但是,使用混合方法可以使从瘦到胖的过渡更加容易,并且仍可以将JavaScript库放在CDN上,您将无法获得完全胖Web客户端方法的所有优点。
摘要
总之,Java经历了一些糟糕的时刻。 与Struts和Spring MVC之类的其他框架相比,AWT是一项紧急工作,Swing存在性能问题,EJB的早期迭代很麻烦,并且JSF还是有问题的。 但是,即使到了今天, Hadoop等极富创新性的项目还是使用Java构建的。 它仍然得到开源社区的大力支持。 这种支持不仅对Java有所帮助,而且还向Java展示了它的一些问题以及需要改进的地方。 Java证明了它具有进一步发展的能力,而其他语言则挑战了它,我认为游戏还没有结束。 不用说,Java的未来很大一部分将取决于Oracle,但让我们希望,无论发生什么情况,赢家都是技术。
相关链接
- Yammer及其向scala的迁移
- 詹姆斯·高斯林(James Gosling)在Google技术讲座上探讨Java的现状和未来
- Oracle上的文章描述了Java 7中的Fork和Join
- Eric Bruno: 构建Java多核应用程序
- Edgardo Hernandez: Java中的并行处理
- IEEE 十大编程语言
- JDK 8下载
- 关于Fork Join的Java Code Geeks文章
- 爱德华·哈宁的《好叉》加入文章
- 叉子/ Doug Lea的纸张
- Fork / Join Java从Doug Lea更新信息
- Scala Java神话 – Urs Peter和Sander van der Berg的精彩文章
参考: Java已死还是不可战胜? 从我们的JCG合作伙伴 Alex Staveley在都柏林的技术博客博客中获得。
翻译自: https://www.javacodegeeks.com/2012/09/is-java-dead-or-invincible.html