निस्सरण विश्लेषण

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

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

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

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

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

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

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

उदाहरण (जावा)
<वाक्यविन्यास प्रकाश लैंग = जावा> वर्ग मुख्य { 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; } } इस उदाहरण में, दो उद्देश्य बनाए गए हैं (आवंटन के साथ टिप्पणी की गई है), और उनमें से एक को दूसरे की विधि के तर्क के रूप में दिया गया है। प्रक्रिया  प्राप्त foo उद्देश्य का संदर्भ संग्रहीत करता है। यदि बार उद्देश्य हीप पर था तो foo का संदर्भ बच जाएगा। लेकिन इस स्थितिे में एक संकलक निस्सरण विश्लेषण के साथ यह निर्धारित कर सकता है कि बार उद्देश्य खुद के आहान से नहीं बचता है. परिणाम स्वरूप, 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 कहा जाता है तो यह जगह में रह सकता है।

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

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

(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)))) निस्सरण विश्लेषण यह निर्धारित करेगा कि कॉल/सीसी द्वारा प्रग्रहण कर लिया गया निरंतरता बच नहीं सकता है, इसलिए किसी निरंतरता संरचना को आवंटित करने की आवश्यकता नहीं है, और निरंतरता को कॉल करके निरंतरता को आमंत्रित करके स्टैक को खोलकर कार्यान्वित किया जा सकता है।

यह भी देखें

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