百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

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

wptr33 2025-02-08 13:05 17 浏览

摘要:几年前,“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仍将名列最受欢迎的语言和平台的前三名。”

相关推荐

Python自动化脚本应用与示例(python办公自动化脚本)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...

Python文件操作常用库高级应用教程

本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...

Python办公自动化系列篇之六:文件系统与操作系统任务

作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...

14《Python 办公自动化教程》os 模块操作文件与文件夹

在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...

python中os模块详解(python os.path模块)

os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...

21-Python-文件操作(python文件的操作步骤)

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...

Python 初学者练习:删除文件和文件夹

在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...

引人遐想,用 Python 获取你想要的“某个人”摄像头照片

仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...

Python如何使用临时文件和目录(python目录下文件)

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

Python常用文件操作库使用详解(python文件操作选项)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

11. 文件与IO操作(文件io和网络io)

本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...

Python os模块的20个应用实例(python中 import os模块用法)

在Python中,...