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

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

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

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

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...