@levinzhang
2023-03-24T09:18:05.000000Z
字数 4819
阅读 295
by
甲骨文发布了Java编程语言和虚拟机的20版本,其特性集中包含了7个JEP。该版本的JEP为Amber、Loom和Panama项目的新一轮预览和孵化持续贡献了特性。
甲骨文发布了Java编程语言和虚拟机的20版本,最终的特性集中包含了7个JEP:
Java 20的特性节奏类似于JDK 19的7个新特性和JDK 18的9个新特性。但是,与JDK 18之前的几个版本相比,特性要更少一些,比如,JDK 17中有14项特性,JDK16中有17项特性,JDK 15中有14项特性,JDK 14中有16项特性。
该版本的JEP为Amber、Loom和Panama项目的新一轮预览和孵化持续贡献了特性。在这里,我们探讨其中的几个新特性。值得注意的是,JDK 20中没有代表Valhalla项目的JEP。
JEP 434和JEP 438属于Panama项目,该项目旨在改善和丰富JVM与定义明确的“外部” API(即非Java)之间的互操作性,其中很可能会包含C库中常用的接口。
JEP 434,外部函数与内存API(第二轮预览),基于反馈进行了改善,并基于JDK 19所提供的JEP 424外部函数与内存API(预览)提供了第二轮预览。相关的孵化包括JDK 18交付的外部函数与内存API(第二轮孵化)和JDK 17中交付的外部函数与内存API(孵化)。该特性为Java应用提供了一个API,能够通过高效地调用外部函数和安全地访问不受JVM管理的外部内存,实现了与Java运行时之外的代码和数据进行互操作。JEP 424的更新包括:统一了MemorySegment和MemoryAddress接口,即内存地址建模为零长度的内存段;增强了密闭的MemoryLayout接口,以便于和JDK 19交付的switch的模式匹配(第三轮预览)协同使用。
JEP 438,Vector API(第五轮孵化),对之前四轮孵化的反馈进行了增强,即JDK 19交付的JEP 426,Vector API(第四轮孵化)、JDK 18交付的JEP 417, Vector API(第三轮孵化)、JDK 17交付的Vector API(第二轮孵化)和JDK 16交付的孵化模块。该特性的目标是增强Vector API,从而能够根据JEP 424, 外部函数与内存API(预览)的定义,从MemorySegment中加载和存储vector。
关于如何实现“外部函数与内存API”的可运行应用,可以参阅该GitHub仓库,其作者是Azul的开发人员布道师Carl Dea。
JEP 429、JEP 436和JEP 437属于Loom项目,该项目旨在探索、孵化和交付Java VM特性和API,以便于支持易用、高吞吐的轻量级并发和新编程模型。这可以通过虚拟线程、定界延续(delimited continuations)和尾调用(tail calls)来实现。
JEP 429,作用域值(孵化阶段),它是一个正在孵化中的JEP,最初叫做范围局部变量(Extent-Local Variables,Incubator),提议在线程内部和线程间共享不可变的数据。这比线程局部(thread-local)变量的做法更好,尤其是在大量使用虚拟线程的时候。
JEP 436,虚拟线程(第二轮预览),提议对JDK 19所提供的JEP 425,虚拟线程(预览)进行第二次预览,以便留出充分的时间为该特性的演进提供更多的反馈和体验。该特性为Java平台提供了虚拟线程,这是一种轻量级线程,可以极大地减少编写、维护和观测高吞吐量并发应用程序的工作量。需要注意的是,本预览版仅对JDK 19所固定的JEP 425的API进行了少量修改,除此之外没有其他变化,所以在第二轮预览中没有任何提议。请参阅InfoQ的新闻报道和甲骨文Java平台组的Java开发人员布道师José Paumard的JEP Café录像。
JEP 437,结构化并发(第二轮孵化),提议基于JDK 19中所提供的 JEP 428,结构化并发(孵化)重新孵化,以便留出充分的时间为该特性的演进提供更多的反馈和体验。此特性的目的是通过引入一个库来将在不同线程中运行的多个任务视为单个工作单元,从而简化多线程编程。这可以简化错误处理和撤销,提升可靠性,并增强可观测性。该JEP的唯一的变化是更新了StructuredTaskScope类,以支持在任务作用域中创建的线程可以继承作用域的值。这简化了线程间不可变数据的共享。有关JEP 428的更多详细信息,请参阅 InfoQ的新闻报道。
关于如何实现虚拟线程和结构化并发API的可运行应用,可以参阅甲骨文的Java开发人员布道师Nicolai Parlog创建的GitHub仓库以及Contrast Security的高级软件工程师Bazlur Rahman创建的GitHub仓库。
JEP 432和JEP 433属于Amber项目,该项目旨在探索和孵化更小的Java语言特性,以提升生产力。
JEP 432,记录模式(第二轮预览),为了响应上一轮预览JEP 405,记录模式(预览)的反馈,该JEP包含了功能增强。它提议使用记录模式来解构记录值,以实现对语言的增强。记录模式可以与类型模式结合使用,以“实现强大的、声明式的、可组合的数据导航和处理形式”。类型模式最近通过JDK 19交付的JEP 427,switch模式匹配(第三次预览)、JDK 18交付的JEP 420,switch模式匹配(第二次预览)和JDK 17交付的JEP 406,switch模式匹配(预览)扩展到了switch
case标签中。与 JEP 405相比,它的变更包括,增加了对泛型记录模式类型参数推断的支持,增加了对记录模式出现在增强for语句条件判断中的支持,并删除对了对命名记录模式的支持。
与之类似,JEP 433:switch的模式匹配(第四次预览),提供了功能增强,以响应前三轮预览的反馈,即JDK 19交付的JEP 427,switch的模式匹配(第三次预览)、JDK 18交付的JEP 420,switch的模式匹配(第二次预览)和JDK 17交付的JEP 406,switch的模式匹配(预览)。与JEP 427相比,新JEP提供的变更包括,简化了switch
标签的语法、switch
表达式和语句以及其他支持模式的构造体均支持泛型类型模式和记录模式的类型参数推断。
关于如何实现记录模式和switch API的模式匹配的可运行应用,可以参阅Global Points的技术主管Wesley Egberto创建的GitHub仓库,该特性位于java-19
目录中。
目前,JDK 21只包含一个Targeted状态的JEP。JEP 431,序列集合,在JDK 21中已经从Proposed to Target状态提升到了Targeted状态。该JEP提议引入“一个新的接口系列,代表了元素能够以明确的序列或顺序排列在集合中的概念,使其作为集合的结构化属性”。该JEP的动机在于集合框架(Collections Framework)中缺乏定义良好的排序和统一操作集。关于JEP 431的更多信息,请参阅InfoQ的新闻报道。
但是,根据最近提交的JEP草案和提出最终特性的JEP候选方案,我们可以推测出哪些JEP有可能纳入到JDK 21中。
JEP 440,记录模式,上周已经从JEP Draft 8300541状态提升至Candidate状态。该JEP最终确定了这一特性,并根据前两轮预览的反馈意见进行了改进,即JDK 20交付的JEP 432,记录模式(第二轮预览)和JDK 19交付的JEP 405,记录模式(预览)。该特性使用记录模式来解构记录值,以实现对语言的增强。记录模式可以与类型模式结合使用,以“实现强大的、声明式的、可组合的数据导航和处理形式”。类型模式最近通过JDK 18交付的JEP 420,switch模式匹配(第二次预览)和JDK 17交付的JEP 406,switch模式匹配(预览)扩展到了switch
case标签中。从JEP 432以来,最重要的变更是移除对记录模式出现在增强for
语句条件判断中的支持。
与之类似,JEP 441,switch的模式匹配,已经从JEP Draft 8300542状态提升到了Candidate状态。该JEP也最终确定了这一特性,并根据前四轮预览的反馈意见进行了改进,即JDK 20交付的JEP 433: switch的模式匹配(第四轮预览)、JDK 19交付的JEP 427,switch的模式匹配(第三轮预览)、JDK 18交付的JEP 420,switch的模式匹配(第二轮预览)和JDK 17交付的JEP 406,switch的模式匹配(预览)。该特性通过对switch表达式和语句进行模式匹配,增强了语言的特性。
JEP 442, 外部函数与内存API(第三轮预览),已经从JEP Draft 8301625状态提升到了Candidate状态。该JEP基于之前的反馈进行了改进,并提供了第三个预览,这些反馈来自JDK 20交付的JEP 434,外部函数与内存API(第二轮预览)、JDK 19交付的JEP 424,外部函数与内存API(预览)以及相关的孵化,即JDK 18交付的JEP 419,外部函数与内存API(第二轮孵化)和JDK 17交付的JEP 412,外部函数与内存API(孵化)。该特性为Java应用提供了一个API,能够通过高效地调用外部函数和安全地访问不受JVM管理的外部内存,实现了与Java运行时之外的代码和数据进行互操作。JEP 434的更新包括,在Arena
接口中集中管理原生段的生命周期;增强布局路径,用一个新元素来解除对地址布局的引用;删除 VaList
类。
甲骨文公司Loom项目的架构师和技术负责人Ron Pressler和甲骨文公司Java平台组的架构师Alan Bateman在上周提交了JEP Draft 8303683,虚拟线程。该JEP提议根据前两轮预览的反馈来最终确定该功能,即JDK 20交付的JEP 436,虚拟线程(第二轮预览)和JDK 19交付的JEP 425, 虚拟线程(预览)。该特性为Java平台提供了虚拟线程,这是一种轻量级线程,可以极大地减少编写、维护和观测高吞吐量并发应用程序的工作量。与JEP 436相比,最重要的变化是,虚拟线程现在完全支持线程局部(thread-local)变量,消除了选择不使用这些变量的选项。关于JEP 425的更多细节,请参阅InfoQ的新闻报道和甲骨文Java平台组的Java开发人员布道师José Paumard的JEP Café录像。
JDK 21的正式发布日期尚未公布,但按照六个月的发布周期,预计将于2023年9月中旬交付。作为开发人员,我们可以预计特性冻结会在2023年6月中旬。关于其他JEP草案和候选版本的更多细节,可以在InfoQ的这篇更详细的新闻报道中找到。
JDK 20现在可以从甲骨文网站下载,其他供应商的二进制文件预计将在未来几天内提供。
查看英文原文:Java 20 Delivers Features for Projects Amber, Loom and Panama