编译Scala脚本.Scala脚本的工作原理如何?

Art*_*ero 0 groovy scala jvm-languages scalac scala-script

Groovy的

Groovy带有一个名为的编译器groovyc.对于每个脚本,groovyc生成一个扩展的类groovy.lang.Script,其中包含一个main方法,以便Java可以执行它.已编译类的名称与正在编译的脚本的名称相匹配.

例如,使用此HelloWorld.groovy脚本:

println "Hello World"
Run Code Online (Sandbox Code Playgroud)

这就像这段代码:

class HelloWorld extends Script {
    public static void main(String[] args) {
        println "Hello World"
    }
}
Run Code Online (Sandbox Code Playgroud)

斯卡拉

Scala带有一个名为的编译器scalac.

例如,使用相同的HelloWorld.scala脚本:

println("Hello World")
Run Code Online (Sandbox Code Playgroud)

代码无效scalac,因为编译器期望类或对象定义,但在Scala REPL Interpreter中工作.怎么可能?在执行之前它是否包含在类中?

kir*_*uku 5

Scala-Script中的代码首先放在Scala对象中,然后编译为JVM-Bytecode,最后执行.您可以通过编写scala -Xprint:parser my_file.scala以下内容来查看生成的Scala对象:

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("hello world")
        };
        new $anon()
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)