स्थिर बलन

From Vigyanwiki

अचर फोल्डिंग और प्रसार संबंधित अनुकूलन संकलक हैं जो कई आधुनिक कंपाइलर्स द्वारा उपयोग किए जाते हैं।[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


अग्रिम पठन