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

From Vigyanwiki
(Created page with "{{Short description|Type of compiler optimization}} लगातार फोल्डिंग और निरंतर प्रसार संबंधित अनु...")
 
No edit summary
 
(7 intermediate revisions by 4 users not shown)
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>"abc" + "def"</code> को <code>"abcdef"</code>से प्रतिस्थापित किया जा सकता है .


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


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


== लगातार तह और क्रॉस संकलन ==
== अचर प्रचार ==


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


== लगातार प्रचार ==
  int y = 7 - x / 2;
  return y * (28 / x + 2);
x को प्रसारित करने पर
  int x = 14;


निरंतर प्रसार संकलन समय पर भावों में ज्ञात स्थिरांक के मूल्यों को प्रतिस्थापित करने की प्रक्रिया है। इस तरह के स्थिरांक में वे शामिल हैं जो ऊपर परिभाषित किए गए हैं, साथ ही निरंतर मूल्यों पर लागू [[आंतरिक कार्य]] भी शामिल हैं। निम्नलिखित स्यूडोकोड पर विचार करें:
  int y = 7 - 14 / 2;
  return y * (28 / 14 + 2);
निम्नलिखित, जो संभवतः x और y दोनों के [[डेड-कोड उन्मूलन|मृत-कोड उन्मूलन]] द्वारा अनुकूलित किया गया है, का प्रसार करने पर
  int x = 14;


<वाक्यविन्यास लैंग = सी>
  int y = 0;
  इंट एक्स = 14;
  return 0;
  इंट वाई = 7 - एक्स / 2;
परिभाषा विश्लेषण परिणामों तक पहुँचने का उपयोग करके कंपाइलरों में अचर प्रसार प्रारंभ किया जाता है। यदि सभी अचर की [[परिभाषा तक पहुँचना]] एक ही क्रिया है जो अचर को एक समान स्थिरांक प्रदान करता है, तो अचर का एक स्थिर मान होता है और इसे अन्य अचर से प्रतिस्थापित किया जा सकता है।
  वापसी वाई * (28 / एक्स + 2);
</वाक्यविन्यास हाइलाइट>


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


<वाक्यविन्यास लैंग = सी>
== कार्यों में अनुकूलन ==
  इंट एक्स = 14;
  इंट वाई = 7 - 14/2;
  वापसी वाई * (28/14 + 2);
</वाक्यविन्यास हाइलाइट>


निम्नलिखित का प्रचार करना जारी रखना (जो संभवतः x और y दोनों के [[डेड-कोड उन्मूलन]] द्वारा अनुकूलित किया जाएगा।)
स्थिर बलन और प्रसार सामान्यतः कई सरलीकरण और अवकरणों को प्राप्त करने के लिए एक साथ उपयोग किया जाता है, जब तक कि कोई और परिवर्तन न हो जाए। इस अडॉप्टिमाइज्ड स्यूडोकोड पर विचार करें जो [[यादृच्छिक संख्या पीढ़ी|यादृच्छिक संख्या]] को संदर्भित करता है:
  int a = 30;


<वाक्यविन्यास लैंग = सी>
  int b = 9 - (a / 5);
  इंट एक्स = 14;
  int c;
  इंट वाई = 0;
   वापसी 0;
  c = b * 4;
</वाक्यविन्यास हाइलाइट>
  if (c > 10) {
      c = c - 10;
  }
  return c * (60 / a);
अचर प्रसार को एक बार प्रारंभ करना, उसके बाद स्थिर बलन करने पर निम्नलिखित स्यूडोकोड प्राप्त होता है
   int a = 30;


परिभाषा विश्लेषण परिणामों तक पहुँचने का उपयोग करके कंपाइलरों में निरंतर प्रसार लागू किया जाता है। यदि सभी वेरिएबल की [[परिभाषा तक पहुँचना]] एक ही असाइनमेंट है जो वेरिएबल को एक समान स्थिरांक प्रदान करता है, तो वेरिएबल का एक स्थिर मान होता है और इसे कॉन्स्टेंट से बदला जा सकता है।
  int b = 3;
  int c;
  c = b * 4;
  if (c > 10) {
      c = c - 10;
  }
  return c * 2;
दोनों चरणों को दो बार पुनरावर्तन के परिणामस्वरूप:
  int a = 30;


निरंतर प्रसार भी सशर्त शाखाओं को एक या अधिक बिना शर्त बयानों को सरल बनाने का कारण बन सकता है, जब केवल संभावित परिणाम निर्धारित करने के लिए संकलन समय पर सशर्त अभिव्यक्ति का सही या गलत मूल्यांकन किया जा सकता है।
  int b = 3;
  int c;
  c = 12;
  if (true) {
      c = 2;
  }
  return c * 2;
जैसा <code>a</code> और <code>b</code> स्थिरांक के लिए सरलीकृत किया गया है और उनके मानों को हर जगह प्रतिस्थापित किया गया है, संकलक अब उन्हें हटाने के लिए मृत-कोड उन्मूलन प्रारंभ करता है तथा कोड को और कम करता है:
  int c;


