当我从命令行运行以下类似内容时,实际上会发生什么?
> scala hello.scala
Scala会生成一个hello.class文件,执行完之后会被丢弃吗?还是在这种情况下Scala会像解释器一样运行?我的意思是,当然,对于Java我不能做同样的事情:
> java hello.java
当我从命令行运行以下类似内容时,实际上会发生什么?
> scala hello.scala
Scala会生成一个hello.class文件,执行完之后会被丢弃吗?还是在这种情况下Scala会像解释器一样运行?我的意思是,当然,对于Java我不能做同样的事情:
> java hello.java
是的,确实生成了hello.class文件。编译器将你的代码放在一个Main
对象内部进行编译,然后执行Main.main
,假设hello.scala是:
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?(它的确正在被重写、编译和评估)。
Main $
,而不是实际叫做hello.class
。我理解这个问题是,是否有一个编译、运行和丢弃的类?并不是特别指它是否叫做hello.class
... - huynhjlSystem.getProperty("java.io.tmpdir")
。请参见https://github.com/scala/scala/blob/2.10.1/src/compiler/scala/tools/nsc/ScriptRunner.scala#L105。该目录会在脚本退出时被清理。 - huynhjl