我知道scala是建立在java之上的,你可以在scala中编写java代码并执行它。但是当我查看scala的source code时,我找不到任何java文件。 我会理解编译器是用Java构建的,你现在可以使用与Java没有相似之处的语法。但我找不到任何。
那么为什么我可以使用java编译器来运行scala程序呢?
答案 0 :(得分:4)
如果你的意思是你可以在.scala文件中使用java语法,那么你无法在scala 中逐字地编写java代码,但是scalac能够识别.java文件并选择javac进行编译。大多数jvm语言,如java,scala,groovy,clojure等都被编译为相同的字节码,因此JVM根本不知道代码是用一种语言还是另一种语言编写的。
为什么我可以使用java编译器来运行scala程序
你做不到。 Java编译器只是从java语言到java字节码的翻译器。关键是java虚拟机只能运行字节码(通用语言,类似于汇编语言),scala被转换为这个通用字节码(下图中的类文件取自there)。但与此同时,scala程序通常需要一些依赖项(例如scala集合库和一大堆不同的apis),因此你必须将scala-library jar放在类路径上。
答案 1 :(得分:0)
简短版本:你没有使用java编译器,你正在使用java运行时。
长版:javac
和java
之间存在很大差异。 javac
是java编译器,它接收java源代码并输出jvm字节码。 java
是java运行时,它接受jvm字节码并运行它。
但是关于jvm的一个好处就是你可以为它生成字节码。 Scala生成jvm字节码,没有任何java源代码。
答案 2 :(得分:0)
scala库假设有一个带有Main-Class属性的META-INF / MANIFEST.MF。那个(jvm)主类是scala运行scala单例。
答案 3 :(得分:0)
嗯,大概是第一批Scala编译器实际上是用Java编写的。但是,一旦创建了第一个基本的Scala编译器,编译器的后续版本就可以在Scala中100%编写,使用早期的Scala编译器来构建它们。
这是一个名为“引导”的过程。同样的方法解释了为什么gcc可以完全用C语言编写(我不是说它是,但可能是)。
Ken Thompson撰写了一篇引人入胜的文章,称为“信任信任的反思”,它解释了如何以一种方式永久地破解C编译器(或任何编译器)的方式,出于所有实际目的,即使你有源代码也无法察觉: