Ключевая разница - машинно-зависимая и машинно-независимая оптимизация кода
Компьютерные программы представляют собой наборы инструкций, данных оборудованию для выполнения задач. Эти программы в основном написаны на языках высокого уровня, и компьютер не понимает этот язык. Поэтому компилятор используется для преобразования этих инструкций в машинный код или целевой код. Он проходит несколько этапов для создания целевого кода. Оптимизация кода - одна из них. Существует два метода оптимизации, такие как машинно-зависимая и машинно-независимая оптимизация кода. Ключевое различие между машинно-зависимой и машинно-независимой оптимизацией кода заключается в том, что машинно-зависимая оптимизация применяется к объектному коду, а машинно-независимая оптимизация кода применяется к промежуточному коду.
Что такое машинно-зависимая оптимизация кода?
При преобразовании исходного кода в объектный или целевой код компилятор проходит несколько этапов. Сначала исходный код передается лексическому анализатору, который производит токены. Затем выходные данные передаются анализатору синтаксиса, который исследует, находятся ли сгенерированные токены в логическом порядке. Этот вывод передается семантическому анализатору. Предположим, что существует фрагмент кода вида p=q + r;
Здесь p, q - целые числа, а r - число с плавающей запятой. С помощью семантического анализатора целочисленная переменная c преобразуется в число с плавающей запятой. Поэтому он выполняет семантический анализ. Выход семантического анализатора поступает в генератор промежуточного кода. Он возвращает промежуточный код, который затем отправляется оптимизатору кода. Оптимизация кода - это процесс устранения несущественных операторов программы без изменения смысла фактического исходного кода. Это не обязательная оптимизация, но она может улучшить время работы целевого кода. Вывод оптимизатора кода передается генератору кода, и, наконец, целевой код строится.
Рисунок 01: Фазы компилятора
При машинно-зависимой оптимизации кода оптимизация применяется к исходному коду. Выделение достаточного количества ресурсов может улучшить выполнение программы в этой оптимизации.
Что такое машинно-независимая оптимизация кода?
Когда оптимизация выполняется для промежуточного кода, это называется машинно-независимой оптимизацией кода. Существуют различные методы достижения машинно-независимой оптимизации кода. Они описаны на следующих примерах.
Прочитайте следующие строки кода.
for (j=0; j<10; j++) {
b=x+2;
a[j]=5 j;
}
Согласно приведенному выше коду, b=x+2 вычисляется снова и снова на каждой итерации. После того, как b вычислено, оно не меняется. Итак, эту строку можно поместить вне цикла следующим образом.
b=x+2;
for (j=0; j< 10; j++)
{a[j]=5j;
}
Это называется движением кода.
Прочитайте следующие строки кода.
j=5;
if (j==10) {
a=b+20;
}
Согласно приведенному выше коду, блок if никогда не будет выполняться, потому что значение j никогда не будет равно 10. Оно уже инициализировано значением 5. Следовательно, этот блок if можно удалить. Этот метод является устранением мертвого кода.
Другой метод – снижение силы. Арифметические операции, такие как умножение, требуют больше памяти, времени и циклов процессора. Эти дорогостоящие выражения можно заменить дешевыми выражениями, такими как b=a2; или может быть заменен добавлением, b=a + a;
См. приведенный ниже код.
for (j=1; j <=5; j ++) {
значение=j5;
}
Вместо умножения код можно изменить следующим образом.
int temp=5;
for (j=1; j<=5; j++) {
temp=temp + 5;
значение=темп;
}
Выражения, являющиеся константами, можно вычислять во время выполнения. Это называется постоянным сворачиванием. Можно указать, например, b[j+1]=c [j+1];
Вместо этого его можно изменить следующим образом.
n=j +1;
b[n]=c[n];
Могут быть следующие циклы.
for (j=0; j<5; j++) {
printf("a\n");
}
for (j=0; j <5; j++) {
printf("b\n");
}
Вывод a и b, оба имеют одинаковое количество итераций. Оба могут быть объединены в один цикл for следующим образом.
for (j=0; j <5; j++) {
printf("a\n");
printf("b\n");
}
Еще одна важная техника - удаление общих подвыражений. Это замена идентичных выражений одной переменной для выполнения вычислений. См. приведенный ниже код.
a=bc + k;
d=b c + m;
Этот код можно преобразовать следующим образом.
temp=bc;
a=temp + k;
d=темп + м;
Не нужно снова и снова вычислять bc. Умноженное значение можно сохранить в переменной и использовать повторно.
В чем сходство между машинно-зависимой и машинно-независимой оптимизацией кода?
Оба относятся к оптимизации кода
В чем разница между машинно-зависимой и машинно-независимой оптимизацией кода?
Машинно-зависимая и машинно-независимая оптимизация кода |
|
Машинно-зависимая оптимизация кода применяется к объектному коду. | Машинно-независимая оптимизация кода применяется к промежуточному коду. |
Вовлечение в аппаратное обеспечение | |
Машинно-зависимая оптимизация включает регистры ЦП и абсолютные ссылки на память. | Машинно-независимая оптимизация кода не использует регистры ЦП или абсолютные ссылки на память. |
Резюме – машинно-зависимая и машинно-независимая оптимизация кода
Оптимизация кода состоит из двух методов оптимизации, а именно машинно-зависимой и машинно-независимой оптимизации кода. Разница между машинно-зависимой и машинно-независимой оптимизацией кода заключается в том, что машинно-зависимая оптимизация применяется к объектному коду, тогда как машинно-независимая оптимизация кода применяется к промежуточному коду.
Загрузить PDF-версию машинно-зависимой и машинно-независимой оптимизации кода
Вы можете загрузить PDF-версию этой статьи и использовать ее в автономном режиме в соответствии с примечанием к цитированию. Пожалуйста, загрузите PDF-версию здесь. Разница между машинно-зависимой и машинно-независимой оптимизацией кода