2010-09-24 18 views
14

स्केल मेलिंग सूचियों के बाद फिर से लिखता है, अलग-अलग लोग अक्सर कहते हैं: "कंपाइलर इस [जावा/स्कैला] में इस [स्कैला] कोड को फिर से लिखता है ?? ] कोड "।मैं कैसे देख सकता हूं [जावा/स्कैला?] कोड स्कैला कंपाइलर मूल स्केल-कोड

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

मैं यह कैसे पता कर सकते हैं, क्या संकलक उत्पादन होगा: उदाहरण के लिए, नवीनतम धागे में से एक से, अगर स्काला

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

तो संकलक के रूप में (प्रभावी रूप से) इस पुनर्लेखन देखता है मेरा कोड? क्या मुझे इसके परिणामस्वरूप बाइटकोड को डिकंपाइल करना चाहिए?

+2

स्काला संकलक के साथ उत्पन्न बाईटकोड को देखने के जावा कोड में कोड को फिर से लिखने नहीं करता, लेकिन जावा बाईटकोड है, जो अलग है में स्काला कोड संकलन कर सकते हैं। हो सकता है कि आप जावा बाइट कोड प्राप्त करने के लिए उदाहरण के लिए इस बाइटकोड (जाड के साथ) "रिवर्स इंजीनियर" कर सकें। –

+1

मुझे पता है कि स्कैला कंपाइलर [कुछ मामलों में] मूल कोड को फिर से लिखता है। मैंने अब अपना मूल प्रश्न सही कर दिया है। –

उत्तर

13

आप "-प्रिंट" का उपयोग कंपाइलर विकल्प के रूप में कर सकते हैं, और स्केलैक सभी स्कैला-विशिष्ट विशेषताओं को हटा देगा।

उदाहरण के लिए, यहाँ मूल कोड है:

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

और अगर आप "scalac प्रिंट" का उपयोग यह संकलित करने के लिए, आप निम्न स्काला कोड मिल जाएगा।

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

एक

javap -c -private ClassNameWithoutDotClass 
संबंधित मुद्दे