Компиляция скриптов Scala. Как работает скрипт Scala? - PullRequest
0 голосов
/ 19 марта 2012

Groovy

Groovy поставляется с компилятором groovyc.Для каждого сценария groovyc генерирует класс, который расширяет groovy.lang.Script, который содержит метод main, чтобы Java могла его выполнять.Имя скомпилированного класса совпадает с именем компилируемого скрипта.

Например, с этим HelloWorld.groovy script:

println "Hello World"

Это становится чем-то вроде этого кода:

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

Scala

Scala поставляется с компилятором scalac.

Например, с тем же сценарием HelloWorld.scala:

println("Hello World")

код недопустим для scalac, поскольку компилятор ожидал определения класса или объекта, но работает в интерпретаторе Scala REPL.Как это возможно?Оборачивается ли он в классе перед выполнением?

Ответы [ 3 ]

5 голосов
/ 19 марта 2012

Код в Scala-Script сначала помещается в объект Scala, затем компилируется в JVM-Bytecode и, наконец, выполняется.Вы можете увидеть сгенерированный объект Scala, написав scala -Xprint:parser my_file.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()
      }
    }
  }
}
2 голосов
/ 19 марта 2012

scalac скомпилирует ваш код в байт-код Java.println("Hello World") сама по себе не является действительной программой scala, поэтому scalac не скомпилирует ее.Вы можете сделать:

object Test extends App {
  println("Hello World")
}

или

object Test {
  def main(args: Array[String]) {
    println("Hello World")
  }
}

Затем вы можете запустить вывод с помощью scala Test.Запуск «интерпретатора» scala для файла, который содержит только строку println("Hello World"), в основном обернет его в объект (превратив его в первую форму, которую мы видели выше), скомпилирует его и запустит для вас изнутри.

Обратите внимание, что (хотя код выглядит очень похоже на консольное приложение Hello World на языке java), полученная скомпилированная программа не - это то же самое, что было бы результатом компиляции этого java

/*  note: this is Java code */
/* this does NOT compile to the same bytecode as the previous scala example*/
public class Test {
    public static void main (String args[]) {
        System.out.println ("Hello World");
    }
}
1 голос
/ 19 марта 2012

Как только вы успешно скомпилируете файл с scalac, вы можете использовать javap, дизассемблер файлов классов Java, для просмотра сгенерированных сигнатур класса и метода (Edit: спасибо @Luigi за указание на то, что он генерирует сигнатуры не код) То есть scalac HelloWorld.scala, за которым следует javap HelloWorld.

...