• 中文
    • English
  • 注册
  • 查看作者
  • 不要称之为卷土重来,Java 仍独领风骚

    无论你看的是哪家排名,比如TIOBE指数、编程语言流行指数、RedMonk的双年度语言排名,或者是GitHub的 ,Java自1995年发布以来都是一直跻身前三名。然而,如果听一听开发人员们近段时间以来的流言蜚语,你可能会认为Java实际上正处于一个大的衰退期,甚至到了垂死挣扎的边缘。仔细看看这些人气数据,你可能会认为Java已经慢慢地将市场份额拱手让给了它的竞争对手,这是它即将灭亡的另一个明显迹象。一些支持者可能会反驳说,只是因为有越来越多的语言在不断出现,因此大家能分到的蛋糕也越来越小。

    虽然在早期Java遇到过一些小问题,但如今这门语言及其更大的生态系统已经加快发展步伐,以各种方式来满足未来的需求。事实上,它一直都没有离开过:亚马逊、谷歌、Netflix、Pinterest、Spotify、Square和Zoom等公司都在其庞大的代码库中使用了Java。更不用说在过去的十年中,许多大型数据基础设施都是由Java来提供支持的,该语言是Apache Hadoop、Kafka和Spark等公司的支柱。随你怎么 ,但我们现在看到的是Java的复兴;是为那些最近认为它无法满足的未来用例而进行的语言复兴。

    也就是说,Java可以用LL Cool J不朽的名言来描述:“ 别叫它卷土重来,我已经在这里呆了很多年了 //我让同龄人感到震撼,让那些傻瓜们感到恐惧。”

    那些年对Java的不满

    Java于1995年首次亮相,并承诺能够“一次编写,随处运行”(WORA),这一特性使它在当时占主导地位且依赖平台的语言(如C和C++)中脱颖而出。在推出后不久,它就通过Java小程序(applet)进入了Web浏览器,开发者们就突然有了一种可以跨越苹果与PC战线的语言,并进入到蓬勃发展的万维网。虽然在1995年还诞生了PHP、Ruby和Javascript,但它们都没有像Java那样迅速流行起来。

    接下来短短两年时间,Java的受欢迎程度就排到了第三名,仅次于C和C++。到1998年,它超过了C++,并于2001年超过C,攀升至第一宝座。在六年的时间里,Java主导了软件开发世界。虽然这一地位持续了十多年,但在Java世界中,并非所有人都对它感到满意。

    EPI-USE Labs的首席解决方案架构师Andrich van Wyk回忆起Java语言发展停滞不前的时期,那时候尽管它处于主导地位,但也受到了质疑。低谷出现在2009年左右,当时Java 6已经推出将近三年,而Java 7还差两年才能问世。当Java 7最终问世时,van Wyk回忆说,它“虽然经过了5年的开发,但它还是一个相对平庸的版本”。

    他将当时描述为“开发人员渴望更现代的语言功能、更少的冗长代码、以及新的编程范式”的时代。Ruby的Rails框架可能正处于其最初的操作周期的顶峰,而Node.js才刚刚出现,两者都体现了代码简洁、快速原型化、以及可用于快速构建现代Web应用程序的库等特性。换句话说,它们有许多Java所没有的东西,至少在当时来看是这样的。

    “所有这些东西后来都可以通过现代版本和Spring Boot等框架在Java中使用,但我们不得不等到2014年Java 8的发布来启动这种复兴。”van Wyk回忆说,Java 6和8之间间隔了近十年是问题的关键之处。

    所以如果说有可以让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指出了另外的两个关键时刻。首先是2018年,随着Java SE 10的发布,Java的发布节奏就发生了变化,确保每六个月发布一个新版本而不是像之前那样长达数年的时间。

    “Java现在正与许多快速发展的平台竞争,”甲骨文的产品经理Dalibor Topić说。“因此,它还必须得开始更快地前进,最大限度地减少Java用户和开发人员等待新版本的痛苦,同时以惯有的高质量水平交付每个新的Java版本。”

    通过致力于定期发布的节奏,Java加入到了许多现代语言的行列。Ruby、.NET、Python和Javascript都采用一年一次的发布节奏,而Go每六个月发布一个新版本,Rust每六周发布一个新的稳定版本。有了6个月的节奏,Java的功能可以更早地被推出,并且在没有准备好时可以更容易地推迟发布,因为等待不再是不确定事件了。

    “在2018年前后,随着Java 9和发布周期的增加,Java真正迎来了它的高潮,”他说。“更小但更频繁的版本发布确实效果不错。”

    与此同时,Milinkovich指出,Oracle Java开发工具包(JDK)的变化,对Java开发人员和在生产或商业用途中运行Java应用的公司带来了巨大的影响。

    甲骨文在2017年首次宣布,要求这些用户购买年度订阅服务(2019年4月生效),以继续获得Oracle Java平台标准版(Java SE)产品、Oracle JDK 8和11的安全补丁。

    “过去多年来,对Java的长期支持实际上是免费的。作为一家企业,你可以在Java上运行你的应用程序,而不必频繁地升级版本。这种现状被变化了,迫使Java用户要么每六个月迁移一次,要么从甲骨文或其他公司那里寻求商业支持许可证,”Milinkovich解释道。

    这不仅没有阻碍创新,反而使Java生态系统更加繁荣。这一变化刺激了许多云计算供应商,如亚马逊、微软、IBM、阿里巴巴云和华为,提供他们的技术兼容性套件(Technology Compatibility Kit,TCK)以测试和支持OpenJDK版本作为回应。首个回应来自伦敦Java用户组(Java User Group)发布的AdoptOpenJDK。

    伦敦Java用户组的负责人Martijn Verburg表示,该组首先发布了AdoptOpenJDK是因为他们不确定在甲骨文围绕OpenJDK的变化下,开发者的使用权是什么。Verburg说:“他们想确保有一个永久免费的OpenJDK二进制文件供开发者永久使用。”Verburg解释道。

    AdoptOpenJDK是一个“多方利益相关者项目”,最终“转移给了Eclipse基金会(作为Adoptium),以便在软件基金会中实现对自由二进制文件(Temurin)的访问。”

    Milinkovich说,OpenJDK的变化“鼓励了多家公司加入成为自己的Java平台供应商的游戏。生态系统中供应商数量的增长对Java的多样性和可持续性是有帮助的,因为许多相关方都被迫投资于生产高质量的Java运行时,而不是像以前那样。”

    不要称之为卷土重来,Java 仍独领风骚

    来自JVM生态系统的推动

    继续回首过去,我们还可以看到,在Java虚拟机(JVM)上运行的两种语言Kotlin和Scala是Java所谓复兴的参与者。JVM可以运行任何Java字节码,这是Java“一次编写,随处运行”承诺的关键部分。Scala和Kotlin都是专门为编译成Java字节码并在JVM上运行而设计的。Scala首次出现于2004年,就在Java在创新上陷入困境之前,Kotlin则是在2011年出现,正好处于同一时期的中期。

    Kotlin和Scala可以利用JVM的稳定性和普遍性,同时也享有做Java根本无法承担的事情的自由。与此同时,对于任何一种语言来说,产生的风险都可以作为一个积极的证据,证明该特性可以在JVM上按预期运行,且不会导致系统崩溃。对于Java开发人员来说,JVM上的其他语言在提供Java兼容性的同时,也许还能解决他们对Java缺陷的担忧。像Kotlin和Scala这样的语言不仅是独立的语言,有其自身的优势和用例,而且它们为开发人员提供了一种方式来熟悉Java之外的概念,这些概念最终可能会被引入到JPL中。

    “在JVM上使用其他语言是一种非常好的方法,可以看出哪些新颖的想法可以在各自的社区中得到关注,而不必立即尝试将它们嵌入到Java中。”Topić说。“相反,我们可以挑选获胜的想法,并与学术界、工业界和其他开源项目的合作者公开合作,逐步调整和完善这些想法,使它们真正适用于Java本身,将其作为语言和库的功能浮出水面,最终让人觉得它们是‘原生’于Java的。”

    “我们经常谈论Kotlin是一个生产游乐场。”Pinterest的团队负责人兼软件工程师Christina Lee说。“Kotlin不像很多JVM用例那样有很多遗留问题,所以他们的语言可以发展得非常快。这不是你在Java中可以做到的。这些分支语言让我们有能力快速尝试所有这些功能,然后将其中最好的特性功能补充到Java编程语言。”

    Lee指出了Java的一些新特性,如Record类和Field类,而Kotlin已经拥有这些特性好些时间了。Van Wyk同样指出,模式匹配他是从Kotlin开始熟悉的一种语言特性,现在也已经进入到了Java中。“这是后发优势。”van Wyk说。“正是因为Java是最后一个实现这些特性的,所以它可以挑选自己想要的,从而为开发人员带来他们所需要的东西,而不会搬起石头砸自己的脚。”

    Van Wyk指出Scala是最初帮助他学习函数式编程并让他站稳脚跟的语言。“Java 8出现了,它也有函数式编程,我当时就想‘嘿,我已经知道如何使用它了!’”他说。类似地,Kotlin帮助他了解了协程(Coroutine)支持,这是一个由Go编程语言普及的功能特性。“如果没有Kotlin,一些即将推出的Java特性就会更加令人费解,”van Wyk说。

    2017年,谷歌宣布它将 ,与Java并列,自那时起,Kotlin语言便开始流行起来了。Lee表示,自那以后,Kotlin一直是她的首选语言,而且她不打算回头,尤其是当谷歌自己宣布,从2019年开始所有的Android开发都将是“首选Kotlin”。

    对于Lee来说,Kotlin提供了一种面向Android开发的方式,可以避免Java的一些陷阱,在面向移动平台开发时,这些陷阱尤其危险。例如,在编写Java时,NullPointerException是一种常见错误,它可能会使应用程序崩溃,但直到运行时才能发现。Lee说,这对于移动开发来说是个问题,因为与Web应用不同,Web应用一旦部署,客户就可以立即获得缺陷修复,而应用商店可能需要几天或几周才能批准新版本。“比起在另一个生态系统中工作,我会更加重视语言的安全性。”Lee说。“Java是一门伟大的语言,但它没有像Kotlin那样为我们提供在JVM之上的这些层相同的工具来编写正确的代码。”

    Lee说,她没有把Kotlin和Java看成一场零和游戏,即一种语言的普及意味着另一种语言的衰落,她认为这两种语言是共生共存的。毕竟,它们实际上可以在同一个应用程序中并肩存在。事实上,对于有兴趣学习Kotlin的Java开发人员来说,他们可以简单地用Java编写一些东西,将其粘贴到Kotlin文件中,然后通过IDE将其自动转换为Kotlin。“在我看来,这就是Kotlin如此成功的部分原因,”Lee说。“这就是可转移性。”

    Lee给出了苹果选择从Objective C迁移到Swift的比较,在这一过程中,两种语言之间的通信需要额外的步骤。“他们没有互操作性的故事。要把iOS应用程序迁移到Swift上就困难多了。在Pinterest,当我们第一次引入Kotlin时,你只需添加一个Kotlin文件,一切都能正常工作。你可以轻松地在文件之间调用,这为采用这些语言开辟了一条巨大的通道,否则就不会这么容易了。我认为这些语言能够很好地结合在一起的事实使它们非常、非常有凝聚力。”Lee说。

    她说,Kotlin提供了一个完美的中间地带。“你可以保留所有现有的基础设施,并解决一些用户体验上的痛点,而不用将婴儿与洗澡水一起倒掉。完全脱离JVM的理由变得越来越少了。”

    Java使自己稳定且不那么缓慢地步入未来

    在Java使用了近30年之后,你可能会认为该语言已经出现了一些“磨损”的迹象,但事实并非如此。2022年的Java并不是一门衰落中的语言,而是一门为软件开发的蓬勃发展而准备的语言。当Java终于在2010年代中期再次开始创新时,云原生开发的阴影已经笼罩在头顶,现在它越来越成为默认配置,特别是对于大规模运行的企业和软件而言。VMware软件工程副总裁Ryan Morgan说,虽然诸如Go之类的其他语言被视为是为云而设计的,但Java通常被认为是笨重的。

    “Java一直被笼罩在阴影中,人们认为‘它臃肿、笨重,不是云原生的,也不是为云而创建的,它不允许你在公共云中实现你可能想要的密度。”Morgan说。“为了真正消除这些误解,我们做了很多工作。”

    就其本身而言,VMware正在努力通过即将发布的Spring Framework 6和Spring Boot 3(Morgan称之为Spring的“第三幕”)来提高Java的云原生性”,使用 构建的Spring将会提供“Spring中完全的原生支持,这意味着你将能够把任何Spring应用程序编译成本地二进制文件,并减少占用空间和启动时间。这对你可能在边缘地区看到的各种其他工作负载都非常有益。”

    Spring并不是唯一一个这样努力的。红帽的 和 项目都在帮助推动Java进入一些以前被认为是不可能的领域:走向边缘计算,进入微服务架构,在这些领域,小规模和快速的启动时间是关键。类似地, 旨在通过在JVM中而不是在操作系统内核中实现线程,将轻量级线程引入Java平台。“这代表了Java支持并发能力的显著提高,使该平台与当今许多云级应用程序更加相关。”Milinkovich说。“有了Loom项目,用Java编写高并发应用程序对开发人员来说将会变得更加简单,可扩展性也更强。”

    在Milinkovich看来,正是Quarkus、Micronaut、Loom和Adoptium等项目将Java带到了下一代开发人员中。

    “Java已经活了25年了,我相信它还会再活25年。我认为它正在经历一次复兴,无论是从技术角度,还是从生态系统角度来看,都是如此。”Milinkovich说。“开发人员需要记住的一件事情是,Java技能的需求量很大。这将真正有助于开发人员的持续支持,我想你会看到,在可预见的未来,Java将继续保持在最受欢迎的语言/平台的前三名。”

    原文链接:

  • 0
  • 0
  • 0
  • 297
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: