Компьютерные программы - это наборы инструкций, которые даются аппаратному обеспечению для выполнения задач. Эти программы в основном написаны на языках высокого уровня, и компьютер не понимает этот язык. Поэтому компилятор используется для преобразования этих инструкций в машинный код или целевой код. Он проходит несколько этапов для создания целевого кода. Оптимизация кода является одним из них. Существует два метода оптимизации, такие как машинно-зависимая и машинно-независимая оптимизация кода. ключевое отличие между машинно-зависимой и машинно-независимой оптимизацией кода заключается в том, что машинно-зависимая оптимизация применяется к объектному коду, а машинно-независимая оптимизация кода применяется к промежуточному коду.
1. Обзор и основные отличия
2. Что такое машинно-зависимая оптимизация кода
3. Что такое машинно-независимая оптимизация кода
4. Сходство между машинно-независимой и машинно-независимой оптимизацией кода
5. Сравнение бок о бок - машинно-зависимая и машинно-независимая оптимизация кода в табличной форме
6. Резюме
При преобразовании исходного кода в объектный код или целевой код компилятор проходит несколько этапов. Сначала исходный код передается анализатору Lexical, который выдает токены. Затем выходные данные передаются синтаксическому анализатору, который проверяет, находятся ли сгенерированные токены в логическом порядке. Этот вывод передается в семантический анализатор. Предположим, что есть фрагмент кода как p = q + r;
Здесь p, q - целые числа, а r - число с плавающей точкой. Используя семантический анализатор, целочисленная переменная c преобразуется в число с плавающей точкой. Следовательно, это делает семантический анализ. Выход семантического анализатора поступает в генератор промежуточного кода. Он возвращает промежуточный код, который затем отправляется оптимизатору кода. Оптимизация кода - это процесс устранения несущественных программных операторов без изменения смысла реального исходного кода. Это не обязательная оптимизация, но она может улучшить время выполнения целевого кода. Выходные данные оптимизатора кода передаются генератору кода, и, наконец, целевой код создается.
Рисунок 01: Фазы компилятора
При машинно-зависимой оптимизации кода оптимизация применяется к исходному коду. Выделение достаточного количества ресурсов может улучшить выполнение программы в этой оптимизации.
Когда оптимизация выполняется для промежуточного кода, она называется машинно-независимой оптимизацией кода. Существуют разные методы достижения машинно-независимой оптимизации кода. Они описаны с использованием следующих примеров.
Читайте ниже строки кода.
для (j = 0; j<10; j ++)
б = х + 2;
a [j] = 5 * j;
Согласно приведенному выше коду, b = x + 2 вычисляется снова и снова на каждой итерации. Как только b вычислено, оно не изменяется. Таким образом, эта строка может быть размещена вне цикла следующим образом.
б = х + 2;
для (j = 0; j< 10; j++)
a [j] = 5 * j;
Это называется движением кода.
Читайте ниже строки кода.
J = 5;
если (j == 10)
а = б + 20;
Согласно приведенному выше коду, «блок if» никогда не будет выполняться, поскольку значение j никогда не будет равно 10. Оно уже инициализировано значением 5. Следовательно, этот блок if можно удалить. Эта техника - устранение мертвого кода.
Другой метод - снижение прочности. Арифметические операции, такие как умножение, требуют больше памяти, времени и циклов ЦП. Эти дорогие выражения можно заменить дешевыми выражениями, такими как b = a * 2; или может быть заменено сложением, b = a + a;
См. Код ниже.
для (j = 1; j <= 5; j ++)
значение = j * 5;
Вместо умножения код можно изменить следующим образом.
int temp = 5;
для (j = 1; j<=5; j++)
темп = темп + 5;
значение = температура;
Можно оценить выражения, которые являются константами во время выполнения. Это называется постоянное складывание. Можно указать такие как b [j + 1] = c [j + 1];
Вместо этого его можно изменить следующим образом.
n = j +1;
b [n] = c [n];
Там могут быть петли следующим образом.
для (j = 0; j<5; j++)
Е ( «а \ п»);
для (j = 0; j <5; j++)
Е ( «б \ п»);
Печать a и b, оба имеют одинаковое количество итераций. Оба могут быть объединены в один для цикла следующим образом.
для (j = 0; j <5; j++)
printf («a \ n»);
Е ( «б \ п»);
Еще одна важная техника Устранение общего подвыражения. Это должно заменить идентичные выражения одной переменной, чтобы сделать расчет. См. Ниже код.
a = b * c + k;
д = б * с + м;
Этот код может быть преобразован следующим образом.
temp = b * c;
а = темп + к;
д = темп + м;
Не требуется вычислять b * c снова и снова. Умноженное значение может быть сохранено в переменной и использовано повторно.
Машинно-зависимая и машинно-независимая оптимизация кода | |
Машинно-зависимая оптимизация кода применяется к объектному коду. | Машинно-независимая оптимизация кода применяется к промежуточному коду. |
Вовлечение с оборудованием | |
Машинно-зависимая оптимизация включает регистры процессора и абсолютные ссылки на память. | Машинно-независимая оптимизация кода не включает регистры процессора или абсолютные ссылки на память. |
Оптимизация кода состоит из двух методов оптимизации, а именно: машинно-зависимой и машинно-независимой оптимизации кода. Разница между машинно-зависимой и машинно-независимой оптимизацией кода заключается в том, что машинно-зависимая оптимизация применяется к объектному коду, тогда как машинно-независимая оптимизация кода применяется к промежуточному коду..
Вы можете скачать PDF версию этой статьи и использовать ее в автономном режиме, как указано в примечании. Пожалуйста, загрузите PDF версию здесь Разница между машинно-независимой и машинно-независимой оптимизацией кода
1. «Дизайн компилятора | Оптимизация кода. » GeeksforGeeks. Доступна здесь
2.Point, учебники. «Дизайн компилятора - оптимизация кода» Www.tutorialspoint.com, Tutorials Point, 15 августа 2017 г. Доступно здесь
3.Estudies4you. «Учебные материалы JNTUH CSE». Разница между машинно-зависимой и независимой оптимизацией кода. Доступна здесь
1. 'Compiler' By I, Surachit, (CC BY-SA 3.0) с помощью Commons Wikimedia