2010-09-24 17 views
14

Según las listas de correo de Scala, muchas personas dicen: "el compilador reescribe este código [scala] en este [java/scala ?? ] código ". Por ejemplo, de uno de los temas, si Scala ve¿Cómo puedo ver en qué código de [Java/Scala?] El compilador Scala reescribe el código Scala original

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

entonces el compilador reescribe esto como (efectiva):

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

¿Cómo puedo saber, ¿cuál será la salida del compilador para ¿mi código? ¿Debo descompilar el bytecode resultante para eso?

+2

Scala compilador no volver a escribir el código en el código Java, pero compilar el código Scala en bytecode de Java, que es diferente. Quizás pueda "aplicar ingeniería inversa" a este bytecode (con Jad) por ejemplo, para obtener un código fuente Java. –

+1

Sé que el compilador scala [en algunos casos] reescribe el código original. He corregido ahora mi pregunta original. –

Respuesta

13

Puede usar "-print" como opción del compilador, y scalac eliminará todas las funciones específicas de Scala.

Por ejemplo, aquí es el código original:

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

Y si utiliza "-print scalac" para compilarlo, recibirá el siguiente código 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

Uno puede mirar el código de bytes generado con

javap -c -private ClassNameWithoutDotClass 
Cuestiones relacionadas