Jack(javaandroid编译器工具包)将如何影响Scala开发人员
现在,随着谷歌的宣布,Java与Android的可预见未来变得清晰起来。但这对Scala和其他基于JVM的语言开发人员有什么影响呢。特别是:Jack(javaandroid编译器工具包)将如何影响Scala开发人员,android,scala,java-8,Android,Scala,Java 8,现在,随着谷歌的宣布,Java与Android的可预见未来变得清晰起来。但这对Scala和其他基于JVM的语言开发人员有什么影响呢。特别是: Scala之所以如此神奇,是因为它有自己的编译器来生成Java字节码。生成的字节码是否会获得Jack处理的任何优化好处 从Scala 12开始,只支持Java 8+。也就是说,生成的字节码也是Java8+。Jack能否利用Java8字节码(没有或有限制) 新支持的Java8功能是否可以用于开发较旧的Android版本(minSdkVersion
编辑: 我试图对我的问题进行推理(而不是回答),希望如果我错了,专家会纠正我。 下面是一个假设的Jack build流程,其中包含一些额外的块,这些块是根据我的逻辑和我从可用文档中学到的知识添加的
基本假设是Dalvik最多支持Java7字节码指令。如果这是正确的,那么Java 8指令不能直接传递给Dalvik,它们应该以某种方式转换为Java 7。(可能与Scala编译器经常做的事情类似) 问题是这种转变发生在哪里?Jill目前似乎无法处理Java8字节码,所以这可能发生在假设流的块(3)中。如果这是正确的,那么只有Java源项目文件需要转换,第二个问题的答案是-否。在Jill能够转换之前(如果可能的话),不能使用库中的Java 8类。也就是说,我们不能使用Scala 12+ 如果在方框(6)中执行了所有代码优化,则第一个问题的答案为-是。转换为library.jar的Scala代码可以从Jack优化中获益。但初步来说,它应该转换为.jayce(类似AST的表示法),这将增加构建时间 最后,Jack生成.dex Dalvik字节码以保持与旧Dalvik运行时的兼容性(ART也使用Dalvik字节码)。因此,三维问题的答案是:是的,可以使用Java8特性。但仅限于project Java源代码中。应用程序仍然与任何运行时兼容。但由于转换为Java7(Dalvik字节码),Java8的优势被放弃了
重要的是要了解引入了2个工具:
- Jack:一种新的编译器,用于取代复杂的javac+proguard+dx
- Jill:一个库链接器,可以链接当前编译的库(.class)和更多库。
看
- Scala兼容性:
杰克不支持Scala,因为杰克编译Java源代码。
但是Scala 2.11编译成Java 1.6字节码,因此Jill将能够选择该代码并转换成jack文件,以提供给jack编译器。
请参阅(Kotlin与Scala的问题相同,因为它是一种JVM语言) - Java 8,因此Scala 2.12+,兼容性:
这部分正在开发中,如果Jack/Jill支持Java8,那么它也将支持Scala2.12+(通过Jill)。如果不是,Java 8开发人员将与Scala 2.12开发人员同舟共济。
如果Jack支持Java 8而不是Jill,那么Java 8库开发人员将与Scala 2.12开发人员站在同一条船上。
看
自2017年新信息发布后修订:jack工具链现在已被弃用,旧的dex/javac堆栈将获得java8支持,因此scala现在不会有任何变化。谷歌刚刚宣布jack工具链将弃用jack工具链,Android添加了“支持将Java 8语言功能直接导入当前的javac和dx工具集” 资料来源: 我们知道我们的Android开发者社区多么关心对Java8语言特性的良好支持,我们正在改变支持它们的方式 以及: 我们决定将对Java8语言特性的支持直接添加到当前的javac和dx工具集中,并反对使用Jack工具链
一旦Jill完全支持Java8,scala的开发将不会受到影响。构建时间可能会增加可用性:只有lambda表达式可用于较旧的Android版本。我猜,最终的最佳解决方案是为Scala编译器提供一个本地Android后端。也许是多蒂的原型。我们已经有了JVM和ECMAScript后端,我们曾经有一个CLI后端,还有一个未完成的LLVM后端。支持多个后端,而且确实存在,我相信Dotty的流线型架构应该会使