Комп'ютерні програми - це набір інструкцій, наданих апаратному забезпеченню, для виконання завдань. Ці програми в основному написані мовами високого рівня, а комп'ютер не розуміє цієї мови. Тому компілятор використовується для перетворення цих інструкцій в машинний код або код цілі. Він проходить через кілька фаз для побудови цільового коду. Оптимізація коду є одним із них. Існує дві методи оптимізації, такі як машинна залежність та незалежна від машин оптимізація коду. The ключова різниця між машинною залежністю та машинною незалежною оптимізацією коду є те, що машинна залежна оптимізація застосовується до об'єктного коду, тоді як до проміжного коду застосовується незалежна оптимізація коду.
1. Огляд та ключові відмінності
2. Що таке машинна залежна оптимізація коду
3. Що таке машинна незалежна оптимізація коду
4. Подібність між залежною від машини та незалежною від оптимізації коду від машини
5. Поплечне порівняння - оптимізація коду, залежна від машини та незалежної машини, у табличній формі
6. Підсумок
При перетворенні вихідного коду в об'єктний або цільовий код компілятор проходить через кілька фаз. Спочатку вихідний код надається Лексичному аналізатору, який виробляє лексеми. Потім висновок надається аналізатору синтаксису, який досліджує, чи генеруються маркери в логічному порядку. Цей вихід надається семантичному аналізатору. Припустимо, що є фрагмент коду як p = q + r;
Тут p, q цілі числа, але r - поплавок. За допомогою семантичного аналізатора змінна c ціла величина перетворюється на float. Тому це робить семантичний аналіз. Вихід семантичного аналізатора надходить на генератор проміжного коду. Він повертає проміжний код, який потім переходить до оптимізатора коду. Оптимізація коду - це процес усунення несуттєвих програмних заяв без зміни значення фактичного вихідного коду. Це не обов'язкова оптимізація, але може покращити час роботи цільового коду. Вихід оптимізатора коду надається генератору коду, і, нарешті, будується цільовий код.
Малюнок 01: Фази компілятора
У машинозалежній оптимізації коду оптимізація застосовується до вихідного коду. Виділення достатньої кількості ресурсів може покращити виконання програми в цій оптимізації.
Коли оптимізація проводиться за проміжним кодом, вона називається машинною незалежною оптимізацією коду. Існують різні методи досягнення незалежної машинної оптимізації коду. Вони описані, використовуючи наступні приклади.
Прочитайте наступні рядки коду.
для (j = 0; j<10; j ++)
b = x + 2;
a [j] = 5 * j;
Згідно з наведеним вище кодом, b = x + 2 обчислюється знову і знову в кожній ітерації. Після обчислення b воно не змінюється. Отже, цю лінію можна розмістити поза петлею наступним чином.
b = x + 2;
для (j = 0; j< 10; j++)
a [j] = 5 * j;
Це називається рухом коду.
Прочитайте наступні рядки коду.
j = 5;
якщо (j == 10)
a = b + 20;
Згідно з вищезгаданим кодом, "якщо блок" ніколи не виконується, оскільки значення j ніколи не буде дорівнює 10. Це вже ініціалізовано до значення 5. Отже, цей блок можна видалити. Ця методика усунення мертвого коду.
Ще один метод - зниження міцності. Арифметичні операції, такі як множення, вимагають більше пам’яті, часу та циклів процесора. Ці дорогі вирази можна замінити дешевими виразами, такими як b = a * 2; або можна замінити додаванням, b = a + a;
Перегляньте наведений нижче код.
для (j = 1; j <= 5; j ++)
значення = j * 5;
Замість множення код можна змінити наступним чином.
int temp = 5;
для (j = 1; j<=5; j++)
temp = temp + 5;
значення = темп;
Можна оцінити вирази, які є константами під час виконання. Це називається постійне складання. Тут можна констатувати такі, як b [j + 1] = c [j + 1];
Натомість це можна змінити наступним чином.
n = j +1;
b [n] = c [n];
Петлі можуть бути наступними.
для (j = 0; j<5; j++)
printf ("a \ n");
для (j = 0; j <5; j++)
printf ("b \ n");
Друкуючи a і b, обидва мають однакову кількість ітерацій. Обидва можна комбінувати в один для циклу наступним чином.
для (j = 0; j <5; j++)
printf ("a \ n");
printf ("b \ n");
Ще одна важлива техніка - це Поширене усунення суб-виразів. Потрібно замінити однакові вирази однією змінною для обчислення. Посилайтеся на наступний код.
a = b * c + k;
d = b * c + m;
Цей код можна перетворити наступним чином.
temp = b * c;
a = temp + k;
d = темп + м;
Обчислювати b * c не потрібно знову і знову. Помножене значення можна зберігати у змінній та повторно використовувати.
Оптимізація коду від машини залежно від машини | |
До об'єктного коду застосовується машинно залежна оптимізація коду. | До проміжного коду застосовується машинна незалежна оптимізація коду. |
Залучення з обладнанням | |
Машинозалежна оптимізація включає регістри процесора та абсолютні посилання на пам'ять. | Машинна незалежна оптимізація коду не включає регістри процесора або абсолютні посилання на пам'ять. |
Оптимізація коду складається з двох методів оптимізації, а саме: машинно залежної та незалежної від машинної оптимізації коду. Різниця між залежною від машини та незалежною від машинного оптимізації коду полягає в тому, що машинна залежна оптимізація застосовується до об'єктного коду, тоді як до проміжного коду застосовується машинна незалежна оптимізація коду..
Ви можете завантажити PDF-версію цієї статті та використовувати її в офлайн-цілях відповідно до примітки. Завантажте тут версію PDF тут. Різниця між машинною залежністю від оптимізації коду від машини
1. «Дизайн компілятора | Оптимізація коду ». GeeksforGeeks. Доступний тут
2. Пункт, Підручники. «Дизайн компілятора - оптимізація коду». Www.tutorialspoint.com, Підручники, 15 серпня 2017. Доступно тут
3.Estudies4you. «Навчальний матеріал JNTUH CSE». Різниця між машинно залежною та незалежною оптимізацією коду. Доступний тут
1. 'Компілятор' І, Сурахіт, (CC BY-SA 3.0) через Wikimedia Commons