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

From Vigyanwiki
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;
  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>x</code> संख्यात्मक है तो<code>0 * x</code>का मान शून्य होगा भले ही संकलक<code>x</code>का मूल्य नहीं जानता हो। ध्यान दें कि यह IEEE_754 के बाद से मान्य नहीं है क्योंकि <code>x</code> अनंत हो सकता है। फिर भी, कुछ वातावरण जो प्रदर्शन के पक्ष में हैं जैसे [[जीएलएसएल]] शेडर्स इसे अचर के लिए अनुमति देते हैं, जो कभी-कभी बग का कारण बन सकते हैं।


चर फोल्डिंग केवल संख्याओं पर लागू हो सकता है। [[शाब्दिक स्ट्रिंग]] और चर स्ट्रिंग्स के संयोजन को चर फोल्ड किया जा सकता है तथा कोड जैसे की <code>"abc" + "def"</code> को <code>"abcdef"</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);
  इंट ए = 30;
  int c;
  इंट बी = 9 - (/ 5);
   इंट सी;
  c = b * 4;
  if (c > 10) {
      c = c - 10;
  }
  return c * (60 / a);
अचर प्रसार को एक बार प्रारंभ करना, उसके बाद अचर फोल्डिंग करने पर निम्नलिखित स्यूडोकोड प्राप्त होता है
   int a = 30;


  सी = बी * 4;
  int b = 3;
  अगर (सी> 10) {
  int c;
    सी = सी - 10;
  }
  c = b * 4;
  वापसी सी * (60 / ए);
  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;
  इंट ए = 30;
  इंट बी = 3;
  if (true) {
  इंट सी;
      c = 2;
  }
  return c * 2;
उपरोक्त कोड में, <code>true</code> के अतिरिक्त यह या तों 1 या कोई अन्य बूलियन कन्स्ट्रक्ट हो सकता है। पारंपरिक अचर प्रचार के साथ हमें मात्र इतना ही अनुकूलन प्राप्त होगा। यह फलन की संरचना को परिवर्तित नहीं सकता है।


  सी = बी * 4;
इसी तरह का एक और अनुकूलन, जिसे विरल औपबंधिक अचर प्रसार कहा जाता है, जिसमे <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>का मूल्यांकन करेगा,  और कोड को अत्यधिक संकुचित करते हुए स्वयं का अंत किया जा सकता है:
  अगर (सी> 10) {
   return 4;
    सी = सी - 10;
यदि यह स्यूडोकोड किसी फलन के निकाय का गठन करता है, तो संकलक उस ज्ञान का लाभ उठा सकता है जो फलनों में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ प्राप्त करने के लिए अचर पूर्णांक <code>4</code>का मूल्यांकन करता है।
  }
  वापसी सी * 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> फ़ंक्शन में अनावश्यक कॉल को समाप्त करने के लिए, और अधिक प्रदर्शन लाभ उत्पन्न करना।


== यह भी देखें ==
== यह भी देखें ==

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का मूल्यांकन करता है।

यह भी देखें

संदर्भ

  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


अग्रिम पठन