यह आशुलिपि नहीं है।
+=
प्रतीक 1970 के दशक में सी भाषा में दिखाई दिया, और - "स्मार्ट कोडांतरक" का एक स्पष्ट रूप से अलग मशीन शिक्षा और को संबोधित मोड के अनुरूप सी विचार के साथ:
" i=i+1
", "i+=1
"और" ++i
" जैसी चीजें , हालांकि एक सार स्तर पर एक ही प्रभाव पैदा करती हैं, प्रोसेसर के काम करने के एक अलग तरीके से निम्न स्तर पर मेल खाती हैं।
विशेष रूप से उन तीन अभिव्यक्तियों को मानते हुए, i
चर एक सीपीयू रजिस्टर में संग्रहीत मेमोरी एड्रेस में रहता है (इसे नाम दें D
- इसे "इंट्रूडर टू इंट" के रूप में सोचें) और प्रोसेसर का ALU एक पैरामीटर लेता है और एक में परिणाम देता है "संचायक" (इसे ए कहते हैं - इसे इंट के रूप में सोचें)।
इन बाधाओं (उस अवधि से सभी माइक्रोप्रोसेसरों में बहुत आम) के साथ, अनुवाद की संभावना सबसे अधिक होगी
;i = i+1;
MOV A,(D); //Move in A the content of the memory whose address is in D
ADD A, 1; //The addition of an inlined constant
MOV (D) A; //Move the result back to i (this is the '=' of the expression)
;i+=1;
ADD (D),1; //Add an inlined constant to a memory address stored value
;++i;
INC (D); //Just "tick" a memory located counter
इसे करने का पहला तरीका असत्य है, लेकिन निरंतर ( ADD A, B
या ADD A, (D+x)
) के बजाय चरों के साथ काम करते समय यह अधिक सामान्य है और अधिक जटिल अभिव्यक्तियों का अनुवाद करते समय (वे सभी एक स्टैक में कम प्राथमिकता वाले ऑपरेशन में उबलते हैं, उच्च प्राथमिकता कहते हैं, पॉप और तब तक दोहराएं जब तक कि सभी तर्क समाप्त नहीं हो गए)।
दूसरा "राज्य मशीन" का अधिक विशिष्ट है: हम अब "एक अभिव्यक्ति का मूल्यांकन" नहीं कर रहे हैं, लेकिन "एक मान का संचालन कर रहे हैं": हम अभी भी एएलयू का उपयोग करते हैं, लेकिन पैरामीटर को बदलने के लिए अनुमत परिणाम होने के आसपास बढ़ते मूल्यों से बचें। इस तरह के निर्देश का उपयोग नहीं किया जा सकता है जहां अधिक जटिल अभिव्यक्ति की आवश्यकता होती है: i = 3*i + i-2
जगह में संचालित नहीं किया जा सकता है, क्योंकि i
अधिक बार आवश्यक है।
तीसरा-सादा सरल- "जोड़" के विचार पर भी विचार नहीं करता है, लेकिन एक काउंटर के लिए अधिक "आदिम" (कम्प्यूटेशनल अर्थ में) सर्किटरी का उपयोग करता है। निर्देश को छोटा किया जाता है, तेजी से लोड होता है और तुरंत क्रियान्वित होता है, क्योंकि एक काउंटर को छोटा करने के लिए एक कोड को फिर से जोड़ने के लिए आवश्यक दहनशील नेटवर्क होता है, और इसलिए पूर्ण-योजक में से एक से अधिक तेजी से होता है।
समसामयिक संकलक (अब तक, C का संदर्भ लें) के साथ, संकलक अनुकूलन को सक्षम करते हुए, पत्राचार को सुविधा के आधार पर स्वैप किया जा सकता है, लेकिन शब्दार्थ में अभी भी एक वैचारिक अंतर है।
x += 5
माध्यम
- X द्वारा पहचाने गए स्थान का पता लगाएं
- इसमें 5 जोड़ दें
लेकिन x = x + 5
इसका मतलब है:
- X + 5 का मूल्यांकन करें
- X द्वारा पहचाने गए स्थान का पता लगाएं
- एक्स को एक संचायक में कॉपी करें
- संचायक में 5 जोड़ें
- परिणाम को x में संग्रहीत करें
- X द्वारा पहचाने गए स्थान का पता लगाएं
- संचायक को इसकी प्रतिलिपि दें
बेशक, अनुकूलन कर सकते हैं
- यदि "खोज एक्स" का कोई साइड इफेक्ट नहीं है, तो दो "खोज" एक बार किया जा सकता है (और एक्स एक पॉइंटर रजिस्टर में संग्रहीत पता बन जाता है)
- यदि
&x
संचायक के बजाय ADD को लागू किया जाता है, तो दो प्रतियों को निकाला जा सकता है
इस प्रकार x += 5
एक के संयोग से अनुकूलित कोड बनाना ।
लेकिन यह केवल तभी किया जा सकता है जब "फाइंडिंग एक्स" का कोई साइड इफेक्ट न हो, अन्यथा
*(x()) = *(x()) + 5;
तथा
*(x()) += 5;
शब्दशः भिन्न हैं, क्योंकि x()
साइड इफेक्ट्स (स्वीकार x()
करना एक फ़ंक्शन है जो चारों ओर अजीब चीजें कर रहा है और वापस आ रहा है int*
) दो बार या एक बार उत्पादित किया जाएगा।
के बीच समानता है x = x + y
और x += y
इसलिए विशेष मामले के कारण है जहां +=
और =
प्रत्यक्ष एल-मूल्य पर लागू होते हैं।
पायथन में जाने के लिए, इसे सी से सिंटैक्स विरासत में मिला है, लेकिन चूंकि कोई व्याख्या / अनुवाद नहीं है, इसलिए व्याख्या की गई भाषाओं में निष्पादन से पहले, चीजें आवश्यक रूप से इतनी गहन रूप से संबंधित नहीं होती हैं (क्योंकि एक कम पार्सिंग चरण है)। हालांकि, एक दुभाषिया अभिव्यक्ति के तीन प्रकारों के लिए अलग-अलग निष्पादन दिनचर्या का उल्लेख कर सकता है, अभिव्यक्ति के गठन और मूल्यांकन के संदर्भ के आधार पर विभिन्न मशीन कोड का लाभ उठाता है।
किसके लिए अधिक विवरण पसंद है ...
हर सीपीयू में एक ALU (अंकगणित-तार्किक इकाई) होती है, जो कि बहुत सार में, एक कॉम्बीनेटरियल नेटवर्क है जिसके इनपुट और आउटपुट को रजिस्टरों के लिए "प्लग" किया जाता है और / या मेमोरी को निर्देश के opcode पर निर्भर करता है।
बाइनरी ऑपरेशंस को आमतौर पर "कहीं" लिए गए इनपुट के साथ "एक संचायक रजिस्टर के संशोधक" के रूप में लागू किया जाता है, जहां कहीं भी हो सकता है - निर्देश प्रवाह के अंदर ही (प्रकट प्रतियोगी के लिए विशिष्ट: ADD A 5) - एक अन्य रजिस्ट्री के अंदर (अभिव्यक्ति की गणना के लिए विशिष्ट) टेंपरेरी: जैसे ADD AB) - मेमोरी के अंदर, एक रजिस्टर द्वारा दिए गए पते पर (जैसे कि विशिष्ट डेटा प्राप्त करने का उदाहरण: ADD A (H)) - H, इस मामले में, एक डेरेफ़रिंग पॉइंटर की तरह काम करते हैं।
इस छद्मकोश के साथ, x += 5
है
ADD (X) 5
जबकि x = x+5
है
MOVE A (X)
ADD A 5
MOVE (X) A
यही है, x + 5 एक अस्थायी देता है जिसे बाद में सौंपा गया है। x += 5
एक्स पर सीधे काम करता है।
वास्तविक कार्यान्वयन प्रोसेसर के वास्तविक अनुदेश सेट पर निर्भर करता है: यदि कोई ADD (.) c
ओपकोड नहीं है , तो पहला कोड दूसरा बन जाता है: कोई रास्ता नहीं।
यदि ऐसा कोई ओपकोड है, और ऑप्टिमाइज़ेशन सक्षम है, तो दूसरी अभिव्यक्ति, रिवर्स मूव्स को समाप्त करने और रजिस्टरों के ओपकोड को समायोजित करने के बाद, पहली बन जाती है।
x += 5
हैx = x + 5
? या क्या यह वास्तव में सिर्फ सिंथेटिक चीनी है जैसा कि आप सुझाव देते हैं?