निस्सरण विश्लेषण: Difference between revisions

From Vigyanwiki
(Created page with "{{Refimprove|date=August 2013}} संकलक अनुकूलन में, एस्केप एनालिसिस सूचक (कंप्यूटर प...")
 
No edit summary
Line 1: Line 1:
{{Refimprove|date=August 2013}}
[[संकलक अनुकूलन]] में, निस्सरण विश्लेषण के गत्यात्मक विस्तार को निर्धारित करने की एक विधि है{{snd}} जहां क्रमादेश में एक संकेतक को अभिगमन किया जा सकता है। यह [[सूचक विश्लेषण]] और [[आकार विश्लेषण (कार्यक्रम विश्लेषण)]] से संबंधित है।
[[संकलक अनुकूलन]] में, एस्केप एनालिसिस [[सूचक (कंप्यूटर प्रोग्रामिंग)]] के डायनेमिक स्कोप को निर्धारित करने की एक विधि है{{snd}} जहां प्रोग्राम में एक पॉइंटर को एक्सेस किया जा सकता है। यह [[सूचक विश्लेषण]] और [[आकार विश्लेषण (कार्यक्रम विश्लेषण)]] से संबंधित है।


जब एक चर (या एक वस्तु) एक उपनेमका में आवंटित किया जाता है, चर के लिए एक सूचक (कंप्यूटर प्रोग्रामिंग) निष्पादन के अन्य थ्रेड (कंप्यूटर विज्ञान) या [[सबरूटीन]]्स को कॉल करने के लिए बच सकता है। यदि कोई कार्यान्वयन [[टेल कॉल]] ऑप्टिमाइज़ेशन (आमतौर पर [[कार्यात्मक प्रोग्रामिंग]] के लिए आवश्यक) का उपयोग करता है, तो ऑब्जेक्ट्स को सबरूटीन्स से बचने के रूप में भी देखा जा सकता है। यदि कोई भाषा प्रथम श्रेणी की निरंतरता का समर्थन करती है (जैसा कि [[योजना (प्रोग्रामिंग भाषा)]] और [[न्यू जर्सी के मानक एमएल]]) करते हैं, तो [[कॉल स्टैक]] के भाग भी बच सकते हैं।
जब एक चर (या एक वस्तु) एक उपनेमका में आवंटित किया जाता है, चर के लिए एक सूचक (संगणक क्रमादेशन) निष्पादन के अन्य थ्रेड (संगणक विज्ञान) या [[Index.php?title=उपनेमिका|उपनेमिका]] को आह्वान करने के लिए बच सकता है। यदि कोई कार्यान्वयन [[टेल कॉल]] इष्टतमीकरण (आमतौर पर [[Index.php?title=कार्यात्मक क्रमादेशन|कार्यात्मक क्रमादेशन]] के लिए आवश्यक) का उपयोग करता है, तो उद्देश्य को उपनेमिका से बचने के रूप में भी देखा जा सकता है। यदि कोई भाषा प्रथम श्रेणी की निरंतरता का समर्थन करती है (जैसा कि [[Index.php?title=योजना (क्रमादेशन भाषा)|योजना (क्रमादेशन भाषा)]] और [[न्यू जर्सी के मानक एमएल]]) करते हैं, तो [[कॉल स्टैक]] के भाग भी बच सकते हैं।


यदि एक उपनेमका एक वस्तु आवंटित करता है और इसके लिए एक सूचक लौटाता है, तो वस्तु को कार्यक्रम में अनिर्धारित स्थानों से पहुँचा जा सकता है{{snd}} सूचक भाग गया है। पॉइंटर्स भी बच सकते हैं यदि वे वैश्विक चर या अन्य डेटा संरचनाओं में संग्रहीत हैं, जो बदले में, वर्तमान प्रक्रिया से बच जाते हैं।
यदि एक उपनेमका एक वस्तु आवंटित करता है और इसके लिए एक सूचक लौटाता है, तो वस्तु को कार्यक्रम में अनिर्धारित स्थानों से पहुँचा जा सकता है{{snd}} सूचक निस्सरण है। संकेतक भी बच सकते हैं यदि वे वैश्विक चर या अन्य डेटा संरचनाओं में संग्रहीत हैं, जो बदले में, वर्तमान प्रक्रिया से बच जाते हैं।


