সংকলকটি আপনার কোডটি নেয়, এটিকে খুব সাধারণ নির্দেশিকায় বিভক্ত করে এবং তারপরে পুনরায় সংযুক্ত করে সেগুলি এমনভাবে সাজিয়ে তোলে যাতে এটি সর্বোত্তম মনে করে।
কোড
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
এবং এখন আপনি ভিজুয়াল সি ++ আপনাকে যে ফলাফল দিচ্ছেন তা পেয়েছেন।
নোট করুন যে উভয় অপটিমাইজেশন পাথে, গুরুত্বপূর্ণ ক্রমের নির্ভরতাগুলি সংরক্ষণ করা হয়েছিল, কারণ কিছুই করার জন্য নির্দেশাবলী সরানো হয়নি।