स्थिर बलन
चर फोल्डिंग और प्रसार संबंधित अनुकूलन संकलक हैं जो कई आधुनिक कंपाइलर्स द्वारा उपयोग किए जाते हैं।[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;
परिभाषा विश्लेषण परिणामों तक पहुँचने का उपयोग करके कंपाइलरों में चर प्रसार प्रारंभ किया जाता है। यदि सभी चर की परिभाषा तक पहुँचना एक ही क्रिया है जो चर को एक समान स्थिरांक प्रदान करता है, तो चर का एक स्थिर मान होता है और इसे अन्य चर से प्रतिस्थापित किया जा सकता है।
चर प्रसार भी उपबंधी शाखाओं को एक या अधिक उपबंधरहित कथनों को सरल बनाने का कारण बन सकता है, जब केवल संभावित परिणाम निर्धारित करने के लिए संकलन समय पर औपबंधिक समीकरणों का सही या गलत मूल्यांकन किया जा सकता है।
कार्रवाई में अनुकूलन
चर फोल्डिंग और प्रसार सामान्यतः कई सरलीकरण और कटौती को प्राप्त करने के लिए एक साथ उपयोग किया जाता है, जब तक कि कोई और परिवर्तन न हो जाए। इस अडॉप्टिमाइज्ड स्यूडोकोड पर विचार करें जो यादृच्छिक संख्या पीढ़ी लौटाता है:
<वाक्यविन्यास लैंग = सी>
इंट ए = 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
फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।
यह भी देखें
- नियंत्रण-प्रवाह ग्राफ
- उपयोग-परिभाषित श्रृंखला और एसएसए फॉर्म
- कॉपी प्रचार
- सामान्य उप-अभिव्यक्ति उन्मूलन
- आंशिक मूल्यांकन
संदर्भ
- ↑ 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