स्थिर बलन: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Type of compiler optimization}} लगातार फोल्डिंग और निरंतर प्रसार संबंधित अनु...")
 
No edit summary
Line 1: Line 1:
{{Short description|Type of compiler optimization}}
{{Short description|Type of compiler optimization}}
लगातार फोल्डिंग और निरंतर प्रसार संबंधित [[अनुकूलन [[संकलक]]]] हैं जो कई आधुनिक कंपाइलर्स द्वारा उपयोग किए जाते हैं।<ref name="MuchnickAssociates1997">{{cite book|author1=Steven Muchnick|author2=Muchnick and Associates|title=Advanced Compiler Design Implementation|url=https://archive.org/details/advancedcompiler00much|url-access=registration|quote=constant propagation OR constant folding.|date=15 August 1997|publisher=Morgan Kaufmann|isbn=978-1-55860-320-2}}</ref> [[विरल सशर्त निरंतर प्रसार]] के रूप में जाना जाने वाला निरंतर प्रसार का एक उन्नत रूप स्थिरांक को अधिक सटीक रूप से प्रसारित कर सकता है और साथ ही [[मृत कोड]] को हटा सकता है।
चर फोल्डिंग और प्रसार संबंधित अनुकूलन [[संकलक]] हैं जो कई आधुनिक कंपाइलर्स द्वारा उपयोग किए जाते हैं।<ref name="MuchnickAssociates1997">{{cite book|author1=Steven Muchnick|author2=Muchnick and Associates|title=Advanced Compiler Design Implementation|url=https://archive.org/details/advancedcompiler00much|url-access=registration|quote=constant propagation OR constant folding.|date=15 August 1997|publisher=Morgan Kaufmann|isbn=978-1-55860-320-2}}</ref> [[विरल सशर्त निरंतर प्रसार|विरल सशर्त चर प्रसार]] के रूप में जाना जाने वाला चर प्रसार का एक उन्नत रूप चर को उपयुक्त रूप से प्रसारित कर सकता है और साथ ही [[मृत कोड|मृत कूट]] को हटा सकता है।


== लगातार तह ==
== चर फोल्डिंग ==


निरंतर फोल्डिंग रनटाइम पर गणना करने के बजाय [[संकलन समय]] पर कॉन्स्टेंट (प्रोग्रामिंग) अभिव्यक्तियों को पहचानने और मूल्यांकन करने की प्रक्रिया है। निरंतर अभिव्यक्तियों में शर्तें आम तौर पर सरल शाब्दिक होती हैं, जैसे [[पूर्णांक शाब्दिक]] <code>2</code>, लेकिन वे चर भी हो सकते हैं जिनके मान संकलन समय पर ज्ञात होते हैं। कथन पर विचार करें:
चर फोल्डिंग, रनटाइम पर गणना करने के अतिरिक्त [[संकलन समय]] पर चर अभिव्यक्तियों को पहचानने और मूल्यांकन करने की प्रक्रिया है। चर अभिव्यक्तियों में शर्तें सामान्यतः सरल शाब्दिक होती हैं, जैसे [[पूर्णांक शाब्दिक]] <code>2</code>, परंतु वे चर भी हो सकते हैं जिनके मान संकलन समय पर ज्ञात होते हैं। निम्नलिखित कथन पर विचार करें:
i = 320 * 200 * 32;
अधिकांश कंपाइलर वास्तव में इस कथन के लिए दो गुणा निर्देश और स्टोर उत्पन्न नहीं करेंगे। इसके अतिरिक्त, वे इन जैसे कन्स्ट्रक्ट की पहचान करते हैं और गणना किए गए मानो को संकलन समय पर प्रतिस्थापित करते हैं जैसे इस परिप्रेक्ष्य में, <code>2,048,000</code>।


<वाक्यविन्यास लैंग = सी>
चर फोल्डिंग से अंकगणितीय सर्वसमिकाओं का उपयोग किया जा सकता है। अगर <code>x</code> संख्यात्मक है तो<code>0 * x</code>का मान शून्य होगा भले ही संकलक<code>x</code>का मूल्य नहीं जानता हो। ध्यान दें कि यह IEEE_754 के बाद से मान्य नहीं है क्योंकि <code>x</code> अनंत हो सकता है। फिर भी, कुछ वातावरण जो प्रदर्शन के पक्ष में हैं जैसे [[जीएलएसएल]] शेडर्स इसे चर के लिए अनुमति देते हैं, जो कभी-कभी बग का कारण बन सकते हैं।
  मैं = 320 * 200 * 32;
</वाक्यविन्यास हाइलाइट>
 
अधिकांश कंपाइलर वास्तव में इस कथन के लिए दो गुणा निर्देश और एक स्टोर उत्पन्न नहीं करेंगे। इसके बजाय, वे इन जैसे निर्माणों की पहचान करते हैं और गणना किए गए मूल्यों को संकलन समय पर प्रतिस्थापित करते हैं (इस मामले में, <code>2,048,000</code>).
 
लगातार मोड़ने से अंकगणितीय सर्वसमिकाओं का उपयोग किया जा सकता है। अगर <code>x</code> संख्यात्मक है, का मान <code>0 * x</code> शून्य है भले ही संकलक का मूल्य नहीं जानता हो <code>x</code> (ध्यान दें कि यह IEEE_754 के बाद से मान्य नहीं है <code>x</code> अनंत या [[NaN]] हो सकता है। फिर भी, कुछ वातावरण जो प्रदर्शन के पक्ष में हैं जैसे [[जीएलएसएल]] शेडर्स इसे स्थिरांक के लिए अनुमति देते हैं, जो कभी-कभी बग का कारण बन सकते हैं)।


लगातार मोड़ना केवल संख्याओं से अधिक पर लागू हो सकता है। [[शाब्दिक स्ट्रिंग]] और निरंतर स्ट्रिंग्स के संयोजन को लगातार मोड़ा जा सकता है। कोड जैसे <code>"abc" + "def"</code> से बदला जा सकता है <code>"abcdef"</code>.
चर फोल्डिंग केवल संख्याओं पर लागू हो सकता है। [[शाब्दिक स्ट्रिंग]] और चर स्ट्रिंग्स के संयोजन को चर फोल्ड किया जा सकता है तथा कोड जैसे की <code>"abc" + "def"</code> को <code>"abcdef"</code>से प्रतिस्थापित किया जा सकता है .


== लगातार तह और क्रॉस संकलन ==
== चर फोल्डिंग और क्रॉस संकलन ==


एक [[क्रॉस कंपाइलर]] को लागू करने में, यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि मेजबान आर्किटेक्चर पर अंकगणितीय परिचालनों का व्यवहार लक्ष्य आर्किटेक्चर पर मेल खाता है, अन्यथा निरंतर फोल्डिंग को सक्षम करने से कार्यक्रम के व्यवहार में बदलाव आएगा। [[तैरनेवाला स्थल]] ऑपरेशंस के मामले में इसका विशेष महत्व है, जिसका सटीक कार्यान्वयन व्यापक रूप से भिन्न हो सकता है।
एक [[क्रॉस कंपाइलर]] को लागू करने में, यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि मेजबान आर्किटेक्चर पर अंकगणितीय परिचालनों का व्यवहार लक्ष्य आर्किटेक्चर पर मेल खाता है, अन्यथा चर फोल्डिंग को सक्षम करने से कार्यक्रम के व्यवहार में बदलाव आएगा। [[तैरनेवाला स्थल]] ऑपरेशंस के परिप्रेक्ष्य में इसका विशेष महत्व है, जिसका सटीक कार्यान्वयन व्यापक रूप से भिन्न हो सकता है।


== लगातार प्रचार ==
== चर प्रचार ==


निरंतर प्रसार संकलन समय पर भावों में ज्ञात स्थिरांक के मूल्यों को प्रतिस्थापित करने की प्रक्रिया है। इस तरह के स्थिरांक में वे शामिल हैं जो ऊपर परिभाषित किए गए हैं, साथ ही निरंतर मूल्यों पर लागू [[आंतरिक कार्य]] भी शामिल हैं। निम्नलिखित स्यूडोकोड पर विचार करें:
चर प्रसार संकलन समय पर भावों में ज्ञात स्थिरांक के मूल्यों को प्रतिस्थापित करने की प्रक्रिया है। इस तरह के स्थिरांक में वे शामिल हैं जो ऊपर परिभाषित किए गए हैं, साथ ही चर मूल्यों पर लागू [[आंतरिक कार्य]] भी शामिल हैं। निम्नलिखित स्यूडोकोड पर विचार करें:


<वाक्यविन्यास लैंग = सी>
<वाक्यविन्यास लैंग = सी>
Line 46: Line 42:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


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


निरंतर प्रसार भी सशर्त शाखाओं को एक या अधिक बिना शर्त बयानों को सरल बनाने का कारण बन सकता है, जब केवल संभावित परिणाम निर्धारित करने के लिए संकलन समय पर सशर्त अभिव्यक्ति का सही या गलत मूल्यांकन किया जा सकता है।
चर प्रसार भी सशर्त शाखाओं को एक या अधिक बिना शर्त बयानों को सरल बनाने का कारण बन सकता है, जब केवल संभावित परिणाम निर्धारित करने के लिए संकलन समय पर सशर्त अभिव्यक्ति का सही या गलत मूल्यांकन किया जा सकता है।


== कार्रवाई में अनुकूलन ==
== कार्रवाई में अनुकूलन ==


निरंतर तह और प्रसार आम तौर पर कई सरलीकरण और कटौती को प्राप्त करने के लिए एक साथ उपयोग किया जाता है, जब तक कि कोई और परिवर्तन न हो जाए। इस अडॉप्टिमाइज्ड स्यूडोकोड पर विचार करें जो [[यादृच्छिक संख्या पीढ़ी]] लौटाता है:
चर फोल्डिंग और प्रसार सामान्यतः कई सरलीकरण और कटौती को प्राप्त करने के लिए एक साथ उपयोग किया जाता है, जब तक कि कोई और परिवर्तन न हो जाए। इस अडॉप्टिमाइज्ड स्यूडोकोड पर विचार करें जो [[यादृच्छिक संख्या पीढ़ी]] लौटाता है:


<वाक्यविन्यास लैंग = सी>
<वाक्यविन्यास लैंग = सी>
Line 66: Line 62:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


निरंतर प्रसार को एक बार लागू करना, उसके बाद निरंतर तह करना, पैदावार:
चर प्रसार को एक बार लागू करना, उसके बाद चर फोल्डिंग करना, पैदावार:


<वाक्यविन्यास लैंग = सी>
<वाक्यविन्यास लैंग = सी>
Line 106: Line 102:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


उपरोक्त कोड में, के बजाय <code>true</code> यह संकलक ढांचे के आधार पर 1 या कोई अन्य बूलियन निर्माण हो सकता है। पारंपरिक निरंतर प्रचार के साथ हमें केवल इतना ही अनुकूलन मिलेगा। यह कार्यक्रम की संरचना को नहीं बदल सकता है।
उपरोक्त कोड में, के अतिरिक्त <code>true</code> यह संकलक ढांचे के आधार पर 1 या कोई अन्य बूलियन निर्माण हो सकता है। पारंपरिक चर प्रचार के साथ हमें केवल इतना ही अनुकूलन मिलेगा। यह कार्यक्रम की संरचना को नहीं बदल सकता है।


इसी तरह का एक और अनुकूलन है, जिसे विरल सशर्त निरंतर प्रसार कहा जाता है, जिसके आधार पर उपयुक्त शाखा का चयन किया जाता है <code>if-condition</code>.<ref>{{Citation |last1=Wegman |first1=Mark N |last2=Zadeck |first2=F. Kenneth |title=Constant Propagation with Conditional Branches |journal=ACM Transactions on Programming Languages and Systems |volume=13 |issue=2 |date=April 1991 |pages=181–210 |doi= 10.1145/103135.103136|citeseerx=10.1.1.130.3532 |s2cid=52813828 }}</ref> कंपाइलर अब पता लगा सकता है कि <code>if</code> बयान हमेशा [[बूलियन डेटाटाइप]] का मूल्यांकन करेगा, <code>c</code> कोड को और भी सिकोड़ते हुए खुद को समाप्त किया जा सकता है:
इसी तरह का एक और अनुकूलन है, जिसे विरल सशर्त चर प्रसार कहा जाता है, जिसके आधार पर उपयुक्त शाखा का चयन किया जाता है <code>if-condition</code>.<ref>{{Citation |last1=Wegman |first1=Mark N |last2=Zadeck |first2=F. Kenneth |title=Constant Propagation with Conditional Branches |journal=ACM Transactions on Programming Languages and Systems |volume=13 |issue=2 |date=April 1991 |pages=181–210 |doi= 10.1145/103135.103136|citeseerx=10.1.1.130.3532 |s2cid=52813828 }}</ref> कंपाइलर अब पता लगा सकता है कि <code>if</code> बयान हमेशा [[बूलियन डेटाटाइप]] का मूल्यांकन करेगा, <code>c</code> कोड को और भी सिकोड़ते हुए खुद को समाप्त किया जा सकता है:


<वाक्यविन्यास लैंग = सी>
<वाक्यविन्यास लैंग = सी>
Line 114: Line 110:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


यदि यह स्यूडोकोड किसी फ़ंक्शन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो निरंतर पूर्णांक का मूल्यांकन करता है <code>4</code> फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।
यदि यह स्यूडोकोड किसी फ़ंक्शन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो चर पूर्णांक का मूल्यांकन करता है <code>4</code> फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।


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

Revision as of 22:10, 5 March 2023

चर फोल्डिंग और प्रसार संबंधित अनुकूलन संकलक हैं जो कई आधुनिक कंपाइलर्स द्वारा उपयोग किए जाते हैं।[1] विरल सशर्त चर प्रसार के रूप में जाना जाने वाला चर प्रसार का एक उन्नत रूप चर को उपयुक्त रूप से प्रसारित कर सकता है और साथ ही मृत कूट को हटा सकता है।

चर फोल्डिंग

चर फोल्डिंग, रनटाइम पर गणना करने के अतिरिक्त संकलन समय पर चर अभिव्यक्तियों को पहचानने और मूल्यांकन करने की प्रक्रिया है। चर अभिव्यक्तियों में शर्तें सामान्यतः सरल शाब्दिक होती हैं, जैसे पूर्णांक शाब्दिक 2, परंतु वे चर भी हो सकते हैं जिनके मान संकलन समय पर ज्ञात होते हैं। निम्नलिखित कथन पर विचार करें:

i = 320 * 200 * 32;

अधिकांश कंपाइलर वास्तव में इस कथन के लिए दो गुणा निर्देश और स्टोर उत्पन्न नहीं करेंगे। इसके अतिरिक्त, वे इन जैसे कन्स्ट्रक्ट की पहचान करते हैं और गणना किए गए मानो को संकलन समय पर प्रतिस्थापित करते हैं जैसे इस परिप्रेक्ष्य में, 2,048,000

चर फोल्डिंग से अंकगणितीय सर्वसमिकाओं का उपयोग किया जा सकता है। अगर x संख्यात्मक है तो0 * xका मान शून्य होगा भले ही संकलकxका मूल्य नहीं जानता हो। ध्यान दें कि यह IEEE_754 के बाद से मान्य नहीं है क्योंकि x अनंत हो सकता है। फिर भी, कुछ वातावरण जो प्रदर्शन के पक्ष में हैं जैसे जीएलएसएल शेडर्स इसे चर के लिए अनुमति देते हैं, जो कभी-कभी बग का कारण बन सकते हैं।

चर फोल्डिंग केवल संख्याओं पर लागू हो सकता है। शाब्दिक स्ट्रिंग और चर स्ट्रिंग्स के संयोजन को चर फोल्ड किया जा सकता है तथा कोड जैसे की "abc" + "def" को "abcdef"से प्रतिस्थापित किया जा सकता है .

चर फोल्डिंग और क्रॉस संकलन

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

चर प्रचार

चर प्रसार संकलन समय पर भावों में ज्ञात स्थिरांक के मूल्यों को प्रतिस्थापित करने की प्रक्रिया है। इस तरह के स्थिरांक में वे शामिल हैं जो ऊपर परिभाषित किए गए हैं, साथ ही चर मूल्यों पर लागू आंतरिक कार्य भी शामिल हैं। निम्नलिखित स्यूडोकोड पर विचार करें:

<वाक्यविन्यास लैंग = सी>

 इंट एक्स = 14;
 इंट वाई = 7 - एक्स / 2;
 वापसी वाई * (28 / एक्स + 2);

</वाक्यविन्यास हाइलाइट>

एक्स उपज का प्रचार:

<वाक्यविन्यास लैंग = सी>

 इंट एक्स = 14;
 इंट वाई = 7 - 14/2;
 वापसी वाई * (28/14 + 2);

</वाक्यविन्यास हाइलाइट>

निम्नलिखित का प्रचार करना जारी रखना (जो संभवतः x और y दोनों के डेड-कोड उन्मूलन द्वारा अनुकूलित किया जाएगा।)

<वाक्यविन्यास लैंग = सी>

 इंट एक्स = 14;
 इंट वाई = 0;
 वापसी 0;

</वाक्यविन्यास हाइलाइट>

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

चर प्रसार भी सशर्त शाखाओं को एक या अधिक बिना शर्त बयानों को सरल बनाने का कारण बन सकता है, जब केवल संभावित परिणाम निर्धारित करने के लिए संकलन समय पर सशर्त अभिव्यक्ति का सही या गलत मूल्यांकन किया जा सकता है।

कार्रवाई में अनुकूलन

चर फोल्डिंग और प्रसार सामान्यतः कई सरलीकरण और कटौती को प्राप्त करने के लिए एक साथ उपयोग किया जाता है, जब तक कि कोई और परिवर्तन न हो जाए। इस अडॉप्टिमाइज्ड स्यूडोकोड पर विचार करें जो यादृच्छिक संख्या पीढ़ी लौटाता है:

<वाक्यविन्यास लैंग = सी>

 इंट ए = 30;
 इंट बी = 9 - (ए / 5);
 इंट सी;
 सी = बी * 4;
 अगर (सी> 10) {
    सी = सी - 10;
 }
 वापसी सी * (60 / ए);

</वाक्यविन्यास हाइलाइट>

चर प्रसार को एक बार लागू करना, उसके बाद चर फोल्डिंग करना, पैदावार:

<वाक्यविन्यास लैंग = सी>

 इंट ए = 30;
 इंट बी = 3;
 इंट सी;
 सी = बी * 4;
 अगर (सी> 10) {
    सी = सी - 10;
 }
 वापसी सी * 2;

</वाक्यविन्यास हाइलाइट>

दोनों चरणों को दो बार दोहराने के परिणामस्वरूप:

<वाक्यविन्यास लैंग = सी>

 इंट ए = 30;
 इंट बी = 3;
 इंट सी;
 सी = 12;
 यदि सही) {
    सी = 2;
 }
 वापसी सी * 2;

</वाक्यविन्यास हाइलाइट>

जैसा a और b स्थिरांक के लिए सरलीकृत किया गया है और उनके मूल्यों को हर जगह प्रतिस्थापित किया गया है, संकलक अब उन्हें हटाने के लिए डेड-कोड उन्मूलन लागू करता है, कोड को और कम करता है:

<वाक्यविन्यास लैंग = सी>

 इंट सी;
 सी = 12;
 यदि सही) {
    सी = 2;
 }
 वापसी सी * 2;

</वाक्यविन्यास हाइलाइट>

उपरोक्त कोड में, के अतिरिक्त true यह संकलक ढांचे के आधार पर 1 या कोई अन्य बूलियन निर्माण हो सकता है। पारंपरिक चर प्रचार के साथ हमें केवल इतना ही अनुकूलन मिलेगा। यह कार्यक्रम की संरचना को नहीं बदल सकता है।

इसी तरह का एक और अनुकूलन है, जिसे विरल सशर्त चर प्रसार कहा जाता है, जिसके आधार पर उपयुक्त शाखा का चयन किया जाता है if-condition.[2] कंपाइलर अब पता लगा सकता है कि if बयान हमेशा बूलियन डेटाटाइप का मूल्यांकन करेगा, c कोड को और भी सिकोड़ते हुए खुद को समाप्त किया जा सकता है:

<वाक्यविन्यास लैंग = सी>

 वापसी 4;

</वाक्यविन्यास हाइलाइट>

यदि यह स्यूडोकोड किसी फ़ंक्शन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो चर पूर्णांक का मूल्यांकन करता है 4 फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।

यह भी देखें

संदर्भ

  1. Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2. constant propagation OR constant folding.
  2. Wegman, Mark N; Zadeck, F. Kenneth (April 1991), "Constant Propagation with Conditional Branches", ACM Transactions on Programming Languages and Systems, 13 (2): 181–210, CiteSeerX 10.1.1.130.3532, doi:10.1145/103135.103136, S2CID 52813828


अग्रिम पठन