李三红:Java版本升级需纳入可持续性维度通过邀请科技行业的业务负责人、资深架构师、资深技术专家对前沿技术进行深度解读和洞察,推动前沿技术的传播和发展当前的技术热点、技术实践和技术趋势。如果从1992年的Oka(Java的前身)算起,Java已经走过了30个年头。Java作为公认的创新编程语言,有着JamesGosling、PatrickNaughton、ChrisWarth、EdFrank和MikeSheridan提出的“可移植性”和“跨平台”的初衷。在推动下,互联网世界带来了无限可能。如今,Java稳定的性能、强大的扩展性和安全性使其广泛应用于各个领域。但30年后的今天,Python、Go、Ruby、Rust等各种编程语言相继涌现,我们也时常听到Java被诟病的声音:Java速度慢,不够灵活,水平不行抽象度太高。无处不在的Java总是让开发者既熟悉又困惑。那么,Java未来会有哪些改进方向呢?您如何看待Java在云原生时代的发展?你如何看待各种编程语言之间的“竞争”?不久前的Java核心技术大会上,“语言、平台与趋势”专场为技术圈带来了一场现代Java在云原生时代实践与演进的主题盛宴。联合机械工业出版社华章分社对本次大会主席、阿里云编程语言与编译器团队负责人、Java冠军李三红先生进行了专访。他将为我们详细介绍Java语言的新特性,OpenJDK在中国的发展,以及未来编程语言的发展趋势。出身:Java发展的原动力Q:请简单介绍一下自己,以及目前关注的领域。A:大家好,我是李三红。我目前在阿里云的编程语言和编译器团队工作。我们团队的主要工作是针对阿里巴巴和蚂蚁各项云业务的需求,新技术的开发,新硬件的引入等,在编译器、语言运行时等基础领域进行研究和创新。目前在语言工具链上,已经有AlibabaDragonwell(Java)、AlibabaLLVM(C++)等产品支持我们的业务。我目前关注的领域也和我的工作职责相关,主要是运行时和编译器领域。Q:当初为什么选择Java作为主要研究对象?Java语言有什么独特的优势?A:其实这是一个很偶然的选择。上大学的时候看到大部分企业级计算场景都是以Java作为主要开发语言。事实上,这种情况在今天并没有太大改变——Java仍然是企业计算领域最重要的开发语言。1997年,Java之父JamesGosling在Computer上发表了一篇题为《The Feel of Java》的文章。在这篇文章中,他谈到了ArchitectureNeutral、ObjectOrientation、DistributedObjects等重要特性,为Java发展至今奠定了基本蓝图。关于Java语言的优势和特点,从不同的比较角度(比如不同语言特性的比较)可能会得出不同的结论。如果从软件交付周期来看,Java所体现的优势是非常明显的。在开发和编码阶段,基于康威定律的微服务最佳实践可以帮助一个庞大而复杂的组织极大地释放各个团队的并行研发效率。Java语言提供了框架开发友好的元编程支持,这也是众多Java框架成功的重要秘诀。基于Java语言栈多样性的Java开源框架,可以帮助开发者快速构建面向微服务的技术体系。在软件运维阶段,Java为开发者提供了丰富的技术手段,从基本的JFR(low-overheadJVMprofilingtechnology)、BCI(BytecodeInstrument)、JMX到上层的各种监控和探测技术,大大提高了在线Java应用,尤其是大规模部署集群的可观察性。同时,大量的Java性能诊断和排错工具,如J*(jstack、jmap等)工具、EclipseMAT/Jifa、VisualVM、JConsole、JavaMissionControl等,可以快速有效地帮助开发者解决生产环境中的问题。遇到的问题。版本升级:可持续性和稳定性的考虑Q:对于Java版本的升级,尤其是对企业,您有什么建议?A:先说说Java版本背景吧。在2018年的CodeOne(前身为JavaOne)大会上,Oracle宣布了Java发布模型的重要变化。就是现在大家都知道的:每6个月发布一个新版本,每2年指定一个LTS(Long-termsupport)版本(甲骨文去年宣布LTS从3年改为2年)。对于推荐版本,为了安全和稳定,理想的情况当然是应用能及时跟上最新的Java版本,也就是说:需要每六个月升级一次,不一定对大多数企业来说都是可能的。软件版本,尤其是底层软件版本的升级,是对企业基础底层架构敏捷性的极大考验,这意味着各种能力:比如企业内部的Java基础设施是否在内部得到统一和强控,是否容易支持不同软件版本的灰度测试,是否有有效的发布前测试覆盖软件升级不兼容带来的不确定性,是否有围绕研发效率的支持工具帮助开发者实现最自动化升级工作等等等等。关于Java版本升级,这里介绍一个工具——EclipseMigrationToolforJava(EMT4J),由阿里开源,目前在EclipseAdoptium下孵化。我们的初衷是将阿里多年Java版本大规模升级的经验融入到这个工具中,帮助Java社区的用户更快的采用新的Java版本。问:您认为开发人员没有足够的动力升级Java的原因是什么?A:确实,在现实中,Java应用的版本升级是比较缓慢的。从2018年Java11(OpenJDK11)发布到现在已经将近4年了,据我所知,目前我们国内的大部分用户还停留在Java8上,阿里内部已经大规模迁移到Java11,并且他们中的一些人会直接从Java8迁移到Java17。缺乏动力的原因有很多。对于开发者来说,最直接的原因可能来自于:升级之后,很多兼容性问题和后续的稳定性问题会直接影响到业务的持续性。.这其实也是我们开源EMT4J的初衷:我们希望积累Java通过工具升级的经验,通过工具的自动化帮助Java应用无缝升级最新版本的JDK。目前EMT4J主要支持从Java8升级到Java11&17。我们还可以从另一个角度——软件可持续性——来讨论Java版本升级的问题。GoogleC++代码库负责人TitusWinter所著的《Software Engineering at Google - Lessons Learned from Programming Over Time》一书中,谈到了组织CodebaseSustainability的概念,强调了两个核心概念:第一,无论是技术需求还是业务需求,你的软件代码应该可以进行所有应该进行的更改。其次,这些变化的影响是安全的。回到Java版本升级的问题,在开发Java应用时,我们建议Java架构师考虑将Java版本升级纳入软件可持续性的维度,并对代码开发规范进行相关约束,例如:不要让你的代码依赖于JDK内部未记录的API(通过反射),不要让你的实现依赖于特定的JDK版本行为等。架构的目标应该是Java应用程序可以随时顺利升级到不同的JDK版本(可持续性)时间根据实际需要,而不是尽量少升级(担心稳定性隐患)。Q:Java17是2021年9月发布的LTS版本(长期支持版),我们也注意到,基于Java17的升级的《Java核心技术(原书第12版)》也于近日发布。你能给一些阅读建议吗?A:《Java核心技术》的第12版延续了往届的优良传统。每当有新的JavaLTS版本发布,本书都会相应更新,这次也不例外。《Java核心技术》第12版涵盖了Java17的最新特性介绍,帮助开发者深入了解使用Java设计和实现软件所涉及的所有基础知识和特性。学习绝对可以事半功倍。Q:关于Java目前的新特性和发展方向,您认为它能解决开发者当前的业务挑战吗?A:2019年,两位图灵奖获得者JohnL.Hennessy和DavidA.Patterson发表了ACM的Communications报告,详细描述了导致计算机架构新时代到来的变化。后摩尔时代,计算能力增长放缓,更多的并行计算技术如多核、SIMD(单指令多数据流)、异构计算被用于释放更大的计算机计算能力。像Java这样的高级语言在软件栈上处于更高的抽象层次,也为创新带来了更多的可能性。Java的发展演进在多核和异构加速领域做了各种探索、适配和优化。例如:在通用CPU领域,OpenJDK社区的VectorAPI项目可以依托CPU的SIMD能力,将计算性能提升一倍。即将发布的OpenJDK19引入了VirtualThreads(Preview),旨在帮助Java开发者高效处理并发(尤其是针对IO密集型场景)。在异构领域,早在2014年JVM技术峰会上,AMD就分享了Sumatra项目,试图实现JVM与HeterogeneousSystemArchitecture目标硬件的交互。曼彻斯特大学发起的TornadoVM项目旨在帮助Java开发人员在不了解GPU编程语言或相关GPU架构知识的情况下编写异构并行程序。另外,从计算模型的变化来看——云原生时代的到来,软件的交付方式发生了根本性的变化。以Java为例,在Java开发和交付之前是应用本身,体现为'jar'和'war'的形式,而云原生的最佳实践是基于微服务的形式,以Container为基本交付单位。并在K8S中编排。云原生应用需要更快的启动,强调资源按量消耗、弹性扩展和可观察性。事实上,Java技术在云原生时代也在不断演进。以下是一些示例:OpenJDK版本中添加了更多支持容器部署的功能(例如UseContainerSupport选项)。多个基于OpenJDK的创新项目围绕Java启动性能的优化,从不同方向探索Java技术栈的边界,包括CRaC(CoordinatedRestoreatCheckpoint)、Leyden、以阿里和谷歌为主要贡献者的FastStartupIncubator项目(在EclipseAdoptium下孵化)。在JVM资源的灵活使用方面,AlibabaDragonwell提供的ElasticHeap功能主要是为了解决云计算环境下内存资源的弹性使用问题。最后,JFR和JFRStreaming技术为构建Java云原生可观察工具提供了重要的技术支持。Q:国内厂商对OpenJDK是什么态度?未来各大厂商在OpenJDK上的竞争格局会怎样?深度参与OpenJDK对Java、IT公司、云厂商有什么影响?A:OpenJDK是JavaSE开源的参考实现(ReferenceImplementation)。从2006年Sun(后来被甲骨文收购)在JavaOne大会上宣布开源Java技术到现在已经将近16年了。在这个过程中,Java生态系统越来越开放,越来越多的公司参与其中OpenJDK社区。阿里在2012年首先签约了OCA,并参与了OpenJDK的开发。包括腾讯、华为、龙芯在内的国内友商也在积极参与。更多的厂商参与合作共建,有利于Java社区的健康和持续发展,也是一个健康的技术社区所希望看到的。Q:在Java核心技术大会上,我们注意到现代Java的新演进,封闭的Java部署模型,以及云原生时代的虚拟机。那么,您是从什么角度来看待编程语言的发展趋势呢?现状如何?A:在计算机的历史上,第一个完整的编译器是在1957年由IBM的JohnBackus领导的FORTRAN团队推出的。Fortran语言也是第一种广泛使用的高级语言。如果从1957年算起,随着硬件架构的更新迭代,围绕软件生产力(productivity)、可靠性(reliability)、简单性(simplicity),60多年来编程语言编译器发展最显着的成就是当今广泛使用的编程语言。毫无疑问,编程语言已经成为支持全球经济的无处不在的软件基础设施的基础。在Java核心技术大会上,我们讨论了Java的演进和发展趋势,包括在后摩尔时代,硬件性能增长放缓,如何让软硬件更好的结合,如何充分探索云计算的硬件性能Java运行时系统探索和创新模式等。这些探索和创新也可以为其他编程语言取长补短。问:去年,谷歌正式宣布Kotlin是Android应用程序开发人员的首选语言。这是否意味着Java绝对统治Android开发的时代已经一去不复返了?A:从Java运行时的角度来看,Kotlin是属于JVM领域的语言。和Scala一样,它和Java没有本质区别。事实上,谷歌在2016年就宣布Android将从基于ApacheHarmony(谷歌与甲骨文的Java版权之争长达十余年)转向OpenJDK。Android使用的类库是基于OpenJDK的。编程语言:没有灵丹妙药,不要轻易放弃Q:在你看来,目前最流行的编程语言是什么?Java、Python、C、C++、Go、Rust,未来你更看好哪些语言?您对选择编程语言有什么建议?A:很难说什么是最流行的(需要具体语境),如果你关心语言排名,可以参考TIOBEIndex、GitHub等。编程语言本身只是一种工具,面向一个业务领域,选择合适的语言工具来解决你的业务问题。没有灵丹妙药——编程语言也是如此——没有一种编程语言绝对比另一种好或绝对差。例如,Java的简单性在于它主要使用面向对象作为主要的编程范式,而C++的复杂性(另一方面带来了编程的灵活性)在于为开发者提供了复杂的编程范式、过程面向、面向对象和通用类型编程。C++虽然提供了更强大的抽象(powerfulabstraction),但它允许开发人员更有效地使用硬件(efficientuseofhardware)。当你面临业务问题时,需要充分考虑业务本身的属性,然后根据业务需求选择合适的编程工具。1986年,FredBrooks在他的经典论文《No Silver Bullet—Essence and Accident in Software Engineering》中将软件复杂性分为EssentialComplexity和AccidentalComplexity。关键在于选择合适的编程工具来解决软件开发中的偶然复杂性。如果为了选择某种语言(例如出于某些群体的利益)而引入更多偶然的复杂性,那就是本末倒置。Q:能否对Java人的职业和技术成长路径提出一些建议?A:最后,我想引用JamesGosling在《远大前程:从软件新手到行业大牛》(英文名:MakingItBiginSoftware)一书中的采访中所说的话:“真的很固执。很多事情真的很容易放弃.无论是你放弃的组织,还是API,或者软件,很多时候,太容易放弃太早了。坚持初心,不要轻易放弃。嘉宾介绍了阿里云编程语言及编译器团队负责人李三红,在虚拟机领域拥有20余篇技术论文/专利。活跃于Java技术社区,GreenTeaJUG(Java用户组)的共同领导者。JavaChampion,Java标准执行委员会(JCP-EC)、GraalVM项目顾问委员会、EclipseAdoptium(AdoptOpenJDK)PMC成员。
