2010-09-24 15 views
14

Aşağıdaki Scala posta listelerini takip eden farklı kişiler sık ​​sık şunu söylüyor: "derleyici bu [scala] kodunu bu [scala] kodunu yeniden [java/scala ?? ] kod ". için derleyici çıkışı ne olacağını ben, nasıl öğrenebilirimScala derleyicisinin orijinal Scala kodunun yeniden yazdığı Scala derleyicisinin ne yaptığını nasıl görebilirim?

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

: Örneğin, son parçacığı birinden Scala

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

sonra derleyici (etkili) olarak yeniden yazar görürse benim kodum Bunun için ortaya çıkan bayt kodunu koymalı mıyım?

+2

Scala derleyici ile oluşturulan bayt bakabilirsiniz. Belki bir Java kaynak kodu almak için bu bayt kodunu (Jad ile) "tersine mühendislik" edebilirsiniz. –

+1

Scala derleyicisinin [bazı durumlarda] orijinal kodu yeniden yazdığını biliyorum. Şimdi asıl sorumu düzeltdim. –

cevap

13

"-print" öğesini derleyici seçeneği olarak kullanabilirsiniz ve scalac, Scala'ya özgü tüm özellikleri kaldırır.

Örneğin, aşağıda orijinal kod şudur:

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

Ve bunu derlemek için "scalać -Baskı" kullanırsanız, aşağıdaki Scala kodu alırsınız.

[[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

Bir Java koduna yeniden yazmak ama farklı Java byte, içine Scala kodunu derlemek değil

javap -c -private ClassNameWithoutDotClass