通往Groovy 3.0的漫漫长路,以及他们新改进的解析器

Apache Foundation已发布了Groovy的3.0版,其中包括以下新功能:新的解析器,程序包名称空间更改,增强的Elvis运算符以及对Java语法的支持,例如do / while循环,数组初始化,lambda和方法引用。Groovy 3.0需要使用JDK9 +来构建应用程序,并且Java Runtime Environment(JRE)的最低受支持版本是JDK8。

Groovy 3.0引入了一个新的Groovy解析器,代号为Parrot。它的名称源于它打算继承现在继承的Antlr2解析器的“parrot”输出。Parrot被设计为更具灵活性和可维护性,并且还支持其他语法选项和语言功能。

当被问及传统与Parrot解析器在2018年夏季之间的区别时,对象计算(OCI)首席软件工程师,Groovy提交者兼副总裁Apache Groovy的Paul King说:

当我们谈论“ Parrot”解析器时,我们谈论的是Groovy 3编译器的全面改进。经过重新设计,使其更加灵活,并使用了近期得到良好支持的技术。这项工作使Groovy处于快速发展的有利位置,这意味着我们可以合并Java中的更改,以实现与Java的“剪切-粘贴”兼容性以及本机Groovy更改。

当我们谈到“印地”的支持时。这与在编译器的后期阶段产生的字节码有关。在2.0至2.5的Groovy版本中,我们支持生成“经典” Groovy字节码以及“ indy”版本。indy版本使用了JDK7中引入的“ INvoke DYnamic”字节码指令。

默认情况下,Parrot解析器处于启用状态,而继承解析器将暂不使用。可能会有无法使用Parrot编译的有问题的代码的开发人员可以通过**-Dgroovy.antlr4=false**在命令行上添加系统属性来禁用它,并返回到传统解析器。但是,继承解析器最终将在Groovy 4.0中删除。

为了支持JDK9中首次引入的Java平台模块系统(JPMS),并且为了适应新的Groovy模块被视为头等舱模块,已经将几个Groovy类移到了不同的包名称空间。例如:

  • groovy.util.XmlParser 将移至 groovy.xml.XmlParser
  • groovy.util.XmlSlurper 将移至 groovy.xml.XmlSlurper
  • groovy.util.GroovyTestCase 将移至 groovy.test.GroovyTestCase

为了向后兼容,这些类将在两个包名称空间中都可用,但是传统名称空间最终将在Groovy 4.0中删除。

JDK14早期访问(EA)将于2019年夏季向Java社区提供,它提供了预期的新功能的预览。但是,结合使用JDK 14 EA,Groovy 2.5.x和Gradle 5.5.x发现了一些意外行为。在命令行上执行**groovy -versionGradle任务(如)gradle clean将引发异常。有趣的是,执行gradle -version**将按预期工作。

Gradle利用基于Groovy的领域特定语言进行项目配置,从而支持Maven使用的XML。潜在的问题是Gradle依赖于Groovy 2.5,后者反射地调用了私有构造函数,**java.lang**该构造函数已在JDK 14中删除。

Oracle高级软件开发经理Stephen Felts记录到:

这在JDK14 b8中已被打破。这是groovy-git / src / main / org / codehaus / groovy / vmplugin / v7 / Java7.java中的错误

似乎正在入侵Lookup的构造函数之一。构造函数是私有的,在JDK 14中不存在,因为我们已经将此区域进行了重构,以解决通过Lookup对象传送的问题。

有一个try / catch块,但它正在捕获SecurityException。从JDK9开始的此类错误会引发新的JDK9运行时异常。要编写可移植的代码,您不能捕获确切的异常,而要使用catch(RuntimeException)。

随着Groovy 3.0的发展,此问题已解决,但导致了重大更改。当被问及Apache JIRA中的这些重大更改时,King回答:

这取决于迁移到Groovy 3.0的过程中单个项目决定解决的数量。

仅作为一个示例,作为模块内JDK9 +包命名约定的一部分,groovy.util.XmlParser必须最终将其重命名为groovy.xml.XmlParser,否则**groovy.utilgroovygroovy-xml**模块中都将有一个包。

对于Groovy 3.0,Groovy的“模块化jar”并不严格符合JDK模块,实际上我们都有两个可用的类。因此,对于像Gradle或CodeNarc之类的项目,如果碰巧使用XmlParser,它可能会决定现在做很少的事情并使用旧的类(但在转到Groovy 4时要做一些工作)或可以做一些事情现在更多,以避免以后的额外工作。

King谈到了此最新版本的挑战以及Groovy 4.0的期望。

您想与我们的读者分享有关Groovy 3.0的什么?

