स्थिर बलन: Difference between revisions
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> [[विरल सशर्त निरंतर प्रसार|विरल सशर्त अचर प्रसार]] के रूप में जाना जाने वाला अचर प्रसार का एक उन्नत रूप अचर को उपयुक्त रूप से प्रसारित कर सकता है और साथ ही [[मृत कोड|मृत कूट]] को हटा सकता है। | |||
== | == अचर फोल्डिंग == | ||
अचर फोल्डिंग, रनटाइम पर गणना करने के अतिरिक्त [[संकलन समय]] पर अचर अभिव्यक्तियों को पहचानने और मूल्यांकन करने की प्रक्रिया है। अचर अभिव्यक्तियों में शर्तें सामान्यतः सरल शाब्दिक होती हैं, जैसे [[पूर्णांक शाब्दिक]] <code>2</code>, परंतु वे अचर भी हो सकते हैं जिनके मान संकलन समय पर ज्ञात होते हैं। निम्नलिखित कथन पर विचार करें: | |||
i = 320 * 200 * 32; | i = 320 * 200 * 32; | ||
अधिकांश कंपाइलर वास्तव में इस कथन के लिए दो गुणा निर्देश और स्टोर उत्पन्न नहीं करेंगे। इसके अतिरिक्त, वे इन जैसे कन्स्ट्रक्ट की पहचान करते हैं और गणना किए गए मानो को संकलन समय पर प्रतिस्थापित करते हैं जैसे इस परिप्रेक्ष्य में, <code>2,048,000</code>। | अधिकांश कंपाइलर वास्तव में इस कथन के लिए दो गुणा निर्देश और स्टोर उत्पन्न नहीं करेंगे। इसके अतिरिक्त, वे इन जैसे कन्स्ट्रक्ट की पहचान करते हैं और गणना किए गए मानो को संकलन समय पर प्रतिस्थापित करते हैं जैसे इस परिप्रेक्ष्य में, <code>2,048,000</code>। | ||
अचर फोल्डिंग से अंकगणितीय सर्वसमिकाओं का उपयोग किया जा सकता है। अगर <code>x</code> संख्यात्मक है तो<code>0 * x</code>का मान शून्य होगा भले ही संकलक<code>x</code>का मूल्य नहीं जानता हो। ध्यान दें कि यह IEEE_754 के बाद से मान्य नहीं है क्योंकि <code>x</code> अनंत हो सकता है। फिर भी, कुछ वातावरण जो प्रदर्शन के पक्ष में हैं जैसे [[जीएलएसएल]] शेडर्स इसे अचर के लिए अनुमति देते हैं, जो कभी-कभी बग का कारण बन सकते हैं। | |||
अचर फोल्डिंग केवल संख्याओं पर प्रारंभ हो सकता है। [[शाब्दिक स्ट्रिंग]] और अचर स्ट्रिंग्स के संयोजन को अचर फोल्ड किया जा सकता है तथा कोड जैसे की <code>"abc" + "def"</code> को <code>"abcdef"</code>से प्रतिस्थापित किया जा सकता है . | |||
== | == अचर फोल्डिंग और क्रॉस संकलन == | ||
एक [[क्रॉस कंपाइलर]] को | एक [[क्रॉस कंपाइलर]] को प्रारंभ करने में, यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि होस्ट स्थापत्य पर अंकगणितीय परिचालनों का व्यवहार लक्ष्य स्थापत्य के समान होता है, अन्यथा अचर फोल्डिंग को सक्षम करने से फलन के व्यवहार में बदलाव आएगा। [[तैरनेवाला स्थल|चार स्थल]] संक्रियाओ के परिप्रेक्ष्य में इसका विशेष महत्व है, जिसका सटीक कार्यान्वयन व्यापक रूप से भिन्न हो सकता है। | ||
== | == अचर प्रचार == | ||
अचर प्रसार, संकलन समय पर भावों में ज्ञात स्थिरांक के मानों को प्रतिस्थापित करने की प्रक्रिया है। इस तरह के स्थिरांक में वे सम्मिलित हैं जो ऊपर परिभाषित किए गए हैं, साथ ही अचर मानों पर प्रारंभ [[आंतरिक कार्य]] भी सम्मिलित हैं। निम्नलिखित स्यूडोकोड पर विचार करें: | |||
int x = 14; | int x = 14; | ||
Line 33: | Line 33: | ||
int y = 0; | int y = 0; | ||
return 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; | |||
जैसा <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>का मूल्यांकन करता है। | |||
इसी तरह का एक और अनुकूलन | |||
यदि यह स्यूडोकोड किसी | |||
== यह भी देखें == | == यह भी देखें == |
Revision as of 20:10, 6 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
का मूल्यांकन करता है।
यह भी देखें
- नियंत्रण-प्रवाह ग्राफ
- उपयोग-परिभाषित श्रृंखला और एसएसए फॉर्म
- कॉपी प्रचार
- सामान्य उप-अभिव्यक्ति उन्मूलन
- आंशिक मूल्यांकन
संदर्भ
- ↑ 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.
- ↑ 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
अग्रिम पठन
- Muchnick, Steven S. (1997), Advanced Compiler Design and Implementation, Morgan Kaufmann, ISBN 9781558603202