में स्थानीय चर क्यों हैं, एक स्टैक-आधारित मध्यवर्ती भाषा, जैसे सीआईएल या जावा बाइटकोड में, स्थानीय चर क्यों हैं? कोई केवल स्टैक का उपयोग कर सकता है। हाथ से तैयार आईएल के लिए इतना आसान नहीं हो सकता है, लेकिन एक कंपाइलर निश्चित रूप से ऐसा कर सकता है। लेकिन मेरा सी # कंपाइलर नहीं करता है।स्टैक-आधारित आईएल बाइटकोड
दोनों स्टैक और स्थानीय चर विधि के लिए निजी हैं और विधि लौटने पर दायरे से बाहर निकलते हैं। तो विधि के बाहर से (अन्य धागे से) दिखाई देने वाले दुष्प्रभावों के साथ इसका कोई संबंध नहीं हो सका।
एक जेआईटी कंपाइलर मशीन कोड उत्पन्न करते समय लोड स्टॉक्स और स्थानीय चर दोनों को लोड और स्टोर को खत्म कर देगा, यदि मैं सही हूं, तो जेआईटी कंपाइलर को स्थानीय चर की आवश्यकता भी नहीं दिखती है।
दूसरी तरफ, सी # कंपाइलर स्थानीय चर के लिए भार और स्टोर उत्पन्न करता है, भले ही ऑप्टिमाइज़ेशन सक्षम हो। क्यूं कर?
उदाहरण के लिए लें, तो निम्न काल्पनिक उदाहरण कोड:
static int X()
{
int a = 3;
int b = 5;
int c = a + b;
int d;
if (c > 5)
d = 13;
else
d = 14;
c += d;
return c;
}
जब सी # में संकलित, अनुकूलन के साथ, यह पैदा करता है:
ldc.i4.3 # Load constant int 3
stloc.0 # Store in local var 0
ldc.i4.5 # Load constant int 5
stloc.1 # Store in local var 1
ldloc.0 # Load from local var 0
ldloc.1 # Load from local var 1
add # Add
stloc.2 # Store in local var 2
ldloc.2 # Load from local var 2
ldc.i4.5 # Load constant int 5
ble.s label1 # If less than, goto label1
ldc.i4.s 13 # Load constant int 13
stloc.3 # Store in local var 3
br.s label2 # Goto label2
label1:
ldc.i4.s 14 # Load constant int 14
stloc.3 # Store in local var 3
label2:
ldloc.2 # Load from local var 2
ldloc.3 # Load from local var 3
add # Add
stloc.2 # Store in local var 2
ldloc.2 # Load from local var 2
ret # Return the value
नोट से चार भार और दुकानों स्थानीय चर मैं किसी भी स्थानीय चर का उपयोग किये बिना सटीक एक ही ऑपरेशन (स्पष्ट निरंतर प्रचार अनुकूलन को अनदेखा कर सकता हूं) लिख सकता हूं।
ldc.i4.3 # Load constant int 3
ldc.i4.5 # Load constant int 5
add # Add
dup # Duplicate top stack element
ldc.i4.5 # Load constant int 5
ble.s label1 # If less than, goto label1
ldc.i4.s 13 # Load constant int 13
br.s label2 # Goto label2
label1:
ldc.i4.s 14 # Load constant int 14
label2:
add # Add
ret # Return the value
यह मेरे लिए सही लगता है, और बहुत कम और अधिक कुशल। तो, स्टैक-आधारित इंटरमीडिएट भाषाओं में स्थानीय चर क्यों हैं? और अनुकूलन संकलक उन्हें इतनी व्यापक रूप से क्यों उपयोग करता है?
आप अपने उदाहरण में प्रदर्शन के रूप में * हमेशा * इतना आसान परिवर्तन नहीं कर सकते हैं। –
क्या यह सवाल पूछ रहा है कि क्यों "नामित स्लॉट" आवश्यक हैं * या क्यों सी # "अनुकूलित" आउटपुट अत्यधिक वर्बोज़ दिखता है (उदाहरण के लिए * इस मामले में * उपयोग किया जाता है)? –
यहां तक कि यदि कुछ मामलों में "नामित स्लॉट" की आवश्यकता होती है या उपयोगी होती है (कौन सा मामला?), ऑप्टिमाइज़िंग कंपाइलर अधिकांश लोड और स्टोर को क्यों खत्म नहीं करता है? यह बहुत तुच्छ लगता है। मेरा कुछ छूट रहा है। – Virtlink