== कार्रवाई में अनुकूलन ==
  c = 12;
  if (true) {
      c = 2;
  }
  return c * 2;
उपरोक्त कोड में, <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>का मूल्यांकन करेगा,  और कोड को अत्यधिक संकुचित करते हुए स्वयं का अंत किया जा सकता है:
 
   return 4;
<वाक्यविन्यास लैंग = सी>
यदि यह स्यूडोकोड किसी फलन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो फलनों में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ प्राप्त करने के लिए अचर पूर्णांक <code>4</code>का मूल्यांकन करता है।
  इंट ए = 30;
  इंट बी = 9 - (ए / 5);
  इंट सी;
 
  सी = बी * 4;
  अगर (सी> 10) {
    सी = सी - 10;
  }
  वापसी सी * (60 / ए);
</वाक्यविन्यास हाइलाइट>
 
निरंतर प्रसार को एक बार लागू करना, उसके बाद निरंतर तह करना, पैदावार:
 
<वाक्यविन्यास लैंग = सी>
  इंट ए = 30;
  इंट बी = 3;
  इंट सी;
 
  सी = बी * 4;
  अगर (सी> 10) {
    सी = सी - 10;
  }
  वापसी सी * 2;
</वाक्यविन्यास हाइलाइट>
 
दोनों चरणों को दो बार दोहराने के परिणामस्वरूप:
 
<वाक्यविन्यास लैंग = सी>
  इंट ए = 30;
  इंट बी = 3;
  इंट सी;
 
  सी = 12;
  यदि सही) {
    सी = 2;
  }
  वापसी सी * 2;
</वाक्यविन्यास हाइलाइट>
 
जैसा <code>a</code> और <code>b</code> स्थिरांक के लिए सरलीकृत किया गया है और उनके मूल्यों को हर जगह प्रतिस्थापित किया गया है, संकलक अब उन्हें हटाने के लिए डेड-कोड उन्मूलन लागू करता है, कोड को और कम करता है:
 
<वाक्यविन्यास लैंग = सी>
  इंट सी;
  सी = 12;
 
  यदि सही) {
    सी = 2;
  }
  वापसी सी * 2;
</वाक्यविन्यास हाइलाइट>
 
उपरोक्त कोड में, के बजाय <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> कोड को और भी सिकोड़ते हुए खुद को समाप्त किया जा सकता है:
 
<वाक्यविन्यास लैंग = सी>
   वापसी 4;
</वाक्यविन्यास हाइलाइट>
 
यदि यह स्यूडोकोड किसी फ़ंक्शन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो निरंतर पूर्णांक का मूल्यांकन करता है <code>4</code> फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।


== यह भी देखें ==
== यह भी देखें ==
Line 130: Line 101:
* {{Citation |last=Muchnick |first=Steven S. |title=Advanced Compiler Design and Implementation |year=1997 |publisher=Morgan Kaufmann |isbn=9781558603202 |url-access=registration |url=https://archive.org/details/advancedcompiler00much }}
* {{Citation |last=Muchnick |first=Steven S. |title=Advanced Compiler Design and Implementation |year=1997 |publisher=Morgan Kaufmann |isbn=9781558603202 |url-access=registration |url=https://archive.org/details/advancedcompiler00much }}


{{Compiler optimizations}}[[Category: संकलक अनुकूलन]]
[[Category: Machine Translated Page]]
[[Category:Created On 17/02/2023]]
[[Category:Created On 17/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:संकलक अनुकूलन]]

Latest revision as of 11:37, 10 March 2023

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

स्थिर बलन

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

i = 320 * 200 * 32;

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

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

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

स्थिर बलन और क्रॉस संकलन

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

अचर प्रचार

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

 int x = 14;
  int y = 7 - x / 2;
  return y * (28 / x + 2);

x को प्रसारित करने पर

 int x = 14;
  int y = 7 - 14 / 2;
  return y * (28 / 14 + 2);

निम्नलिखित, जो संभवतः x और y दोनों के मृत-कोड उन्मूलन द्वारा अनुकूलित किया गया है, का प्रसार करने पर ।

  int x = 14;
  int y = 0;
  return 0;

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

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

कार्यों में अनुकूलन

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

 int a = 30;
  int b = 9 - (a / 5);
  int c;

  c = b * 4;
  if (c > 10) {
     c = c - 10;
  }
  return c * (60 / a);

अचर प्रसार को एक बार प्रारंभ करना, उसके बाद स्थिर बलन करने पर निम्नलिखित स्यूडोकोड प्राप्त होता है

 int a = 30;
  int b = 3;
  int c;

  c = b * 4;
  if (c > 10) {
     c = c - 10;
  }
  return c * 2;

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

 int a = 30;
  int b = 3;
  int c;

  c = 12;
  if (true) {
     c = 2;
  }
  return c * 2;

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

 int c;
  c = 12;

  if (true) {
     c = 2;
  }
  return c * 2;

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

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

 return 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


अग्रिम पठन