Что на самом деле происходит за Scala runtime / REPL при запуске программы .scala? - PullRequest
18 голосов
/ 05 октября 2011

Когда я запускаю что-то вроде следующего из командной строки, что на самом деле происходит?

> scala hello.scala

Существует ли класс hello.class, сгенерированный, выполненный и затем отброшенный? Или Скала ведет себя как-то как переводчик в этом случае? Я просто думаю, что, конечно, я не могу сделать то же самое для Java:

> java hello.java

1 Ответ

23 голосов
/ 05 октября 2011

Да, генерируется класс 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: существует ли класс по умолчанию, если класс не определен? для получения дополнительной информации (он действительно переписывается, компилируется и оценивается).

...