运行“.scala”程序时,Scala运行时/ REPL背后真的发生了什么?

时间:2011-10-04 23:26:13

标签: scala read-eval-print-loop

当我从命令行运行类似下面的内容时,实际发生了什么?

> scala hello.scala

是否有生成,执行然后丢弃的hello.class?或者Scala在这种情况下表现得像某个解释器?我只是想,当然,我不能对Java做同样的事情:

> java hello.java

1 个答案:

答案 0 :(得分:23)

是的,生成了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?(它正在被重写,编译和评估)。