当我从命令行运行类似下面的内容时,实际发生了什么?
> scala hello.scala
是否有生成,执行然后丢弃的hello.class?或者Scala在这种情况下表现得像某个解释器?我只是想,当然,我不能对Java做同样的事情:
> java hello.java
答案 0 :(得分:23)
是的,生成了hello.class。编译器将您的代码包装在Main
对象中,编译然后执行Main.main
,给出
println(args.mkString)
println(argv.mkString)
如果您使用-Xprint:parser
选项运行:scala -Xprint:parser hello.scala foo bar
,您将看到如何重写代码:
package <empty> {
object Main extends scala.ScalaObject {
def <init>() = {
super.<init>();
()
};
def main(argv: Array[String]): scala.Unit = {
val args = argv;
{
final class $anon extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
println(args.mkString);
println(argv.mkString)
};
new $anon()
}
}
}
}
然后编译这段代码(我相信一个内存文件系统 - 但我不确定)并执行。查看ScriptRunner
,我看到在默认的临时文件夹下创建了一个临时目录。例如,查看我的系统,我看到了一堆%TEMP%/scalascript*
个文件夹。
请注意,即使在解释器中,也不会解释代码。有关详细信息,请参阅Scala: Is there a default class if no class is defined?(它正在被重写,编译和评估)。