स्केला में पैटर्न मिलान किस प्रकार बाइटकोड स्तर पर लागू किया जाता है?


123

स्केला में पैटर्न मिलान किस प्रकार बाइटकोड स्तर पर लागू किया जाता है?

क्या यह if (x instanceof Foo)निर्माणों की एक श्रृंखला की तरह है , या कुछ और है? इसके प्रदर्शन के निहितार्थ क्या हैं?

उदाहरण के लिए, निम्न कोड ( उदाहरण के लिए स्कैला से पृष्ठ 46-48) को evalदेखते हुए, विधि के लिए समकक्ष जावा कोड कैसा दिखेगा?

abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr

def eval(e: Expr): Int = e match {
  case Number(x) => x
  case Sum(l, r) => eval(l) + eval(r)
}

PS मैं जावा बाइटकोड को पढ़ सकता हूं, इसलिए मेरे लिए एक बायटेकोड प्रतिनिधित्व काफी अच्छा होगा, लेकिन शायद अन्य पाठकों के लिए यह जानना बेहतर होगा कि यह जावा कोड के रूप में कैसा दिखेगा।

पीपीएस क्या स्काला में प्रोग्रामिंग करने वाले इस का जवाब देते हैं और इसी तरह के सवालों के बारे में बताते हैं कि स्काला कैसे लागू किया जाता है? मैंने पुस्तक का आदेश दिया है, लेकिन यह अभी तक नहीं आया है।


आप केवल उदाहरण संकलित क्यों नहीं करते हैं और इसे जावा बाइटकोड डिस्सेम्बलर के साथ जोड़ते हैं?
ज़िफरे

मैं शायद ऐसा करूँगा, जब तक कि कोई पहले अच्छा जवाब न दे। लेकिन अभी मैं कुछ नींद लेना चाहता हूं। ;)
एस्को लुओटोला

27
प्रश्न अन्य पाठकों के लिए उपयोगी है!
djondal

1
@ डोंडल: यह कहने का सबसे अच्छा तरीका यह है कि सवाल को
आगे बढ़ाना है

जवाबों:


96

निम्न स्तर की खोज एक डिस्सेम्बलर के साथ की जा सकती है, लेकिन संक्षिप्त उत्तर यह है कि यह एक विस्तृत विवरण है, जहां / जहां भविष्यवाणी होती है, वह पैटर्न पर निर्भर करता है

case Sum(l,r) // instance of check followed by fetching the two arguments and assigning to two variables l and r but see below about custom extractors 
case "hello" // equality check
case _ : Foo // instance of check
case x => // assignment to a fresh variable
case _ => // do nothing, this is the tail else on the if/else

बहुत कुछ है जो आप "केस फू (45, x)" जैसे पैटर्न या संयोजनों जैसे पैटर्न के साथ कर सकते हैं, लेकिन आम तौर पर जो मैंने अभी वर्णित किया है, उसके तार्किक विस्तार हैं। पैटर्न में गार्ड भी हो सकते हैं, जो कि विधेय पर अतिरिक्त बाधाएं हैं। ऐसे मामले भी हैं जहां कंपाइलर पैटर्न मिलान का अनुकूलन कर सकता है, उदाहरण के लिए जब मामलों के बीच कुछ ओवरलैप होता है तो यह कुछ हद तक चीजों को समेट सकता है। उन्नत पैटर्न और अनुकूलन कंपाइलर में काम का एक सक्रिय क्षेत्र है, इसलिए स्केला के वर्तमान और भविष्य के संस्करणों में इन बुनियादी नियमों पर बाइट कोड में काफी सुधार होने पर आश्चर्यचकित न हों।

इन सब के अलावा, आप अपने स्वयं के कस्टम एक्सट्रैक्टर्स को भी लिख सकते हैं या केस क्लासेस के लिए स्काला द्वारा उपयोग किए गए डिफ़ॉल्ट के बजाय। यदि आप करते हैं, तो पैटर्न मैच की लागत जो कुछ भी चिमटा करता है उसकी लागत है। Http://lamp.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf में एक अच्छा अवलोकन पाया गया है


मेरा मानना ​​है कि यह वर्तमान लिंक है: infoscience.epfl.ch/record/98468/files/…
greenoldman

78

जेम्स (ऊपर) ने इसे सबसे अच्छा कहा। हालांकि, यदि आप उत्सुक हैं तो हमेशा असंतुष्ट बाइटकोड को देखने के लिए एक अच्छा व्यायाम है। आप विकल्प के scalacसाथ भी आह्वान कर सकते हैं -print, जो आपके प्रोग्राम को हटाए गए सभी स्कैला-विशिष्ट विशेषताओं के साथ प्रिंट करेगा। यह मूल रूप से स्काला के कपड़ों में जावा है। यहाँ scalac -printआपके द्वारा दिए गए कोड स्निपेट के लिए प्रासंगिक आउटपुट है:

def eval(e: Expr): Int = {
  <synthetic> val temp10: Expr = e;
  if (temp10.$isInstanceOf[Number]())
    temp10.$asInstanceOf[Number]().n()
  else
    if (temp10.$isInstanceOf[Sum]())
      {
        <synthetic> val temp13: Sum = temp10.$asInstanceOf[Sum]();
        Main.this.eval(temp13.e1()).+(Main.this.eval(temp13.e2()))
      }
    else
      throw new MatchError(temp10)
};

34

2.8 संस्करण के बाद से, स्काला में @switch एनोटेशन है। लक्ष्य यह सुनिश्चित करना है, कि पैटर्न मिलान को सशर्त बयानों की श्रृंखला के बजाय टेबलस्विच या लुकअपस्विच में संकलित किया जाएगा if


6
जब नियमित रूप से अन्य पर @switch चुनने के लिए कब?
अरविंद यारम

2
@switchनियमित रूप से मिलान की तुलना में उपयोग करना अधिक कुशल है। इसलिए यदि सभी मामलों में निरंतर मान होते हैं, तो आपको हमेशा उपयोग करना चाहिए @switch(क्योंकि बायटेकोड कार्यान्वयन switchकई के बजाय जावा के समान होगा-और)
लेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.