0

グルーヴィー

Groovy には というコンパイラが付属していgroovycます。スクリプトごとに、 Java が実行できるように main メソッドを含むgroovycを拡張するクラスを生成します。groovy.lang.Scriptコンパイルされたクラスの名前は、コンパイルされるスクリプトの名前と一致します。

たとえば、次のHelloWorld.groovyスクリプトを使用します。

println "Hello World"

それは次のコードのようになります。

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

スカラ

Scala には というコンパイラが付属していscalacます。

たとえば、同じHelloWorld.scalaスクリプトを使用すると、次のようになります。

println("Hello World")

scalacコンパイラはクラスまたはオブジェクトの定義を予期していましたが、Scala REPL インタープリターで機能するため、コードは に対して有効ではありません。どのように可能ですか?実行前にクラスにラップされていますか?

4

3 に答える 3

6

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()
      }
    }
  }
}
于 2012-03-19T17:42:34.633 に答える
2

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")と、基本的にオブジェクトでラップされ(上で見た最初の形式に変換されます)、コンパイルされ、フードの下で実行されます。

(コードは Java の Hello World コンソール アプリケーションと非常によく似ていますが) コンパイルされたプログラムは、この 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");
    }
}
于 2012-03-19T17:39:15.447 に答える
1

でファイルを正常にコンパイルしたら、Java クラス ファイル逆アセンブラscalacを使用javapして、生成されたクラスとメソッドのシグネチャを表示できます (編集: コードではなく生成されたシグネチャであることを指摘してくれた @Luigi に感謝します)。つまり、scalac HelloWorld.scalaが続きjavap HelloWorldます。

于 2012-03-19T17:39:19.677 に答える