Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jack(javaandroid编译器工具包)将如何影响Scala开发人员_Android_Scala_Java 8 - Fatal编程技术网

Jack(javaandroid编译器工具包)将如何影响Scala开发人员

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

现在,随着谷歌的宣布,Java与Android的可预见未来变得清晰起来。但这对Scala和其他基于JVM的语言开发人员有什么影响呢。特别是:

  • Scala之所以如此神奇,是因为它有自己的编译器来生成Java字节码。生成的字节码是否会获得Jack处理的任何优化好处
  • 从Scala 12开始,只支持Java 8+。也就是说,生成的字节码也是Java8+。Jack能否利用Java8字节码(没有或有限制)
  • 新支持的Java8功能是否可以用于开发较旧的Android版本(minSdkVersion<'N')或者我应该为每个Java版本维护单独的分支?(从文件中看不清楚)
  • 所有这些问题归结为一个问题:Scala能否在未来用于Android开发,而不牺牲新Scala功能和新Android工具链的好处

    相关阅读:

    请在评论或答案中分享相关链接

    相关问题:

    相关的:

    请投票支持千斤顶工具功能请求:


    编辑:

    我试图对我的问题进行推理(而不是回答),希望如果我错了,专家会纠正我。

    下面是一个假设的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开发人员站在同一条船上。


    Joan是正确的,但我认为Jill在某个时候会支持Java 8,否则就不可能在android应用程序使用的android库中使用Java 8,因为他们将代码打包在aar中的jar文件中,我看不到这种格式很快会发生变化。无论如何,我们只能猜测,因为谷歌目前在这些变化方面是一个黑盒子


    自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的流线型架构应该会使