过去几周(2019年6月/ 2019年7月), 瓦尔哈拉计划的LW2阶段/原型最初于2018年10月提出,在面向公众的方面取得了重大进展。 在这篇文章中,我简要总结了最近发布的一些消息,文档和Valhalla Early Access Build。 LW2在Valhalla Wiki页面上描述为早期原型,“将内联类型[移动]到现有类型系统中。”
LW2(JVM)规范草案
丹·史密斯(Dan Smith)在标题为“ LW2规范草案 ”的消息中,在valhalla-spec-experts邮件列表上宣布“对值/内联类的预览功能质量规范的首次查看”。 该消息寻求对初始规范的反馈,并已基于该反馈进行了更新 。 这是一个进行中的工作,但是URL http://cr.openjdk.java.net/~dlsmith/inline-classes当前已设置为重定向到规范草案的当前版本。
与Valhalla相关的所有事情都还在进行中,并且可能会有所变化,但是有趣的是,在本规范草案中阅读了从JVM规范的角度来看Valhalla当前的发展方向。 以下是文档中一些更有趣的要点的示例( 可能会发生变化 ):
- “本文档描述了对Java虚拟机规范的更改,该更改由JVM类型的改进处理进行了修改,以支持内联类 。”
-
reference
类型有五种:标识类类型,内联类类型,数组类型,接口类型和对象类型。 它们的值是对对象的引用。” - “大多数引用类型都是可为空的,这意味着特殊的空引用(表示没有对象)是该类型的值。 一些引用类型是无空值的,这意味着null不是该类型的值。”
- “ 标识类类型为在类文件中定义的非内联,非接口类命名(不包括特殊类Object)。 身份类类型可以为空。”
- “ 内联类类型为在
class
文件中定义的内联类命名。 对于每个内联类,都有一个可为空和无空的内联类类型。 这些类型共享相同的一组值,但null
除外。” - “ 数组类型由具有单个维度的组件类型组成(其长度未由类型指定)。 数组类型的组件类型可以是
boolean
,任何数字类型或任何引用类型。 数组类型可以为空。” - “ 接口类型为在
class
文件中定义的接口命名。 接口类型可以为空。” - “
Object
类型为Object
类命名。Object
类型可以为空。 …Object
类的实例具有标识,但没有字段,其行为类似于标识类实例。” - “可为空的引用类型的默认值为null。 无空内联类类型的默认值是对类实例的引用,该类实例的字段均具有其类型的默认值。”
OpenJDK Valhalla Wiki:L世界
OpenJDK Valhalla Wiki页面“ L-World ”询问并回答“ 什么是内联类型? ”和“ 什么是L-World项目? ”在回答这些问题时,该页面当前将内联类型描述为“小型,不可变,无身份的类型”,这些类型“ 以前称为 “值类型”, 现在称为 “内联类型”。 当前页面将“ L-World项目”描述为“将内联类型引入语言和JDK的一系列早期原型 ”,其“基于先前的最小值类型原型(MVT)的工作”。
OpenJDK Valhalla Wiki:LW2
OpenJDK Valhalla Wiki页面“ LW2 ”将LW2原型描述为“先前原型的迭代,为“内联类型”(以前称为“值类型”)添加了进一步的语言支持和JDK API支持。” 该页面指示LW2原型基于JDK 14 分支,并且该页面包含“内联类型”的几个当前特征,我在此处列出其中一些:
- “内联类型不能声明显式超类(对象除外)。”
- “内联类的所有实例字段都是隐式最终的。”
- “通过'?'对内联类型的'间接'投影 操作员。”
- “ javac自动生成仅根据实例的状态而不是根据其身份计算的
hashCode
,equals
,longHashCode
和toString
” - “ javac允许使用
==
,!=
比较内联类型” - “不能将内联类型分配为null,不能将null强制转换为内联类型或与内联类型进行比较,但使用'?'的'间接'引用除外。 操作员。”
- 可能要添加到java.lang.Class的新方法:
isInlineClass()
,asPrimaryType()
,asIndirectType()
/isIndirectType()
,asNullableType()
/isNullableType()
。 - 内联类型不能同步 ,不能序列化 ,不能将自己引用为直接字段,也不能分配为
null
。
Valhalla抢先体验版
在撰写本文时,“ Valhalla 抢先体验版 ” 页面 (现已更名为“ Project Valhalla'L-World Inline Types'Early -Access Builds”)功能为“ Build jdk-14-valhalla + 1-8(2019/7/4) 。 ” 该页面以以下段落打开:“这是Valhalla项目的早期访问版本,旨在测试L-World内联类型的原型实现。” 该页面还提到:“此构建基于JDK 14的不完整版本。” 与早期访问版本一样,使用早期访问版本存在一些限制和免责声明。 听起来好像有计划“通过错误修复和性能更新”定期更新这些版本。
OpenJDK Valhalla Wiki:LW2命令行选项 / p>
对于希望测试LW2原型的开发人员, OpenJDK Valhalla Wiki页面“ LW2命令行选项 ”中列出了命令行选项 。 如页面本身所述,“它描述了实验性Java编译器,Java启动器和HotSpot JVM的命令行,以支持Valhalla项目中的L-World LW2内联类型。”
2019年6月19日Valhalla专家组会议的会议纪要
Karen Kinnear提供了2019年6月19日Valhalla专家组会议的会议记录 ,该会议记录提供了有关专家组思想的设计主题的见解(“可空的”,“可展平的”,“不可感染性”,“专用仿制药”)。 这些注释表明LW2规范草案的讨论并非旨在最终确定所有设计决策。
结论
将“内联类型”(以前称为“值类型”)完全引入Java仍需要大量工作。 但是,当前对“内联类型”的关注以及与此概念相关的工件和构建物证明了在具体方向上正在取得进展。
翻译自: https://www.javacodegeeks.com/2019/07/valhalla-lw2-progress-inline-types.html