2010-09-24 19 views
14

Seguendo le mailing list di Scala, diverse persone spesso dicono: "il compilatore riscrive questo codice [scala] in questo [java/scala ?? ] codice". Ad esempio, da uno dei tutte le discussioni, se Scala vedeCome posso vedere in quale codice [Java/Scala?] Il compilatore Scala riscrive il codice Scala originale

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

poi il compilatore riscrive questo come (efficace):

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

Come faccio a sapere, quale sarà l'output del compilatore per il mio codice? Dovrei decompilare il bytecode risultante per quello?

+2

Scala compilatore non riscrivere il codice in codice Java, ma compilare il codice Scala in bytecode Java, che è diverso. Forse puoi "decodificare" questo bytecode (con Jad) per esempio, per ottenere un codice sorgente Java. –

+1

So che il compilatore di scala [in alcuni casi] riscrive il codice originale. Ho corretto ora la mia domanda originale. –

risposta

13

È possibile utilizzare "-print" come opzione del compilatore e scalac rimuoverà tutte le funzionalità specifiche di Scala.

Per esempio, ecco il codice originale:

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") 
    } 
} 

E se si utilizza "scalac -print" per compilarlo, si otterrà il seguente codice 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

Si può guardare il bytecode generato con

javap -c -private ClassNameWithoutDotClass 
Problemi correlati