एस्केप विश्लेषण उन सभी स्थानों को निर्धारित करता है जहां पॉइंटर को संग्रहीत किया जा सकता है और क्या पॉइंटर का जीवनकाल केवल वर्तमान प्रक्रिया और/या थ्रेड तक ही सीमित साबित किया जा सकता है।
निस्सरण विश्लेषण उन सभी स्थानों को निर्धारित करता है जहां संकेतक को संग्रहीत किया जा सकता है और क्या संकेतक का जीवनकाल केवल वर्तमान प्रक्रिया और/या थ्रेड तक ही सीमित साबित किया जा सकता है।


== अनुकूलन ==
== अनुकूलन ==
एक संकलक अनुकूलन के आधार के रूप में एस्केप विश्लेषण के परिणामों का उपयोग कर सकता है:<ref name=":0">T. Kotzmann and H. Mössenböck, “Escape analysis in the context of dynamic compilation and deoptimization,” in Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, New York, NY, USA, 2005, pp. 111–120.</ref>
एक संकलक अनुकूलन के आधार के रूप में निस्सरण विश्लेषण के परिणामों का उपयोग कर सकता है:<ref name=":0">T. Kotzmann and H. Mössenböck, “Escape analysis in the context of dynamic compilation and deoptimization,” in Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, New York, NY, USA, 2005, pp. 111–120.</ref>
* डायनेमिक मेमोरी आवंटन को [[स्टैक-आधारित मेमोरी आवंटन]] में परिवर्तित करना।<ref>{{Cite journal|last=Blanchet|first=Bruno|date=November 2003|title=Escape Analysis for JavaTM: Theory and Practice|journal= ACM Transactions on Programming Languages and Systems|volume=25|issue=6|pages=713–775|doi=10.1145/945885.945886|issn=0164-0925|doi-access=free}}</ref> यदि एक सबरूटीन में एक ऑब्जेक्ट आवंटित किया जाता है, और ऑब्जेक्ट के लिए एक सूचक कभी नहीं निकलता है, तो ऑब्जेक्ट हीप आवंटन के बजाय स्टैक आवंटन के लिए एक उम्मीदवार हो सकता है। कचरा एकत्रित भाषाओं में यह कलेक्टर को कितनी बार चलाने की आवश्यकता को कम कर सकता है।
* गतिक स्मृति आवंटन को [[Index.php?title=स्टैक आधारित स्मृति आवंटन|स्टैक आधारित स्मृति आवंटन]] में परिवर्तित करना।<ref>{{Cite journal|last=Blanchet|first=Bruno|date=November 2003|title=Escape Analysis for JavaTM: Theory and Practice|journal= ACM Transactions on Programming Languages and Systems|volume=25|issue=6|pages=713–775|doi=10.1145/945885.945886|issn=0164-0925|doi-access=free}}</ref> यदि एक उपनेमिका में एक उद्देश्य आवंटित किया जाता है, और उद्देश्य के लिए एक सूचक कभी नहीं निकलता है, तो उद्देश्य हीप आवंटन के बजाय स्टैक आवंटन के लिए एक उम्मीदवार हो सकता है। अनियमित एकत्रित भाषाओं में यह कलेक्टर को बार-बार चलाने की आवश्यकता को कम कर सकता है।
* तुल्यकालन elision. यदि किसी वस्तु को केवल एक धागे से पहुँचा जा सकता है, तो वस्तु पर संचालन बिना तुल्यकालन के किया जा सकता है।
* तुल्यकालन लोप यदि किसी वस्तु को केवल एक कड़ी से पहुँचा जा सकता है, तो वस्तु पर संचालन बिना तुल्यकालन के किया जा सकता है।
* वस्तुओं को तोड़ना या अदिश प्रतिस्थापन।<ref>{{Cite book|last=Kotzmann|first=Thomas|last2=Mössenböck|first2=Hanspeter|date=March 2007|title=Run-Time Support for Optimizations Based on Escape Analysis|journal=International Symposium on Code Generation and Optimization (CGO'07)|pages=49–60|doi=10.1109/CGO.2007.34|isbn=978-0-7695-2764-2|citeseerx=10.1.1.394.5944}}</ref> किसी ऑब्जेक्ट को उन तरीकों से एक्सेस किया जा सकता है जिनके लिए ऑब्जेक्ट को अनुक्रमिक मेमोरी स्ट्रक्चर के रूप में मौजूद होने की आवश्यकता नहीं होती है। यह ऑब्जेक्ट के भागों (या सभी) को स्मृति के बजाय CPU रजिस्टरों में संग्रहीत करने की अनुमति दे सकता है।
* वस्तुओं को तोड़ना या अदिश प्रतिस्थापन।<ref>{{Cite book|last=Kotzmann|first=Thomas|last2=Mössenböck|first2=Hanspeter|date=March 2007|title=Run-Time Support for Optimizations Based on Escape Analysis|journal=International Symposium on Code Generation and Optimization (CGO'07)|pages=49–60|doi=10.1109/CGO.2007.34|isbn=978-0-7695-2764-2|citeseerx=10.1.1.394.5944}}</ref> किसी उद्देश्य को उन तरीकों से अभिगमन किया जा सकता है जिनके लिए उद्देश्य को अनुक्रमिक स्मृति संरचना के रूप में मौजूद होने की आवश्यकता नहीं होती है। यह उद्देश्य के भागों (या सभी) को स्मृति के बजाय सीपीयू रजिस्टरों में संग्रहीत करने की अनुमति दे सकता है।


== व्यावहारिक विचार ==
== व्यावहारिक विचार ==
{{Unreferenced section|August 2013 = |date=August 2013}}[[वस्तु-उन्मुख प्रोग्रामिंग भाषा]] | ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, डायनेमिक संकलन विशेष रूप से एस्केप एनालिसिस करने के लिए अच्छे उम्मीदवार हैं। पारंपरिक [[स्थिर संकलन]] में, [[ओवरराइडिंग विधि]] एस्केप विश्लेषण को असंभव बना सकती है, क्योंकि किसी भी कॉल की गई विधि को एक ऐसे संस्करण द्वारा ओवरराइड किया जा सकता है जो पॉइंटर को एस्केप करने की अनुमति देता है। [[गतिशील संकलन]] ओवरलोडिंग पर उपलब्ध जानकारी का उपयोग करके एस्केप एनालिसिस कर सकते हैं, और डायनेमिक कोड लोडिंग द्वारा प्रासंगिक तरीकों को ओवरराइड किए जाने पर विश्लेषण को फिर से कर सकते हैं।<ref name=":0" />
[[Index.php?title=वस्तु-उन्मुख क्रमादेशन भाषा|वस्तु-उन्मुख क्रमादेशन भाषा]] | वस्तु अभिमुखित क्रमादेशन भाषा में, गतिक संकलन विशेष रूप से निस्सरण विश्लेषण करने के लिए अच्छे उम्मीदवार हैं। पारंपरिक [[स्थिर संकलन]] में, [[Index.php?title=अधिरोहित विधि|अधिरोहित विधि]] निस्सरण विश्लेषण को असंभव बना सकती है, क्योंकि किसी भी कॉल की गई विधि को एक ऐसे संस्करण द्वारा अध्यारोही किया जा सकता है जो संकेतक को निस्सरण करने की अनुमति देता है। [[गतिशील संकलन]] अतिभारण पर उपलब्ध जानकारी का उपयोग करके निस्सरण विश्लेषणकर सकते हैं, और गतिशील कूट भारण द्वारा प्रासंगिक तरीकों को अध्यारोहण किए जाने पर विश्लेषण को फिर से कर सकते हैं।<ref name=":0" />


[[जावा (प्रोग्रामिंग भाषा)]] की लोकप्रियता ने पलायन विश्लेषण को रुचि का लक्ष्य बना दिया है। जावा का हीप-ओनली ऑब्जेक्ट एलोकेशन, बिल्ट-इन थ्रेडिंग, सन [[हॉटस्पॉट (वर्चुअल मशीन)]] डायनेमिक कंपाइलर और [[ओपनजे9]] का [[जस्ट-इन-टाइम कंपाइलर]] (JIT) एस्केप एनालिसिस से संबंधित ऑप्टिमाइज़ेशन के लिए एक कैंडिडेट प्लेटफॉर्म बनाता है (देखें जावा परफॉर्मेंस#एस्केप) विश्लेषण और ताला मोटा)। एस्केप विश्लेषण जावा मानक संस्करण 6 में लागू किया गया है। कुछ जेवीएम एस्केप विश्लेषण के एक मजबूत संस्करण का समर्थन करते हैं जिसे आंशिक एस्केप विश्लेषण कहा जाता है जो किसी आवंटित ऑब्जेक्ट के स्केलर प्रतिस्थापन को संभव बनाता है, भले ही ऑब्जेक्ट किसी फ़ंक्शन के कुछ पथों से निकल जाए।<ref>{{Cite book |doi = 10.1145/2581122.2544157|chapter = Partial Escape Analysis and Scalar Replacement for Java|title = Proceedings of Annual IEEE/ACM International Symposium on Code Generation and Optimization - CGO '14|pages = 165–174|year = 2014|last1 = Stadler|first1 = Lukas|last2 = Würthinger|first2 = Thomas|last3 = Mössenböck|first3 = Hanspeter|isbn = 9781450326704}}</ref>
[[जावा (प्रोग्रामिंग भाषा)|जावा (क्रमादेशन भाषा)]] की लोकप्रियता ने निस्सरण विश्लेषण को रुचि का लक्ष्य बना दिया है। जावा का हीप-ओनली वस्तु आवंटन, अंतर्निर्मित थ्रेडिंग, सन [[Index.php?title=हॉटस्पॉट (अतिक्षेत्र)|हॉटस्पॉट (अतिक्षेत्र)]] गतिक संकलक और [[ओपनजे9]] का [[जस्ट-इन-टाइम कंपाइलर]] (JIT) निस्सरण विश्लेषण से संबंधित इष्टतमीकरण के लिए एक उम्मीदवार मंच बनाता है (देखें जावा निष्पादन#निस्सरण) विश्लेषण। निस्सरण विश्लेषण जावा मानक संस्करण 6 में लागू किया गया है। कुछ जेवीएम निस्सरण विश्लेषण के एक मजबूत संस्करण का समर्थन करते हैं जिसे आंशिक निस्सरण विश्लेषण कहा जाता है जो किसी आवंटित उद्देश्य के अदिश प्रतिस्थापन को संभव बनाता है, भले ही उद्देश्य किसी फ़ंक्शन के कुछ पथों से निकल जाए।<ref>{{Cite book |doi = 10.1145/2581122.2544157|chapter = Partial Escape Analysis and Scalar Replacement for Java|title = Proceedings of Annual IEEE/ACM International Symposium on Code Generation and Optimization - CGO '14|pages = 165–174|year = 2014|last1 = Stadler|first1 = Lukas|last2 = Würthinger|first2 = Thomas|last3 = Mössenböck|first3 = Hanspeter|isbn = 9781450326704}}</ref>




Line 23: Line 22:
<वाक्यविन्यास प्रकाश लैंग = जावा>
<वाक्यविन्यास प्रकाश लैंग = जावा>
वर्ग मुख्य {
वर्ग मुख्य {
     सार्वजनिक स्थैतिक शून्य main (String [] args) {
     class Main {
        उदाहरण();
    }
    सार्वजनिक स्थैतिक शून्य उदाहरण () {
        फू फू = नया फू (); // आवंटन
        बार बार = नया बार (); // आवंटन
        बार.सेटफू (फू);
    }
}


कक्षा फू {}
    public static void main(String[] args) {
        example();
    }
    public static void example() {
        Foo foo = new Foo(); //alloc
        Bar bar = new Bar(); //alloc
        bar.setFoo(foo);
    }
}
class Foo {}
class Bar {
    private Foo foo;
    public void setFoo(Foo foo) {
        this.foo = foo;
    }
}
इस उदाहरण में, दो उद्देश्य बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया <code>setFoo()</code> प्राप्त foo उद्देश्य का संदर्भ संग्रहीत करता है। यदि बार उद्देश्य हीप पर था तो foo का संदर्भ बच जाएगा। लेकिन इस मामले में एक संकलक निस्सरण विश्लेषण के साथ यह निर्धारित कर सकता है कि बार उद्देश्य खुद के आहान से नहीं बचता है <code>example()</code>. नतीजतन, foo का संदर्भ या तो बच नहीं सकता है, और संकलक स्टैक पर दोनों वस्तुओं को सुरक्षित रूप से आवंटित कर सकता है।


क्लास बार {
== उदाहरण (योजना) ==
    निजी फू फू;
निम्नलिखित उदाहरण में, वेक्टर ''p,'' ''g'' में नहीं निकलता है, इसलिए इसे स्टैक पर आवंटित किया जा सकता है और फिर ''g'' को कॉल करने से पहले स्टैक से हटा दिया जाता है।
    सार्वजनिक शून्य सेटफू (फू फू) {
        यह.फू = फू;
    }
}
</वाक्यविन्यास हाइलाइट>


इस उदाहरण में, दो ऑब्जेक्ट बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया <code>setFoo()</code> प्राप्त फू ऑब्जेक्ट का संदर्भ संग्रहीत करता है। यदि बार ऑब्जेक्ट ढेर पर था तो फू का संदर्भ बच जाएगा। लेकिन इस मामले में एक कंपाइलर एस्केप एनालिसिस के साथ यह निर्धारित कर सकता है कि बार ऑब्जेक्ट खुद के इनवोकेशन से नहीं बचता है <code>example()</code>. नतीजतन, फू का संदर्भ या तो बच नहीं सकता है, और संकलक स्टैक पर दोनों वस्तुओं को सुरक्षित रूप से आवंटित कर सकता है।
  (define (f x)


== उदाहरण (योजना) ==
    (let ((p (make-vector 10000)))
निम्नलिखित उदाहरण में, वेक्टर पी जी में नहीं निकलता है, इसलिए इसे स्टैक पर आवंटित किया जा सकता है और फिर जी को कॉल करने से पहले स्टैक से हटा दिया जाता है।
      (fill-vector-with-good-stuff p)
<वाक्यविन्यास लैंग = योजना>
      (g (vector-ref p 7023))))
(परिभाषित करें (एफ एक्स)
 
  (चलो ((पी (मेक-वेक्टर 10000)))
 
      (फिल-वेक्टर-विथ-गुड-स्टफ पी)
अगर, हालांकि, हमारे पास था।
      (जी (वेक्टर-रेफरी पी 7023))))
  (define (f x)
</वाक्यविन्यास हाइलाइट>


अगर, हालांकि, हमारे पास था
    (let ((p (make-vector 10000)))
<वाक्यविन्यास लैंग = योजना>
      (fill-vector-with-good-stuff p)
(परिभाषित करें (एफ एक्स)
      (g p)))
  (चलो ((पी (मेक-वेक्टर 10000)))
या तो ''p'' को हीप पर आवंटित करने की आवश्यकता होगी या (यदि ''g'' संकलक के लिए जाना जाता है जब ''f'' संकलित किया जाता है, और अच्छी तरह से व्यवहार करता है) इस तरह से हीप पर आवंटित किया जाता है कि जब ''g'' कहा जाता है तो यह जगह में रह सकता है।
      (फिल-वेक्टर-विथ-गुड-स्टफ पी)
      (जी पी)))
</वाक्यविन्यास हाइलाइट>
तो या तो पी को ढेर पर आवंटित करने की आवश्यकता होगी या (यदि जी संकलक के लिए जाना जाता है जब एफ संकलित किया जाता है, और अच्छी तरह से व्यवहार करता है) इस तरह से ढेर पर आवंटित किया जाता है कि जब जी कहा जाता है तो यह जगह में रह सकता है।


यदि अपवाद-जैसी नियंत्रण संरचनाओं को लागू करने के लिए निरंतरता का उपयोग किया जाता है, तो वास्तव में निरंतरता आवंटित करने और उसमें कॉल स्टैक की प्रतिलिपि बनाने से बचने के लिए पलायन विश्लेषण अक्सर इसका पता लगा सकता है। उदाहरण के लिए, में
यदि अपवाद-जैसी नियंत्रण संरचनाओं को लागू करने के लिए निरंतरता का उपयोग किया जाता है, तो वास्तव में निरंतरता आवंटित करने और उसमें कॉल स्टैक की प्रतिलिपि बनाने से बचने के लिए निस्सरण विश्लेषण अक्सर इसका पता लगा सकता है। उदाहरण के लिए,
<वाक्यविन्यास लैंग = योजना>


;उपयोगकर्ता द्वारा दर्ज योजना वस्तुओं को पढ़ता है। यदि वे सभी संख्याएँ हैं,
;उपयोगकर्ता द्वारा दर्ज योजना वस्तुओं को पढ़ता है। यदि वे सभी संख्याएँ हैं,
Line 70: Line 68:
;;संख्या नहीं है, तुरंत #f लौटाता है।
;;संख्या नहीं है, तुरंत #f लौटाता है।
(परिभाषित करें (गेटनमलिस्ट)
(परिभाषित करें (गेटनमलिस्ट)
   (कॉल/सीसी (लैम्ब्डा (जारी)
   (define (getnumlist)
    (परिभाषित करें (संख्या प्राप्त करें)
 
      (चलो ((अगली वस्तु (पढ़ें)))
  (call/cc (lambda (continuation)
          (सं
    (define (get-numbers)
            ((ईओफ़-ऑब्जेक्ट? अगली-ऑब्जेक्ट) '())
        (let ((next-object (read)))
            ((संख्या? अगली वस्तु) (विपक्ष अगली वस्तु (संख्या प्राप्त करें)))
          (cond
            (और (निरंतरता #f)))))
              ((eof-object? next-object) '())
    (संख्या प्राप्त करें))))
              ((number? next-object) (cons next-object (get-numbers)))
</वाक्यविन्यास हाइलाइट>
              (else (continuation #f)))))
एस्केप विश्लेषण यह निर्धारित करेगा कि कॉल/सीसी द्वारा कब्जा कर लिया गया निरंतरता बच नहीं सकता है, इसलिए किसी निरंतरता संरचना को आवंटित करने की आवश्यकता नहीं है, और निरंतरता को कॉल करके निरंतरता को आमंत्रित करके स्टैक को खोलकर कार्यान्वित किया जा सकता है।
    (get-numbers))))
निस्सरण विश्लेषण यह निर्धारित करेगा कि कॉल/सीसी द्वारा प्रग्रहण कर लिया गया निरंतरता बच नहीं सकता है, इसलिए किसी निरंतरता संरचना को आवंटित करने की आवश्यकता नहीं है, और निरंतरता को कॉल करके निरंतरता को आमंत्रित करके स्टैक को खोलकर कार्यान्वित किया जा सकता है।


== यह भी देखें ==
== यह भी देखें ==

Revision as of 00:54, 25 February 2023

संकलक अनुकूलन में, निस्सरण विश्लेषण के गत्यात्मक विस्तार को निर्धारित करने की एक विधि है – जहां क्रमादेश में एक संकेतक को अभिगमन किया जा सकता है। यह सूचक विश्लेषण और आकार विश्लेषण (कार्यक्रम विश्लेषण) से संबंधित है।

जब एक चर (या एक वस्तु) एक उपनेमका में आवंटित किया जाता है, चर के लिए एक सूचक (संगणक क्रमादेशन) निष्पादन के अन्य थ्रेड (संगणक विज्ञान) या उपनेमिका को आह्वान करने के लिए बच सकता है। यदि कोई कार्यान्वयन टेल कॉल इष्टतमीकरण (आमतौर पर कार्यात्मक क्रमादेशन के लिए आवश्यक) का उपयोग करता है, तो उद्देश्य को उपनेमिका से बचने के रूप में भी देखा जा सकता है। यदि कोई भाषा प्रथम श्रेणी की निरंतरता का समर्थन करती है (जैसा कि योजना (क्रमादेशन भाषा) और न्यू जर्सी के मानक एमएल) करते हैं, तो कॉल स्टैक के भाग भी बच सकते हैं।

यदि एक उपनेमका एक वस्तु आवंटित करता है और इसके लिए एक सूचक लौटाता है, तो वस्तु को कार्यक्रम में अनिर्धारित स्थानों से पहुँचा जा सकता है – सूचक निस्सरण है। संकेतक भी बच सकते हैं यदि वे वैश्विक चर या अन्य डेटा संरचनाओं में संग्रहीत हैं, जो बदले में, वर्तमान प्रक्रिया से बच जाते हैं।

निस्सरण विश्लेषण उन सभी स्थानों को निर्धारित करता है जहां संकेतक को संग्रहीत किया जा सकता है और क्या संकेतक का जीवनकाल केवल वर्तमान प्रक्रिया और/या थ्रेड तक ही सीमित साबित किया जा सकता है।

अनुकूलन

एक संकलक अनुकूलन के आधार के रूप में निस्सरण विश्लेषण के परिणामों का उपयोग कर सकता है:[1]

  • गतिक स्मृति आवंटन को स्टैक आधारित स्मृति आवंटन में परिवर्तित करना।[2] यदि एक उपनेमिका में एक उद्देश्य आवंटित किया जाता है, और उद्देश्य के लिए एक सूचक कभी नहीं निकलता है, तो उद्देश्य हीप आवंटन के बजाय स्टैक आवंटन के लिए एक उम्मीदवार हो सकता है। अनियमित एकत्रित भाषाओं में यह कलेक्टर को बार-बार चलाने की आवश्यकता को कम कर सकता है।
  • तुल्यकालन लोप यदि किसी वस्तु को केवल एक कड़ी से पहुँचा जा सकता है, तो वस्तु पर संचालन बिना तुल्यकालन के किया जा सकता है।
  • वस्तुओं को तोड़ना या अदिश प्रतिस्थापन।[3] किसी उद्देश्य को उन तरीकों से अभिगमन किया जा सकता है जिनके लिए उद्देश्य को अनुक्रमिक स्मृति संरचना के रूप में मौजूद होने की आवश्यकता नहीं होती है। यह उद्देश्य के भागों (या सभी) को स्मृति के बजाय सीपीयू रजिस्टरों में संग्रहीत करने की अनुमति दे सकता है।

व्यावहारिक विचार

वस्तु-उन्मुख क्रमादेशन भाषा | वस्तु अभिमुखित क्रमादेशन भाषा में, गतिक संकलन विशेष रूप से निस्सरण विश्लेषण करने के लिए अच्छे उम्मीदवार हैं। पारंपरिक स्थिर संकलन में, अधिरोहित विधि निस्सरण विश्लेषण को असंभव बना सकती है, क्योंकि किसी भी कॉल की गई विधि को एक ऐसे संस्करण द्वारा अध्यारोही किया जा सकता है जो संकेतक को निस्सरण करने की अनुमति देता है। गतिशील संकलन अतिभारण पर उपलब्ध जानकारी का उपयोग करके निस्सरण विश्लेषणकर सकते हैं, और गतिशील कूट भारण द्वारा प्रासंगिक तरीकों को अध्यारोहण किए जाने पर विश्लेषण को फिर से कर सकते हैं।[1]

जावा (क्रमादेशन भाषा) की लोकप्रियता ने निस्सरण विश्लेषण को रुचि का लक्ष्य बना दिया है। जावा का हीप-ओनली वस्तु आवंटन, अंतर्निर्मित थ्रेडिंग, सन हॉटस्पॉट (अतिक्षेत्र) गतिक संकलक और ओपनजे9 का जस्ट-इन-टाइम कंपाइलर (JIT) निस्सरण विश्लेषण से संबंधित इष्टतमीकरण के लिए एक उम्मीदवार मंच बनाता है (देखें जावा निष्पादन#निस्सरण) विश्लेषण। निस्सरण विश्लेषण जावा मानक संस्करण 6 में लागू किया गया है। कुछ जेवीएम निस्सरण विश्लेषण के एक मजबूत संस्करण का समर्थन करते हैं जिसे आंशिक निस्सरण विश्लेषण कहा जाता है जो किसी आवंटित उद्देश्य के अदिश प्रतिस्थापन को संभव बनाता है, भले ही उद्देश्य किसी फ़ंक्शन के कुछ पथों से निकल जाए।[4]


उदाहरण (जावा)

<वाक्यविन्यास प्रकाश लैंग = जावा> वर्ग मुख्य {

   class Main {
    public static void main(String[] args) {
        example();
    }
    public static void example() {
        Foo foo = new Foo(); //alloc
        Bar bar = new Bar(); //alloc
        bar.setFoo(foo);
    }
}

class Foo {}

class Bar {
    private Foo foo;
    public void setFoo(Foo foo) {
        this.foo = foo;
    }
}

इस उदाहरण में, दो उद्देश्य बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया setFoo() प्राप्त foo उद्देश्य का संदर्भ संग्रहीत करता है। यदि बार उद्देश्य हीप पर था तो foo का संदर्भ बच जाएगा। लेकिन इस मामले में एक संकलक निस्सरण विश्लेषण के साथ यह निर्धारित कर सकता है कि बार उद्देश्य खुद के आहान से नहीं बचता है example(). नतीजतन, foo का संदर्भ या तो बच नहीं सकता है, और संकलक स्टैक पर दोनों वस्तुओं को सुरक्षित रूप से आवंटित कर सकता है।

उदाहरण (योजना)

निम्नलिखित उदाहरण में, वेक्टर p, g में नहीं निकलता है, इसलिए इसे स्टैक पर आवंटित किया जा सकता है और फिर g को कॉल करने से पहले स्टैक से हटा दिया जाता है।

 (define (f x)
   (let ((p (make-vector 10000)))
      (fill-vector-with-good-stuff p)
      (g (vector-ref p 7023))))


अगर, हालांकि, हमारे पास था।

 (define (f x)
   (let ((p (make-vector 10000)))
      (fill-vector-with-good-stuff p)
      (g p)))

या तो p को हीप पर आवंटित करने की आवश्यकता होगी या (यदि g संकलक के लिए जाना जाता है जब f संकलित किया जाता है, और अच्छी तरह से व्यवहार करता है) इस तरह से हीप पर आवंटित किया जाता है कि जब g कहा जाता है तो यह जगह में रह सकता है।

यदि अपवाद-जैसी नियंत्रण संरचनाओं को लागू करने के लिए निरंतरता का उपयोग किया जाता है, तो वास्तव में निरंतरता आवंटित करने और उसमें कॉल स्टैक की प्रतिलिपि बनाने से बचने के लिए निस्सरण विश्लेषण अक्सर इसका पता लगा सकता है। उदाहरण के लिए,

उपयोगकर्ता द्वारा दर्ज योजना वस्तुओं को पढ़ता है। यदि वे सभी संख्याएँ हैं,
उन सभी को क्रम में रखने वाली सूची लौटाता है। यदि उपयोगकर्ता उसमें प्रवेश करता है
संख्या नहीं है, तुरंत #f लौटाता है।

(परिभाषित करें (गेटनमलिस्ट)

 (define (getnumlist)
  (call/cc (lambda (continuation)
    (define (get-numbers)
       (let ((next-object (read)))
          (cond
             ((eof-object? next-object) '())
             ((number? next-object) (cons next-object (get-numbers)))
             (else (continuation #f)))))
    (get-numbers))))

निस्सरण विश्लेषण यह निर्धारित करेगा कि कॉल/सीसी द्वारा प्रग्रहण कर लिया गया निरंतरता बच नहीं सकता है, इसलिए किसी निरंतरता संरचना को आवंटित करने की आवश्यकता नहीं है, और निरंतरता को कॉल करके निरंतरता को आमंत्रित करके स्टैक को खोलकर कार्यान्वित किया जा सकता है।

यह भी देखें

  • उपनाम विश्लेषण
  • सूचक विश्लेषण
  • आकार विश्लेषण (कार्यक्रम विश्लेषण)

संदर्भ

  1. 1.0 1.1 T. Kotzmann and H. Mössenböck, “Escape analysis in the context of dynamic compilation and deoptimization,” in Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, New York, NY, USA, 2005, pp. 111–120.
  2. Blanchet, Bruno (November 2003). "Escape Analysis for JavaTM: Theory and Practice". ACM Transactions on Programming Languages and Systems. 25 (6): 713–775. doi:10.1145/945885.945886. ISSN 0164-0925.
  3. Kotzmann, Thomas; Mössenböck, Hanspeter (March 2007). Run-Time Support for Optimizations Based on Escape Analysis. pp. 49–60. CiteSeerX 10.1.1.394.5944. doi:10.1109/CGO.2007.34. ISBN 978-0-7695-2764-2. {{cite book}}: |journal= ignored (help)
  4. Stadler, Lukas; Würthinger, Thomas; Mössenböck, Hanspeter (2014). "Partial Escape Analysis and Scalar Replacement for Java". Proceedings of Annual IEEE/ACM International Symposium on Code Generation and Optimization - CGO '14. pp. 165–174. doi:10.1145/2581122.2544157. ISBN 9781450326704.