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

Adr*_*ian 18 scala read-eval-print-loop

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

> scala hello.scala
Run Code Online (Sandbox Code Playgroud)

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

> java hello.java
Run Code Online (Sandbox Code Playgroud)

huy*_*hjl 23

是的,生成了hello.class.编译器将你的代码包装在一个Main对象中,编译然后执行Main.main,给出hello.scala

println(args.mkString)
println(argv.mkString)
Run Code Online (Sandbox Code Playgroud)

如果使用-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()
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后编译这段代码(我相信一个内存文件系统 - 但我不确定)并执行.看ScriptRunner,我看到在默认的临时文件夹下创建了一个临时目录.比如查看我的系统,我看到了一堆%TEMP%/scalascript*文件夹.

请注意,即使在解释器中,也不会解释代码.请参阅Scala:如果没有定义类,是否有默认类?了解更多信息(它真的被重写,编译和评估).