实际上这是三个问题,但对我而言,它们紧密相连。
什么是Scala运行时?它只是一个常规JVM和java-lang库的类路径吗?我可以在普通的JVM上运行Scala应用程序吗?我是否应该始终将scala-lang.jar
与我自己的代码一起部署?
binary compatibility
来自哪里?这个问题的答案通常听起来像是:
不同的Scala编译器生成不同的字节码。
但这对我来说并不多。这是否意味着字节码的“接口”发生了变化?例如,更改包含伴随对象实例的字段的名称。如果是,那为什么没有向后兼容性?是不是可以在字节码中添加元数据? Scala编译器可以使用它来改变其行为/期望,并为各种版本发出不同的字节码。
答案 0 :(得分:3)
什么是Scala运行时?
是的,Scala运行时在JVM之上运行,它所需要的只是支持scala-lang.jar
库和"简单的"适当版本的JVM。 Scala代码被编译为JVM字节码。您可以更多地了解Scala编译器执行的操作here,或者您可以检查编译phases。
是的,当您想在JVM上运行Scala代码时,您应始终提供scala-lang.jar
,但运行Scala代码并不是必需的JVM。像Scala native这样的项目允许您在没有JVM的平台上本机运行Scala代码,或Scala.js允许您在JavaScript引擎的顶部运行它。
二进制(in-)兼容性来自哪里?
此(in-)兼容性来自(不仅)Scala标准库的ABI更改(请参阅ABI versioning)。已经提出了改进后向二进制兼容性的建议。查看详细信息here
答案 1 :(得分:1)
Scala编译实际上是将Scala源代码转换为Java 字节码并包含 scala-library 。
因此,在纯 JVM 中部署 Scala 时,需要像其他依赖项一样包含 scala-library.jar 。
对于二进制兼容性,这意味着 Scala 2.12.2 二进制兼容与 Scala 2.12.1 ,和项目是用 Scala 2.12.1 编译的,你不需要用 Scala 2.12.2 重新编译项目,它可以直接用 Scala 2.12运行.2 库。并且它意味着如果项目具有在 Scala 2.12.1 中编译的依赖项,则可以在 Scala 2.12.2 中安全地使用它。
参考:http://docs.scala-lang.org/overviews/core/binary-compatibility-of-scala-releases.html