卷土重来?不,Java 一直是王道

摘要:几年前,“Java 已死”的话题在编程圈内引起广泛讨论,自此之后有关唱衰 Java

的声音层出不穷。反观如今各类编程语言排行榜,Java 却均位居高位。有些人说这是 Java 的“卷土重来”,但实际上 Java 始终属于王道。

原文链接

:https://github.com/readme/featured/java-programming-language声明:本文为 CSDN 翻译,未经授权,禁止转载。

作者 | MIKE MELANSON 译者 | 弯月

出品 | CSDN(ID:CSDNnews)

无论是哪个排名系统,无论是 TIOBE 指数、编程语言流行度指数、RedMonk两年一次的语言排名,还是 GitHub 的 Octoverse,Java 在1995 年推出后不久就一直位居前三名。然而,随着时间的推移,开发人员群体的唱衰基调听多了,你可能会以为Java真的开始走向衰退,甚至濒临死亡。仔细看看这些流行度数据,你会发现Java慢慢地将市场份额拱手让给了竞争对手,这也是该语言即将消亡的另一个迹象。一些支持者可能会说,总有新语言出现,市场变大了,每个碎片就变小了。总之,人们的印象很重要。

虽然 Java 在其生命早期遇到了一些小问题,但如今该语言及其生态系统已加快前进的步伐,以各种方式满足未来的需求。事实上,Java已扎根于各个角落:亚马逊、谷歌、Netflix、Pinterest、Spotify、Square 和 Zoom 等公司的代码库中都使用了Java。更不用说,在过去十年中,许多大规模的数据基础设施都是由 Java 提供支持,此外还有Apache Hadoop、Kafka 和 Spark等中坚力量。尽管有人再三扬言Java已死,但我们却看到Java在复兴。

我想用LL Cool J的名曲《Mama Said Knock You Out》中的一句歌词各自来形容Java:“Don’t call it a comeback, I been here for years // I’m rockin’ my peers, putting suckers in fear”(别说我这是卷土重来,我已在此很多年;做着我的音乐,让所有人感到恐慌)。

人们对Java的不满

Java诞生于1995年,承诺“编写一次,到处运行”,这一特性使其在当时占主导地位、依赖于平台的众多语言(如 C 和 C++)中脱颖而出。不久之后,Java就凭借applets进入了Web 浏览器。一时之间,开发人员终于有一种语言能够横跨苹果与PC的战线,并进入了蓬勃发展的万维网。虽然1995年PHP、Ruby 和 Javascript也相继发布,但这些语言都未能像Java一样异军突起,流行度呈直线性增长。

在短短两年内,Java 的受欢迎度就到达了前三,仅次于 C 和 C++。1998 年,Java超越C++,又在2001年超越C后,成为了第一名。Java用了六年时间称霸于软件开发世界。尽管Java的这种地位持续了十多年,但Java的发展并非一直顺风顺水。

EPI-USE Labs 的首席解决方案架构师 Andrich van Wyk 回忆说,有一段时间里,虽然Java仍占据主导地位,但语言本身的发展停滞不前,而且似乎还存在一些问题。他说,低谷出现在 2009 年左右,当时 Java 6 推出已有三年,但Java 7的发行还需要再等两年。当 Java 7 终于发布时,人们却这个花费了5年时间的新版本实则平平无奇。那个时代,“开发人员渴望更现代的语言特性、新的编程范式,而且还希望减少冗长的代码。”

有许多现象可以证明这一点。当时,Ruby on Rails框架方兴未艾,而Node.js 暂露头角,两者都体现了简洁的代码、快速原型设计和快速构建现代库等特性。换句话说,二者弥补了Java的欠缺,至少在当时确实是这样。

van Wyk 回忆道:“后来的Java现代版本和 Spring Boot 等框架都借鉴了这些经验,但是一直等到2014年Java 8发布,Java才开始复兴。Java 6与Java 8之间的十年是问题所在。”

如果说Java确实有一段几乎死亡的时期,恐怕就是那十年了。Java很幸运,众多公司和开发人员全力投入 Java,使其在许多组织中站稳了脚跟。虽然Java的用户越来越不满意,抱怨Java的创新停滞不前,但Java仍然提供了高性能,还有大量的库和工具。也许Java未能真正实现“编写一次,到处运行”的承诺,但它提供了一种高性能、内存安全的语言,非常适合互联网基础设施和大规模应用程序。

尽管如此,2014 年 Java 8 和 Spring Boot 的推出为 Java 生态系统带来了一股新鲜空气,并开启了一段复兴时期。Spring Boot 是十年前推出的框架,其前身是Spring,它降低了Java代码的冗长性。而Java 8则引入了许多开发人员翘首以待多年的特性,例如日期和时间 API 以及Lambda 表达式。

转折点

虽然 van Wyk 指出 2014 年是 Java发展史上的一个主要转折点,但 Eclipse 基金会的执行董事 Mike Milinkovich 指出了另外两个关键的时间点。第一个,随着 Java SE 10 的发布,Java 的发布节奏在 2018 年发生了变化,确保每六个月发布一个新版本的 Java,而不是之前长达数年的时间框架。

