एस्केप विश्लेषण

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

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

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

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

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

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

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

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

कक्षा फू {}

क्लास बार { निजी फू फू; सार्वजनिक शून्य सेटफू (फू फू) { यह.फू = फू; } } 

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

उदाहरण (योजना)
निम्नलिखित उदाहरण में, वेक्टर पी जी में नहीं निकलता है, इसलिए इसे स्टैक पर आवंटित किया जा सकता है और फिर जी को कॉल करने से पहले स्टैक से हटा दिया जाता है। <वाक्यविन्यास लैंग = योजना> (परिभाषित करें (एफ एक्स)  (चलो ((पी (मेक-वेक्टर 10000))) (फिल-वेक्टर-विथ-गुड-स्टफ पी) (जी (वेक्टर-रेफरी पी 7023)))) 

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

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

(परिभाषित करें (गेटनमलिस्ट) (कॉल/सीसी (लैम्ब्डा (जारी)    (परिभाषित करें (संख्या प्राप्त करें) (चलो ((अगली वस्तु (पढ़ें)))         (सं ((ईओफ़-ऑब्जेक्ट? अगली-ऑब्जेक्ट) ') ((संख्या? अगली वस्तु) (विपक्ष अगली वस्तु (संख्या प्राप्त करें))) (और (निरंतरता #f)))))   (संख्या प्राप्त करें))))  एस्केप विश्लेषण यह निर्धारित करेगा कि कॉल/सीसी द्वारा कब्जा कर लिया गया निरंतरता बच नहीं सकता है, इसलिए किसी निरंतरता संरचना को आवंटित करने की आवश्यकता नहीं है, और निरंतरता को कॉल करके निरंतरता को आमंत्रित करके स्टैक को खोलकर कार्यान्वित किया जा सकता है।
 * उपयोगकर्ता द्वारा दर्ज योजना वस्तुओं को पढ़ता है। यदि वे सभी संख्याएँ हैं,
 * उन सभी को क्रम में रखने वाली सूची लौटाता है। यदि उपयोगकर्ता उसमें प्रवेश करता है
 * संख्या नहीं है, तुरंत #f लौटाता है।

यह भी देखें

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