保罗·金(Paul King): Groovy 3是一个重要版本,其中包含约600个错误修复,改进和新功能。有80多种新的GDK方法,改进的嵌入Groovydoc的方法和新的AST转换,但是该版本以其全新的解析器而闻名。

新的解析器主要是内部细节,因为新的解析器更加灵活,因此使Groovy团队的工作更加轻松。我们使用了新的解析器,为语言添加了一些新功能,例如新的运算符(例如“ ===‘参考相等运算符,’ !in‘和’ !instanceof'运算符和Elvis赋值运算符)。

还支持安全索引,例如list?[ index ]将返回 null。 还有许多现在支持的 Java 兼容性改变,包括 lambda 表达式、方法引用、 var 保留类型、 do / while 循环、一些数组初始化语法、接口默认方法,甚至 JDK14中新的’’反斜杠转义序列。

经过所有这些Java兼容性更改之后,Groovy 3似乎很可能在赶上Java。事实并非如此。Groovy通常支持对某些Java构造进行编码的更简洁和惯用的方式,但是支持Java语法也大大减少了从Java进入Groovy的开发人员的学习难度。

作为Groovy 3.0的最低构建要求,与JDK9相关的挑战是什么,这些挑战导致使用JDK14,Groovy 2.5.x和Gradle 5.5.x的问题?

**金:**有几个相关的问题:

  • JDK9和更高版本开始弃用和删除所谓的内部类,其中一些类由Groovy(以及许多其他库)使用;我们已经远离那些内部类。
  • JDK9及更高版本使用了一种发出非法访问警告的方法,该方法不是动态语言友好的。我们现在有时通过父方法或接口方法签名来调用方法(类似于Clojure使用的方法)
  • Groovy依赖于其他库(例如ASM)来读取字节码,因此我们必须等到这些库支持特定的JDK版本。
  • Groovy有一个JDK插件系统,可以在几个地方为不同的JDK版本使用不同的代码。我们可以更轻松地延迟加载旧的类,而这些类在以后的JDK版本中可能不会出现。

这项工作是针对Groovy 3的,但是某些部分又被移植到Groovy 2.5.x中。

结果,Gradle是否将被迫向Groovy 3.0过渡?

**King:**目前,Gradle与JDK14一起使用所需的所有功能都在Groovy 2.5.x中,因此,他们迁移到Groovy 3并没有立即的压力。

但是,转到Groovy 3将允许Gradle用户在其构建脚本中使用Groovy 3功能,例如lambda表达式。它还将允许Gradle关闭发出非法警告消息的配置设置。

最终,将只有Groovy 3及更高版本支持JDK版本,因此我们鼓励Gradle开始进行升级。

我们对Groovy生态系统中的其他库(例如Grails,Micronaut和Spock)在移植到Groovy 3方面取得的进展感到满意。

Groovy 4.0计划了哪些功能?

**金:**有些工作很大程度上是内部重构。Groovy的最新版本已支持调用动态(Indy)风味的字节码以及经典字节码。Groovy 4将全部基于Indy。

Groovy 3支持已经提到的新解析器,但也允许您切换回旧解析器。Groovy 4将仅支持新的解析器。

在新功能方面,我们正在研究众多功能,其中一些仍处于试验阶段。我们正在寻找与.NET语言集成查询(LINQ)等效的**module-info**Groovy,对用Groovy 编写文件的本机支持,对用Groovy编写记录的本机支持,对平台日志记录的改进支持以及用于处理Java片段的新JavaShell类。 。

我们可能还会看到对Java 12/13开关表达式的本机支持(尽管Groovy的现有开关以多种方式具有更大的功能)。

Java和Groovy社区什么时候可以开始看到Groovy 4.0的alpha和beta版本?

**金:**实际上,我们已经准备好很快发布Groovy 4的第一个Alpha版。我们知道这还远未完成,因此这是决定何时发布并设定适当期望的问题。我预计将在未来几个月内发布。

对于Groovy来说还有什么呢?

**金:**我们将继续针对用户渴望进一步提高生产率的方案来改进Groovy。

一些用户正在将Groovy与GraalVM结合使用以提高性能,但是它并不理想地适用于动态语言。我们将研究使Graovy与GraalVM更好地配合工作的方法。我们也看到了数据科学家对Groovy的欢迎,因此我们将继续改善对他们的支持。

可以说Groovy作为JVM语言的最大贡献是它的可扩展性。我们将使用这种可扩展性来继续改善Groovy的动态和静态特性。

Groovy在本月庆祝了一个里程碑,因为从Maven Central和Bintray下载的Groovy工件数量超过了十亿。Groovy 3.0可以从下载页面下载,有关此最新发行版的完整详细信息可以在发行说明中找到。开发人员可以期望Groovy 4.0中改进的JPMS支持,并计划很快发布alpha版本。

你可能感兴趣的:(java)