Oracle的产品经理 Dalibor Topić表示:“如今Java正在与许多快速发展的平台竞争,因此必须更快地前进,最大限度地减少 Java 用户和开发人员等待新版本的痛苦,同时保证以高质量水平交付每个Java新版本。”

Java通过承诺定期发布加入了许多现代语言的行列。Ruby、.NET、Python 和 Javascript 都采用年度发布,而 Go 每六个月就会发布一个新版本,Rust 每六周发布一个新的稳定版本。在将发布周期压缩到六个月后,Java可以更快地发布新功能,而且在没有准备好时也可以更容易地推迟发布,因为用户需要等待的时间是确定的。van Wyk 说,Java编程语言的创新立即得到了改善。

他表示:“随着2018年Java 9的发布,Java的发布节奏确实取得了进步,小幅、更频繁的版本发布确实效果更好。”

同时,Milinkovich 还指出 Oracle Java 开发工具包(JDK)也发生了变化,并影响了 Java 开发人员以及生产或商业中运行 Java 应用程序的公司。Oracle 于 2017 年首次宣布,从2019 年 4 月开始,用户必须购买年度订阅,才能继续接收 Oracle 的 Java 平台标准版(Java SE)产品、Oracle JDK 8 和 11 的安全补丁。多年来,Java一直免费提供长期支持。作为企业,你可以在Java上运行应用程序,而不必频繁地更新版本。此后,情况发生了变化,Java用户必须每六个月迁移一次新版本,或者向 Oracle 或其他公司寻求商业支持许可。

Java 生态系统的创新从未枯竭,一直在蓬勃发展。这一变化促使亚马逊、微软、IBM、阿里云和华为等众多云提供商纷纷提供了经过技术兼容性工具包( Technology Compatibility Kit,简称TCK)测试和支持的 OpenJDK 版本。率先做出这类响应的是英国伦敦的Java用户组发布的 AdoptOpenJDK。

伦敦Java用户组负责人 Martijn Verburg 表示,他们率先发布AdoptOpenJDK是因为他们不确定在Oralce发布有关OpenJDK的变更后,开发人员是否还有使用权。Verburg表示:“他们希望为开发人员提供永久免费且自由的OpenJDK 二进制文件。”Verburg 解释说,AdoptOpenJDK 是一个“关系到多方利益的项目,最终由Eclipse基金会负责(作为 Adoptium),为的是通过软件基金会提供二进制文件(Temurin)的免费访问权限。”

Milinkovich表示,由于OpenJDK的变化,“多家公司都开始提供自家的Java平台”。生态系统中供应商数量的增长有助于 Java 的多样性和可持续性,因为各方被迫投资生产高质量的 Java 运行时。

来自 JVM 生态系统的推动力

再次回顾过去,我们可以参考一下Kotlin 和 Scala 这两种在Java虚拟机(JVM)上运行的语言,二者是所谓的Java复兴的推动力。JVM可以运行任何Java字节码,是实现“编写一次,到处运行”的关键。Scala 和 Kotlin 都是专门为编译成 Java 字节码并在 JVM 上运行而设计的。Scala 于 2004 年首次出现,就在 Java 创新之前,而 Kotlin 于 2011 年出现,正好处于同一时期。

Kotlin 和 Scala 可以利用 JVM 的稳定性和普遍性,同时还可以自由实现Java根本无法冒险的尝试。同时,这两种语言的出现证明可以在JVM上运行这些功能,并且不会导致系统崩溃。对于 Java 开发人员,在JVM上运行其他语言可以提供 Java 兼容性,同时还可以弥补Java的一些缺陷。Kotlin 和 Scala 之类的语言不仅是具有自身的优势和适合的用例,而且还为开发人员提供了一种方式来熟悉 Java 以外的概念,而这些概念最终都有可能引入Java编程语言。

Topić 表示:“在JVM上运行其他语言是一种非常好的方法,我们可以借此看看哪些新颖的想法对各个社区有吸引力,而且无需立即尝试将它们嵌入到Java中。相反,我们可以挑选优秀的想法,并与学术界、工业界以及其他开源项目公开合作,逐步调整和完善这些想法,使它们更加适合Java,并将它们作为语言和库的特性以Java‘原生’的形式呈现出来。”

Pinterest 的团队负责人兼软件工程师 Christina Lee 说:“我们经常将Kotlin当作生产环境的实验基地。Kotlin 没有JVM遗留下来的用例,因此这种语言的发展速度更快。而Java就没有那么自由。这些分支语言可以让我们快速地尝试一些特性,然后挑出最好的特性引入Java编程语言。”

Lee 指出Java的新特性,比如记录和字段类,在Kotlin中已有一段时间了。Van Wyk也指出,模式匹配是他熟悉的一种语言特性,经由Kotlin引入Java,他表示:“这是后来的借鉴者的优势,由于Java是最后一个实现这些功能的语言,因此它可以自由选择,为开发人员提供他们最想要的功能,而不会惹出太多麻烦。”

