Java死了还是无敌?

作家艾萨克·阿西莫夫(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库访问问题吗_#MySQL数据库无法远程访问的问题

在 Ubuntu上装了mysql,因为项目的数据库是mysql,将项目放在tomcat里面webapp下面,一直启动不成功。本来一直以为是jdbc驱动问题,后来发现不是。1.cd /etc/mysql 找到my.cnf查找到bind-address,将 bind-address127.0.0.…

SolidEdge如何复制特征 建立类似于UG 块的概念

直接CtrlC和CtrlV可以实现特征的复制粘贴 按N键可以改变特征方向 已经复制完成的特征要进行定位,则右击该特征,编辑轮廓,可以进行聪慧尺寸的标注 使用特征库的方式,就像UG的块一样,可以给所有零件调用。在任意位置新建…

Gradle自定义插件

本教程介绍了创建Gradle独立自定义插件的方法。 它涵盖以下主题 创建任务,并在“自定义”插件中使用它 独立的自定义插件 简短的插件ID 使用settings.gradle自定义Gradle设置 项目信息: 摇篮版本:1.1 操作系统平台:Ubuntu 1…

mysql映射文件_Mybatis SQL映射文件

简单查询insert添加insert可以使用数据库支持的自动生成主键策略,设置useGeneratedKeys”true”,然后把keyProperty 设成对应的列,就搞定了。比如说上面的StudentEntity 使用auto-generated 为id 列生成主键.还可以使用selectKey元素。下面例…

监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面或执行一些其它操作的 需求,那在代码中怎样监听当点击微信、支付宝、百度糯米、百度钱包等app的返回按钮或者浏览器的上一页或后退按…

第七天作业

---恢复内容开始--- 作业一:nginx服务 二进制安装nginx包 作为web服务修改配置文件 让配置生效,验证配置 直至出现epel的两个文件,否则reinstall, 接下来写配置文件, 这款软件的服务目录, 在里面编辑一些东西&#xff…

Java测试提示

介绍 我喜欢自动化测试。 在一次极少的转移到op-ed 1中,我想到了一些想法(阅读–意见)。 在开始如何最好地构成您的测试之前,我先简单问一下–测试的原因是什么? 大致来说,我认为它们是: 减少…

pdo mysql fedora_在Fedora 23 Server和Workstation上安装LAMP(Linux, Apache, MariaDB和PHP)

在安装LAMP之前,建议先更新系统包$ sudo dnf update第一步:安装Apache Web服务器1.在Fedora 23安装Apache,你可以运行下面的命令:$ sudo dnf install httpd2.安装完成后,我们设置在系统启动时自动启动Apache&#xff0…

洛谷P1937 [USACO10MAR]仓配置Barn Allocation

题目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from the cows since some of the stalls have a better view of the pastures. The barn comprises N (1 < N < 100,000) stalls conveniently numbered 1..N; sta…

人脸数据库大全(包括人脸识别、关键点检测、表情识别,人脸姿态等等)

搞计算机视觉的人&#xff0c;对人脸技术并不陌生。在做实验的时候需要各种数据集进行训练&#xff0c;却往往苦于找不到合适的数据集&#xff0c;这篇文章将给大家带来一点福音。 目前为止最全的是人脸数据库总结&#xff1a; The Color FERET Database, USA The FERET progra…

JavaFX游戏(四连环)

这是我的第一个JavaFX游戏教程&#xff0c;也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这款四连环游戏&#xff0c;足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但它与另一个…

vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?

作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。 前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。 什么是初始化 初始化…

maven 配置 pom.xml 打包生成:单jar包/jar包+lib目录

http://www.jianshu.com/p/9146cec6cc60转载于:https://www.cnblogs.com/Baronboy/p/7510942.html

zabbix安装MySQL失败_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...

本文主要向大家介绍了MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。如题所示&#xff0c;在CentOS6.x的系统中安装zabbix3.x&#xff…

拼图项目:延期的后果

Mark Reinhold先生于2012年7月宣布 &#xff0c;他们计划从Java 8撤回Jigsaw项目 &#xff0c;因为Jigsaw计划于2013年9月&#xff08;从现在开始一年&#xff09;推迟其发布。 这个日期是众所周知的&#xff0c;因为Oracle已决定实施Java的两年路线图计划&#xff0c;因此2013…

Navicat下Oracle数据泵的使用简单例子

如何使用Navicat等数据库开发工具进行高效开发将是未来工作的重点。Navicat一来美观而来够操作够傻瓜&#xff0c;使用得当其强大功能与PL SQL不相上下。今天学习就是如何在Navicat中使用数据泵进行数据导入导出。 数据泵使用前事项&#xff1a;想使用数据泵必须以sys或system等…

前端自动化之nvm安装

nvm ——node环境版本控制工具。 1.解压安装包 2.打开setting文件&#xff0c;修改文件内容 root: D:\node\nvm path: D:\node\nodejs arch: 64 proxy: root&#xff1a;当前nvm所在的路径 path&#xff1a;将root路径的nvm改为nodejs arch&#xff1a;64位系统 3.配置环境变量…

mysql 主从复制介绍_MySQL 主从复制介绍

一、MySQL 主从复制简介(1) MySQL 主从复制通过逻辑的 binlog 日志复制到要同步的服务器本地&#xff0c;然后由本地的线程读取日志里面的 SQL 语句&#xff0c;重新应用到 MySQL 数据库中(2) 在复制过程中&#xff0c;一台服务器充当主服务器&#xff0c;接收来自用户的内容更…

【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s=a+b+c+d;...

数组没有length()这个方法&#xff0c;有length的属性。String有有length()这个方法。 int a[]; a.length;//返回a的长度 String s; s.length();//返回s的长度 java中数组没有length()方法&#xff0c;求数组的长度可以使用数组的length属性。 int[] arr{1,2,3,4,5};int length…

Spring范围代理

考虑以这种方式定义的两个Spring bean&#xff1a; Component class SingletonScopedBean{Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();} }Component Scope(value"prototype")…