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

Другие вопросы по тегам