摘要:几年前,“Java 已死”的话题在编程圈内引起广泛讨论,自此之后有关唱衰 Java 的声音层出不穷。反观如今各类编程语言排行榜,Java 却均位居高位。有些人说这是 Java 的“卷土重来”,但实际上 Java 始终属于王道。
原文链接:https://github.com/readme/featured/java-programming-language
声明:本文为 CSDN 翻译,未经授权,禁止转载。
无论是哪个排名系统,无论是 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诞生于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 运行时。
再次回顾过去,我们可以参考一下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诞生已经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仍将名列最受欢迎的语言和平台的前三名。”