scala - 什么是 Scala 运行时、二进制兼容性以及如何部署 Scala 应用程序?

标签 scala jvm

这实际上是三个问题,但对我来说,它们是紧密相连的。

  • 什么是 Scala 运行时? 它只是一个常规的 JVM 和 java-lang 库的类路径吗?我可以在普通的 JVM 上运行 Scala 应用程序吗?我是否应该一直部署 scala-lang.jar连同我自己的代码?
  • 那在哪里binary compatibility 来自?这个问题的答案通常听起来像:

  • Different Scala compilers produce different bytecode.



    但这对我来说解释不多。这是否意味着字节码的“接口(interface)”发生了变化?例如,更改包含伴随对象实例的字段的名称。如果是,那么为什么没有向后兼容性?是否可以将元数据添加到字节码? Scala 编译器可以使用它来改变其行为/期望并为各种版本发出不同的字节码。
  • 为多个 Scala 版本交叉编译的库是否意味着使用 Java 中的库需要每个版本都有自己的互操作性?
  • 最佳答案

    什么是 Scala 运行时?

    是的,Scala 运行时运行在 JVM 之上,它所需要的只是支持 scala-lang.jar库和适当版本的“普通”JVM。 Scala 代码被编译为 JVM 字节码。您可以了解更多关于 Scala 编译器的功能 here或者你可以检查编译phases .

    是的,当您想在 JVM 上运行 Scala 代码时,您应该始终提供 scala-lang.jar ,但 JVM 并不是运行 Scala 代码所必需的。有像 Scala native 这样的项目允许您在没有 JVM 或 Scala.js 的平台上本地运行 Scala 代码允许您在 JavaScript 引擎之上运行它。

    这种二进制(不)兼容性从何而来?

    这种(非)兼容性来自(不仅是)Scala 标准库的 ABI 的变化(参见 ABI versioning)。已经有一个改进向后二进制兼容性的提议。查看详情here

    关于scala - 什么是 Scala 运行时、二进制兼容性以及如何部署 Scala 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46685413/

    相关文章:

    assembly - 为什么热点生成的编译方法在执行前将 eax 存储在堆栈中?

    scala - Scala 中的整数分区

    scala - Scala 类 : recursive method printExpr needs result type 上的错误

    scala - Scala中,Future[Option[A]]如何进行类型转换?

    scala - 知道 Scala 对象是否是 Case Class 的实例

    java - Java 中的尾调用优化

    java - System.getProperty ("key") 从哪里(哪个属性文件)读取?

    scala - sbt 究竟是如何计算出任务名称的?

    java - JVMJ9VM007E 命令行选项无法识别 : -javaagent

    java - 为什么线程池中执行大量Runnable时内存占用会增加?