作家艾萨克·阿西莫夫(Isaac Asimov)曾经说过“唯一不变的就是变化”。 这不仅仅是软件行业中的一个短语,这是绝对的事实。 曾经有一天,Corba为王,但Web Services篡夺了它。 即使在Web服务领域,过去也全都是关于SOAP的,但是现在它是REST风格的服务 ,如今已经越来越流行。 现在,某些事物显然比其他事物徘徊的时间更长。 关系数据库已经存在了40年,并且还不会被NoSql淘汰。 自1999年以来 ,HTTP协议的版本为1.1 ,它帮助我们使用了称为Internet的事物。 至于Java,在过去的15年中它一直是一种非常流行的计算机编程语言。

根据荷兰研究公司Tiobe的总体流行程度,Java在1997年排名第5,在2007年排名第1,在2012年9月排名第2。在撰写本文时, Amazon上有超过2,000种以英语编写的Java编程书籍,并且有近300,000个线程与Java相关的Stackoverflow 。 但是,正如乔治·奥威尔(George Orwell)曾经说过的那样:“眼下谁赢了,总是无敌的”。 但是Java是否立于不败之地或开始消亡? 这就是现在越来越多的问题。

以我的拙见,对Java的挑战可以分为三类:

  1. 替代语言的兴起
  2. 可扩展性/多核处理器
  3. 胖客户的回报。

让我们详细说明一下...

替代语言的兴起

替代语言可以分为两类:在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,但让我们希望,无论发生什么情况,赢家都是技术。

相关链接

  1. Yammer及其向scala的迁移
  2. 詹姆斯·高斯林(James Gosling)在Google技术讲座上探讨Java的现状和未来
  3. Oracle上的文章描述了Java 7中的Fork和Join
  4. Eric Bruno: 构建Java多核应用程序
  5. Edgardo Hernandez: Java中的并行处理
  6. IEEE 十大编程语言
  7. JDK 8下载
  8. 关于Fork Join的Java Code Geeks文章
  9. 爱德华·哈宁的《好叉》加入文章
  10. 叉子/ Doug Lea的纸张
  11. Fork / Join Java从Doug Lea更新信息
  12. Scala Java神话 – Urs Peter和Sander van der Berg的精彩文章

参考: Java已死还是不可战胜? 从我们的JCG合作伙伴 Alex Staveley在都柏林的技术博客博客中获得。

翻译自: https://www.javacodegeeks.com/2012/09/is-java-dead-or-invincible.html

Java死了还是无敌?相关推荐

  1. Java期末复习题 超级无敌全

    Java期末复习题 超级无敌全 **Java基础知识期末复习笔记** 选择题 填空题 判断题 简答题 Java基础知识期末复习笔记 选择题 Java起源于( )公司. A. Oracle B. Sun ...

  2. 高侨名人冒险岛java,高桥名人冒险岛无敌版

    游戏介绍 高桥名人冒险岛无敌版这款游戏是很多年前就深受各大玩家们喜爱的经典街机游戏,相当有趣的玩法模式,随时可以享受.高桥名人冒险岛无敌版游戏中所有景点的关卡经过移植过来,玩家随时可以去体验哦.高桥名 ...

  3. Java小记-集合类(超级无敌认真好用,万字收藏篇!!!!)

    文章目录 集合类 1 为什么要使用集合类? 1.2数组的特点 1.3 集合类的特点 2 Java中集合类的类结构 3 基于List接口的ArrayList类的使用 3.1 ArrayList的特点 3 ...

  4. mac执行java死卡_MacOS应用程序有时卡死,怎么办?2种方法轻松搞定

    MacOS用起来是很流畅,但不免有时也会出现某个应用程序卡住.卡死的情况,这个时候如果直接使用程序的退出菜单或者按Command + Q快捷键退出程序可能会没有效果,因为程序本身已经不响应了,这个时候 ...

  5. Java小记-Vue/ElementUI/Axios(超级无敌认真好用,万字收藏篇!!!!)

    文章目录 Vue/ElementUI/Axios 前言 1 Vue简介 2 Vue的安装 3 Vue的简单使用 4 Vue的指令 4.1 什么是Vue的指令 4.2 Vue常用指令 5 Element ...

  6. 从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node

    我是前Sun公司Java SE团队的一名成员,在工作了10多年之后--2009年1月--也就是在甲骨文收购Sun公司之前,我离开了公司,然后迷上了Node.js. 我对Node.js的痴迷到了怎样的程 ...

  7. 驳“C语言已经死了”

    许式伟 2007-1-7 现在,有很多C/C++程序员总是自命不凡,看不起其他开发人员.其实,或许别人更看不起他呢! >> 有偏见的永远只是个体,而不是群体.作者加了后面那句,无疑证明有偏 ...

  8. 15分钟用Java平台实现Springboot框架构建后端项目框架

    15分钟用Java平台实现Springboot框架构建后端项目框架 文章目录 15分钟用Java平台实现Springboot框架构建后端项目框架 前言 准备工具 1. 新建项目 2.搭建项目框架 3. ...

  9. nginx lua 调试 - 死磕

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

最新文章

  1. RT-Thread GCC VSCode等开源工具链 在智能小车制作中的应用
  2. 欺诈网站都注重用户体验!你,还在等什么?!
  3. Git 自救指南:这些坑你都跳得出吗?
  4. 被忽视的fuzzywuzzy库
  5. mlse均衡器matlab,基于LMS自适应均衡器matlab仿真.doc
  6. 【C语言】一元二次方程(求实根和虚根)
  7. 我也谈谈代码的性能测试及代码改进
  8. 算法(一):二分查找
  9. strdup linux,内存管理 – Linux内核API kstrdup
  10. 关于高等数学、线性代数、数理统计和概率论
  11. 学习总结5.0 Linux tar打包命令
  12. 陈佼每周一蛋疼:“哼唱搜索”更像是个玩具
  13. php mcrypt blowfish,php加密算法blowfish
  14. riser服务key/value服务介绍-基于leveldb
  15. 课课通指针练习之排除异常基因
  16. H12-723题库-个人整理笔记
  17. springboot后台搭建及登录注册接口编写
  18. 网易互娱C++岗一面面经(凉面)
  19. css源码笔记(四)【爱创课堂专业前端培训】
  20. 华为云永久修改主机名

热门文章

  1. ssh无密码登陆权威指南
  2. 转移指令jmp和跳转指令call
  3. envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试
  4. jvm ide_通过微调JVM Garbage Collector减少Java IDE滞后
  5. hazelcast入门教程_Hazelcast入门指南第7部分
  6. javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
  7. 使用Spring WebFlux构建反应性REST API –第1部分
  8. office工作日志文件_风暴事件处理器–每个工作者的GC日志文件
  9. Stomp-Spring服务器端的Web套接字Java客户端
  10. 通过这5个简单的技巧减少GC开销