2010-09-24 8 views
14

Suivant les listes de diffusion Scala, différentes personnes disent souvent: "le compilateur réécrit ce code [scala] dans ce [java/scala ?? ] "code". Par exemple, à partir de l'un des derniers fils de discussion, si Scala voitComment puis-je voir dans quel code [Java/Scala?] Le compilateur Scala réécrit le code Scala original

class C(i: Int = 4) { ... } 

le compilateur réécrit cela comme (efficace):

class C(i: Int) { ... } 
object C { 
    def init$default$1: Int = 4 
} 

Comment puis-je savoir, quel sera la sortie du compilateur pour mon code? Dois-je décompiler le bytecode résultant pour cela?

+2

compilateur Scala ne pas réécrire le code dans le code Java mais compiler le code Scala en bytecode Java, qui est différent. Peut-être que vous pouvez "reverse engineering" ce bytecode (avec Jad) par exemple, pour obtenir un code source Java. –

+1

Je sais que le compilateur scala [dans certains cas] réécrit le code original. J'ai corrigé maintenant ma question originale. –

Répondre

13

Vous pouvez utiliser "-print" comme option du compilateur, et scalac supprimera toutes les fonctionnalités spécifiques à Scala.

Par exemple, voici le code d'origine:

class Main 
{ 
    def test (x: Any) = x match { 
     case "Hello" => println ("Hello World") 
     case e: String => println ("String") 
     case i: Int => println ("Int") 
     case _ => println ("Something else") 
    } 
} 

Et si vous utilisez "scalac -print" pour le compiler, vous obtiendrez le code suivant Scala.

[[syntax trees at end of cleanup]]// Scala source: Test.scala 
package <empty> { 
    class Main extends java.lang.Object with ScalaObject { 
    def test(x: java.lang.Object): Unit = { 
     <synthetic> val temp1: java.lang.Object = x; 
     if (temp1.==("Hello")) 
     { 
      scala.this.Predef.println("Hello World") 
     } 
     else 
     if (temp1.$isInstanceOf[java.lang.String]()) 
      { 
      scala.this.Predef.println("String") 
      } 
     else 
      if (temp1.$isInstanceOf[Int]()) 
      { 
       scala.this.Predef.println("Int") 
      } 
      else 
      { 
       scala.this.Predef.println("Something else") 
      } 
    }; 
    def this(): Main = { 
     Main.super.this(); 
    () 
    } 
    } 
} 
7

On peut regarder le bytecode généré avec

javap -c -private ClassNameWithoutDotClass 
Questions connexes