स्थिर बलन

From Vigyanwiki
Revision as of 16:07, 17 February 2023 by alpha>Indicwiki (Created page with "{{Short description|Type of compiler optimization}} लगातार फोल्डिंग और निरंतर प्रसार संबंधित अनु...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

लगातार तह

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

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

 मैं = 320 * 200 * 32;

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

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

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

लगातार मोड़ना केवल संख्याओं से अधिक पर लागू हो सकता है। शाब्दिक स्ट्रिंग और निरंतर स्ट्रिंग्स के संयोजन को लगातार मोड़ा जा सकता है। कोड जैसे "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


अग्रिम पठन