Scala的编译

Cha*_*nna 1 java jvm scala

任何人都可以告诉我(或表示某些来源)Scala编译的方式.

我有一些疑惑,比如

  • 在编译步骤中,Scala如何编译Java相关的东西?它是否单独使用Java编译器?
  • 最终的字节码是否.scala与Java的.class文件相同?
  • 由于Oracle收购Sun,JVM是否也属于Oracle?
  • 如果有一天JVM获得了专有软件,那么这会影响Scala吗?

And*_*yle 6

如果您愿意,可以查看编译器源代码,尽管首先看一下Martin Odersky关于编译器内部的演示可能会提供更多信息.

在回答您的具体问题时:

  • 是.早期版本scalac不会这样做,并要求您先javac手动运行; 但是scalac可以在2.7.2之后使用javac编译Java文件.
  • 肯定是格式相同.根据您在Scala中的确切操作,它可能不会导致与"等效"事物完全相同的JVM操作,但它完全符合字节码规范(这就是它可以在JVM上运行的原因).
  • 是的,无论您是指JVM规范还是实际的vm实现(JRE下载).
  • 我不确定你所说的"有产权"究竟是什么意思.但我怀疑答案,就你所问的而言,是"不".Scala以标准字节码格式编译为Java类文件.在运行时,使用Scala编写的代码/类与使用Java编写的代码/类之间没有区别.因此,任何从根本上阻止Scala代码在这些JVM上运行的东西也会阻止Java代码运行.

  • 我认为你的第一颗子弹有点误导.`scalac`实际上并没有编译Java源文件 - 我认为它甚至不使用`javac`.`scalac`只对类型检查相关的Java源文件.引用您链接到的博客文章:"但是如果不调用javac,您将只收到已编译的Scala类,_将忽略Java类_(类型检查器除外)." (2认同)

Dan*_*ral 5

  • 在编译步骤中,Scala 如何编译 Java 相关的东西?

Scala 不编译 Java。它对 Java 有足够的了解,可以弄清楚类的 API 是什么,但仅此而已。

  • 它是否单独使用Java编译器?

它希望您使用 java 编译器来编译您的 java 文件。

  • .scala 的最终字节码是否与 Java 的 .class 文件相同?

是的。Scala 生成有效的 .class 文件。但是,无法将该文件转换为 Java 代码,因为有效的类文件允许 Java 不允许或不能表示的内容。

  • 由于Sun被Oracle收购,JVM是否也属于Oracle?

没有“那个”JVM。有许多现有的 JVM,事实上,Oracle 拥有自己专有的 JVM。当然,Sun 的 JVM 现在是 Oracle 的。

  • 如果有一天 JVM 获得了专有软件,这是否也会影响 Scala?

一直以来都有许多专有的 JVM,其中之一来自 Oracle。

让我们考虑一个假设的“最坏情况”场景:世界上所有 JVM 都成为许可(付费)产品或不复存在。当然,Scala 仍然可以在 Dalvik VM 上运行,但我们假设它也已付费或不复存在。

在这种情况下,Scala仍然可以继续存在,但您必须付费才能运行使用 Scala 编译的程序。事实上,由于 Scala 是一个 JVM 程序,你甚至需要付费才能使用编译器!

或者,Scala 可以扩展到其他一些目标平台。现在 Scala 有这样的努力,但绝对没有压力使它们成为生产级。如果有必要,它会完成。