0

我确实了解 scala 是建立在 java 之上的,您可以在 scala 中编写 java 代码并执行它。但是当我查看 scala 的源代码时,我找不到任何 java 文件。如果编译器是用 Java 构建的,我会理解的,您现在可以使用与 Java 没有相似之处的语法。但我找不到任何东西。

那么为什么我可以使用 java 编译器来运行 scala 程序呢?

4

4 回答 4

4

如果您的意思是您可以在 .scala 文件中使用 java 语法,那么您不能在 scala 中真正编写 java 代码,但是 scalac 能够识别 .java 文件并选择 javac 进行编译。大多数 jvm 语言,如 java、scala、groovy、clojure 等都被编译为相同的字节码,因此 JVM 根本不知道代码是用一种语言还是另一种语言编写的。

为什么我可以使用 java 编译器来运行 scala 程序

你不能。Java 编译器只是从 Java 语言到 Java 字节码的翻译器。关键是java虚拟机只能运行字节码(通用语言,看起来类似于汇编),而scala被翻译成这个通用字节码(下图中的类文件取自那里)。但同时,scala 程序通常需要一些依赖项(例如 scala 集合库和一大堆不同的 api),因此您必须将 scala-library jar 放在类路径上)。

在此处输入图像描述

于 2013-06-25T14:10:32.483 回答
0

简短版本:您没有使用 java 编译器,而是使用 java 运行时。

javac长版:和之间有很大区别javajavac是java编译器,它接收java源代码并输出jvm字节码。java是 java 运行时,它接受 jvm 字节码并运行它。

但是 jvm 的一大优点是您可以以任何方式为其生成字节码。Scala 在没有任何 java 源代码的情况下生成 jvm 字节码。

于 2013-06-25T14:10:15.047 回答
0

scala 库假定有一个带有 Main-Class 属性的 META-INF/MANIFEST.MF。那个(jvm)主类是运行scala单例的scala。

于 2013-06-25T14:12:14.947 回答
0

好吧,大概最早的 Scala 编译器实际上是用 Java 编写的。但是,一旦创建了第一个基本的 Scala 编译器,编译器的后续版本就可以 100% 用 Scala 编写,使用早期的 Scala 编译器来构建它们。

这是一个称为“引导”的过程。相同的方法解释了为什么 gcc 可以完全用 C 编写(我不是说它是,但它可能是)。

Ken Thompson 有一篇引人入胜的文章,名为“对信任信任的反思”,它解释了如何永久破解 C 编译器(或任何编译器),即使您有源代码:

http://dl.acm.org/citation.cfm?doid=358198.358210

于 2013-06-25T14:14:29.390 回答