卷土重来?不,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在复兴。
https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/TFCoS5QBa8ZAKP~tplv-tt-large.image?x-expires=1981068451&x-signature=9lfSFoEWKzwxkpoK2cmobaz2xrw%3D
我想用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”(别说我这是卷土重来,我已在此很多年;做着我的音乐,让所有人感到恐慌)。
https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/SibV8iB7gfIVeO~tplv-tt-large.image?x-expires=1981068451&x-signature=qLikyGJFE04m26DhnF8v%2BqxLWhQ%3D
人们对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 表达式。
https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/SibV8qW8mqM9VB~tplv-tt-large.image?x-expires=1981068451&x-signature=Sza4g47pI7cq2UN5DnPeEo2KNTE%3D
转折点
虽然 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 运行时。
https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/SibV9897mQGxL0~tplv-tt-large.image?x-expires=1981068451&x-signature=4R7tSTqQD2LsQjFltjDvBHVn3mc%3D
来自 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。”
https://p3-sign.toutiaoimg.com/tos-cn-i-tjoges91tu/SibV98uJ9Ubxoy~tplv-tt-large.image?x-expires=1981068451&x-signature=9a0SRjrEQY5PycMFQj%2BbkXaTfiY%3D
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仍将名列最受欢迎的语言和平台的前三名。”
页:
[1]