Van Wyk 说他本人通过Scala学习了函数式编程,并帮助他掌握了函数式编程的基础知识。他表示:“Java 8引入了函数式编程,当时我就在想,我知道如何使用!”此外,他还通过Kotlin学习了协程,这是 Go 编程语言普及的一项功能。van Wyk表示:“如果没有Kotlin,Java推出这些功能就会让人觉得迷惑。”

2017 年,谷歌宣布Android将正式支持Kotlin与Java,从那以后,这种语言就流行了起来。Lee 表示,Kotlin 一直是她喜爱的语言,而且短期内不打算改变,尤其是2019年谷歌宣布Android开发“以Kotlin为主”。

对于 Lee 来说,Kotlin 提供了一种开发Android的方法,这种语言可以避免Java的一些陷阱——这些陷阱在开发移动设备时尤其危险。例如,在编写 Java 时,PointerException 是一个常见错误,这个错误可能会导致应用程序崩溃,但需要等到运行时才能发现。Lee 说,这对于移动开发来说是个重大问题,因为Web 应用程序在部署后,客户可以立即获得错误修复,而移动应用商店可能需要几天或几周的时间才能通过新版本。Lee 表示:“与在另一个生态系统中工作相比,我更重视语言的安全性。Java 是一门很棒的语言,但它没有像 Kotlin 那样为我们提供JVM之上的工具来编写正确的代码。”

Lee认为,Kotlin与Java不是“誓不两立”的竞争关系,一方的流行度增加意味着另一方的流行度降低,相反,这两种语言是互依互存的关系。它们可以同时用于同一个应用程序开发。事实上,对于有兴趣学习 Kotlin 的 Java 开发者来说,他们可以简单地用 Java 编写一些代码,然后将其粘贴到 Kotlin 文件中,IDE 就可以自动将其翻译成 Kotlin。Lee表示:“在我看来,这就是 Kotlin 如此成功的部分原因,因为这些代码可以相互转换。”

Lee做了一个类比:将苹果的Objective C 迁移到 Swift,这两种语言之间的交流需要额外的步骤。“这两种语言没有互操作性,将 iOS 应用程序迁移到 Swift 上的难度很大。在第一次接触Kotlin时,我们发现你只需添加一个 Kotlin 文件,一切就可以正常工作。你可以轻松地在两种文件之间互相调用。这为我们开辟了一个新渠道,否则迁移到Kotlin将会非常困难。我认为这两种语言可以很好地结合在一起,而且二者非常具有凝聚力。”

她说,Kotlin 提供了一个完美的中间地带,“你可以保留所有现有的基础设施,然后解决其中一些用户的痛点。因此我们完全没必要脱离JVM。”

Java将缓慢而稳步地走进未来

虽然Java诞生已经30多年了,你可能认为该语言会出现一些疲惫的现象,但事实并非如此。时至2022年,Java不仅不会没落,而且还为软件开发蓬勃发展的未来做好了准备。2010 年代中期,Java再次开始创新,但云原生开发的压力已经存在,特别是企业和大规模软件开发都慢慢地把云原生开发作为首选。VMware 软件工程副总裁 Ryan Morgan 表示,Go 等其他语言在设计时考虑了云计算,而且人们普遍认为 Java 更加臃肿。

Morgan 表示:“Java一直活在阴影里,人们认为它‘臃肿、重量级、不是云原生、不是为云构建的,无法在公共云中实现你想要的软件’。但Java做了很多工作来消除这种偏见。”

VMware正在努力通过即将发布的 Spring Framework 6 和 Spring Boot 3 来改进 Java 的云原生性,Morgan 将其称为 Spring 的“第三幕”。使用 GraalVM 构建的Spring可以在Spring内提供“完整的原生支持,这意味着你可以在任何 Spring 应用程序的基础之上,通过编译将其转化为占用空间更小、启动时间更短的原生二进制文件。对于边缘计算上的各种工作负载来说,这是一个好消息。”

除了Spring之外,红帽的Quarkus和Micronaut项目也在推动Java进入以前无法插足的领域,比如边缘计算、微服务架构,以及其他小规模且启动时间很短的关键领域。与之类似,Loom项目正在努力在 JVM 中实现线程,从而帮助Java平台实现轻量级线程。Milinkovich表示:“这代表了 Java 支持并发能力的重大改进,自此Java平台也能够用于当今的许多云规模应用程序了。在Loom项目的加持下,开发人员可以轻松地编写高度并发的应用程序,而且可扩展性也将更上一层楼。”

Milinkovich认为,正是 Quarkus、Micronaut、Loom 和 Adoptium 等项目将 Java 带给了下一代开发人员。他表示:“Java 已经存在 25 年了,我相信它还会继续繁荣25 年。目前Java正在经历一场复兴,无论是从技术角度来看,还是从生态系统的角度来看,这场复兴都至关重要。开发人员需要记住,Java技术的需求仍然很大。这会吸引开发人员持续支持Java,而且在可预见的未来Java仍将名列最受欢迎的语言和平台的前三名。”

原文地址:https://www.toutiao.com/article/7134534124433310211/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = "hello"; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let's briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越