Что в действительности происходит за Scala runtime/REPL при запуске программы.scala?
Когда я запускаю что-то вроде следующего из командной строки, что на самом деле происходит?
> scala hello.scala
Существует ли класс hello.class, сгенерированный, выполненный и затем отброшенный? Или Скала ведет себя как-то как переводчик в этом случае? Я просто думаю, что, конечно, я не могу сделать то же самое для Java:
> java hello.java
1 ответ
Да, есть сгенерированный 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: существует ли класс по умолчанию, если класс не определен? для получения дополнительной информации (это действительно переписывается, компилируется и оценивается).