这实际上是三个问题,但对我来说它们是紧密相连的。
什么是 Scala 运行时?它只是一个常规的 JVM 和 java-lang 库的类路径吗?我可以在普通 JVM 上运行 Scala 应用程序吗?我应该始终scala-lang.jar与我自己的代码一起部署吗?
这是从哪里来binary compatibility的?这个问题的答案通常听起来像:
不同的 Scala 编译器生成不同的字节码。
但这对我来说解释不了什么。这是否意味着字节码的“接口”发生了变化?例如,更改包含伴生对象实例的字段的名称。如果是的话,为什么不向后兼容呢?是否可以将元数据添加到字节码中?Scala 编译器可以使用它来改变其行为/期望,并为不同版本发出不同的字节码。
什么是 Scala 运行时?
是的,Scala 运行时运行在 JVM 之上,它所需要的只是支持scala-lang.jar库和适当版本的“普通”JVM。Scala 代码被编译为 JVM 字节码。您可以在此处详细了解 Scala 编译器的功能,也可以检查编译阶段。
是的,当您想在 JVM 上运行 Scala 代码时,您应该始终提供scala-lang.jar,但 JVM 并不是运行 Scala 代码所必需的。有些项目(例如Scala Native)允许您在自己的平台上本机运行 Scala 代码,而无需 JVM 或Scala.js允许您在 JavaScript 引擎之上运行它。
二进制(不)兼容性从何而来?
这种(内)兼容性来自(不仅是)Scala 标准库的 ABI 更改(请参阅ABI 版本控制)。已经有一项改进向后二进制兼容性的提案。请参阅此处的详细信息