संकलक आपके कोड को लेता है, इसे बहुत ही सरल निर्देशों में विभाजित करता है, और फिर उन्हें पुन: संयोजन करता है और उन्हें इस तरह से व्यवस्थित करता है कि यह इष्टतम लगता है।
कोड
int i = 1;
int x = ++i + ++i;
निम्नलिखित निर्देश शामिल हैं:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
5. read i as tmp2
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
लेकिन इस तरह की संख्या सूची में होने के बावजूद मैंने इसे लिखा, यहां केवल कुछ आदेश निर्भरताएं हैं: 1-> 2-> 3-> 4-> 5-> 10-> 11 और 1-> 6-> 7- > 8-> 9-> 10-> 11 को अपने रिश्तेदार क्रम में रहना चाहिए। इसके अलावा संकलक स्वतंत्र रूप से फिर से काम कर सकते हैं, और शायद अतिरेक को खत्म कर सकते हैं।
उदाहरण के लिए, आप सूची को इस तरह से ऑर्डर कर सकते हैं:
1. store 1 in i
2. read i as tmp1
6. read i as tmp3
3. add 1 to tmp1
7. add 1 to tmp3
4. store tmp1 in i
8. store tmp3 in i
5. read i as tmp2
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
संकलक ऐसा क्यों कर सकता है? क्योंकि वेतन वृद्धि के दुष्प्रभावों के लिए कोई अनुक्रमण नहीं है। लेकिन अब कंपाइलर सरल कर सकता है: उदाहरण के लिए, 4 में एक मृत दुकान है: मान तुरंत अधिलेखित कर दिया गया है। इसके अलावा, tmp2 और tmp4 वास्तव में एक ही बात है।
1. store 1 in i
2. read i as tmp1
6. read i as tmp3
3. add 1 to tmp1
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
और अब tmp1 के साथ करने के लिए सब कुछ मृत कोड है: इसका उपयोग कभी नहीं किया जाता है। और मैं फिर से पढ़ा भी समाप्त किया जा सकता है:
1. store 1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
10. add tmp3 and tmp3, as tmp5
11. store tmp5 in x
देखो, यह कोड बहुत छोटा है। आशावादी खुश है। प्रोग्रामर नहीं है, क्योंकि मुझे केवल एक बार वेतन वृद्धि दी गई थी। उफ़।
आइए इसके बजाय कंपाइलर कुछ और कर सकता है: आइए मूल संस्करण पर वापस जाते हैं।
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
5. read i as tmp2
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
संकलक इसे इस तरह से पुन: व्यवस्थित कर सकता है:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
और फिर ध्यान दें कि मैं दो बार पढ़ा गया हूं, इसलिए उनमें से एक को समाप्त करें:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
यह अच्छा है, लेकिन यह आगे जा सकता है: यह tmp1 का पुन: उपयोग कर सकता है:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp1
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
तो यह 6 में i के पुनः पढ़ने को समाप्त कर सकता है:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
अब 4 एक मृत दुकान है:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
और अब 3 और 7 को एक निर्देश में मिलाया जा सकता है:
1. store 1 in i
2. read i as tmp1
3+7. add 2 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
अंतिम अस्थायी को हटा दें:
1. store 1 in i
2. read i as tmp1
3+7. add 2 to tmp1
8. store tmp1 in i
10. add tmp1 and tmp1, as tmp5
11. store tmp5 in x
और अब आपको वह परिणाम मिलता है जो Visual C ++ आपको दे रहा है।
ध्यान दें कि दोनों अनुकूलन रास्तों में, महत्वपूर्ण आदेश निर्भरताएं संरक्षित थीं, जो कुछ भी नहीं करने के लिए निर्देश नहीं हटाए गए थे।