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

From Vigyanwiki
Line 20: Line 20:


== उदाहरण (जावा) ==
== उदाहरण (जावा) ==
<वाक्यविन्यास प्रकाश लैंग = जावा>
<syntaxhighlight lang="java">
वर्ग मुख्य {
class Main {
     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);
    }
}


    public static void main(String[] args) {
class Foo {}
        example();
 
    }
class Bar {
    public static void example() {
    private Foo foo;
        Foo foo = new Foo(); //alloc
    public void setFoo(Foo foo) {
        Bar bar = new Bar(); //alloc
        this.foo = foo;
        bar.setFoo(foo);
    }
    }
}
}
</syntaxhighlight>
class Foo {}
class Bar {
    private Foo foo;
    public void setFoo(Foo foo) {
        this.foo = foo;
    }
}
इस उदाहरण में, दो उद्देश्य बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया <code>setFoo()</code> प्राप्त foo उद्देश्य का संदर्भ संग्रहीत करता है। यदि बार उद्देश्य हीप पर था तो foo का संदर्भ बच जाएगा। लेकिन इस स्थितिे में एक संकलक निस्सरण विश्लेषण के साथ यह निर्धारित कर सकता है कि बार उद्देश्य खुद के आहान से नहीं बचता है <code>example()</code>. परिणाम स्वरूप, foo का संदर्भ या तो बच नहीं सकता है, और संकलक स्टैक पर दोनों वस्तुओं को सुरक्षित रूप से आवंटित कर सकता है।
इस उदाहरण में, दो उद्देश्य बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया <code>setFoo()</code> प्राप्त foo उद्देश्य का संदर्भ संग्रहीत करता है। यदि बार उद्देश्य हीप पर था तो foo का संदर्भ बच जाएगा। लेकिन इस स्थितिे में एक संकलक निस्सरण विश्लेषण के साथ यह निर्धारित कर सकता है कि बार उद्देश्य खुद के आहान से नहीं बचता है <code>example()</code>. परिणाम स्वरूप, foo का संदर्भ या तो बच नहीं सकता है, और संकलक स्टैक पर दोनों वस्तुओं को सुरक्षित रूप से आवंटित कर सकता है।
[[Category:Collapse templates|Escape Analysis]]
[[Category:Created On 17/02/2023|Escape Analysis]]
[[Category:Machine Translated Page|Escape Analysis]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Escape Analysis]]
[[Category:Pages with script errors|Escape Analysis]]
[[Category:Sidebars with styles needing conversion|Escape Analysis]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats|Escape Analysis]]


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

Revision as of 12:56, 1 March 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.