为什么我可以使用“java -cp scala-library.jar;。Hello World”启动Scala编译器?

时间:2013-06-25 14:04:58

标签: java scala

我知道scala是建立在java之上的,你可以在scala中编写java代码并执行它。但是当我查看scala的source code时,我找不到任何java文件。 我会理解编译器是用Java构建的,你现在可以使用与Java没有相似之处的语法。但我找不到任何。

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

4 个答案:

答案 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放在类路径上。

enter image description here

答案 1 :(得分:0)

简短版本:你没有使用java编译器,你正在使用java运行时。

长版:javacjava之间存在很大差异。 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编译器(或任何编译器)的方式,出于所有实际目的,即使你有源代码也无法察觉:

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