Файл: Содержание Введение Глава Генерация кода. Методы генерации кода.docx
Добавлен: 07.11.2023
Просмотров: 72
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
2.2.Общие принципы оптимизации кода
Оптимизация линейных участков программы Принципы оптимизации линейных участков
Линейный участок программы — это выполняемая по порядку последовательность операций, имеющая один вход и один выход. Чаще всего линейный участок содержит последовательность вычислений, состоящих из арифметических операций и операторов присвоения значений переменным.
Любая программа предусматривает выполнение вычислений и присваивания значений, поэтому линейные участки встречаются в любой программе. В реальных программах они составляют существенную часть программного кода. Поэтому для линейных участков разработан широкий спектр методов оптимизации кода.
Кроме того, характерной особенностью любого линейного участка является последовательный порядок выполнения операций, входящих в его состав. Ни одна операция в составе линейного участка программы не может быть пропущена, ни одна операция не может быть выполнена большее число раз, чем соседние с нею операции (иначе этот фрагмент программы просто не будет линейным участком). Это существенно упрощает задачу оптимизации линейных участков программ. Поскольку все операции линейного участка выполняются последовательно, их можно пронумеровать в порядке их выполнения.
Для операций, составляющих линейный участок программы, могут применяться следующие виды оптимизирующих преобразований:
-
удаление бесполезных присваиваний; -
исключение избыточных вычислений (лишних операций); -
свертка операций объектного кода; -
перестановка операций; -
арифметические преобразования.
Исключение лишних операций
Алгоритм исключения лишних операций просматривает операции в порядке их следования. Так же как и алгоритму свертки, алгоритму исключения лишних операций проще всего работать с триадами, потому что они полностью отражают взаимосвязь операций. Рассмотрим алгоритм исключения лишних операций для триад.
Чтобы следить за внутренней зависимостью переменных и триад, алгоритм присваивает им некоторые значения, называемые числами зависимости
, по следующим правилам:
-
изначально для каждой переменной ее число зависимости равно 0, так как в на чале работы программы значение переменной не зависит ни от какой триады; -
после обработки i -й триады, в которой переменной А присваивается некото рое значение, число зависимости A (dep(A)) получает значение i, так как зна чение А теперь зависит от данной i -й триады; -
при обработке i-й триады ее число зависимости (dep(i)) принимается равным значению 1+(максимальное из чисел зависимости операндов).
Другие методы оптимизации программ Оптимизация вычисления логических выражений
Особенность оптимизации логических выражений заключается в том, что не всегда необходимо полностью выполнять вычисление всего выражения для того, чтобы знать его результат. Иногда по результату первой операции или даже по значению одного операнда можно заранее определить результат вычисления всего выражения.
Операция называется предопределенной для некоторого значения операнда, если ее результат зависит только от этого операнда и остается неизменным (инвариантным) относительно значений других операндов.
Операция логического сложения (ог) является предопределенной для логического значения «истина» (true), а операция логического умножения — предопределена для логического значения «ложь» (false).
Эти факты могут быть использованы для оптимизации логических выражений. Действительно, получив значение «истина» в последовательности логических сложений или значение «ложь» в последовательности логических умножений, нет никакой необходимости далее производить вычисления — результат уже определен и известен.
Например, выражение А ог В ог С or D не имеет смысла вычислять, если известно, что значение переменной А есть True («истина»).
Компиляторы строят объектный код вычисления логических выражений таким образом, что вычисление выражения прекращается сразу же, как только его значение становится предопределенным. Это позволяет ускорить вычисления при выполнении результирующей программы. В сочетании с преобразованиями логических выражений на основе тождеств булевой алгебры и перестановкой операций эффективность данного метода может быть несколько увеличена.
Не всегда такие преобразования инвариантны к смыслу программы. Например, при вычислении выражения A or F(B) or G(C) функции F и G не будут вызваны и выполнены, если значением переменной А является true. Это не важно, если результатом этих функций является только возвращаемое ими значение, но если они обладают «побочным эффектом» (о котором было сказано выше в замечаниях), то семантика программы может измениться.
В большинстве случаев современные компиляторы позволяют исключить такого рода оптимизацию, и тогда все логические выражения будут вычисляться до конца, без учета предопределенности результата. Однако лучше избегать такого
Хорошим стилем считается также принимать во внимание эту особенность вычисления логических выражений. Тогда операнды в логических выражениях следует стремиться располагать таким образом, чтобы в первую очередь вычислялись те из них, которые чаще определяют все значение выражения. Кроме того, значения функций лучше вычислять в конце, а не в начале логического выражения, чтобы избежать лишних обращений к ним. Так, рассмотренное выше выражение лучше записывать и вычислять в порядке A or F(B) or G(C), чем в порядке F(6) or G(C) or A.
He только логические операции могут иметь предопределенный результат. Некоторые математические операции и функции также обладают этим свойством. Например, умножение на 0 не имеет смысла выполнять.
Другой пример такого рода преобразований — это исключение вычислений для инвариантных операндов.
Операция называется инвариантной относительно некоторого значения операнда, если ее результат не зависит от этого значения операнда и определяется другими операндами.
Например, логическое сложение (or) инвариантно относительно значения «ложь» (False), логическое умножение (and).— относительно значения «истина»; алгебраическое сложение инвариантно относительно 0, а алгебраическое умножение — относительно 1.
Выполнение такого рода операций можно исключить из текста программы, если известен инвариантный для них операнд. Этот метод оптимизации имеет смысл в сочетании с методом свертки операций.
Оптимизация передачи параметров в процедуры и функции
Выше рассмотрен метод передачи параметров в процедуры и функции через стек. Этот метод применим к большинству языков программирования и используется практически во всех современных компиляторах для различных архитектур целевых вычислительных систем (на которых выполняется результирующая программа).
Данный метод прост в реализации и имеет хорошую аппаратную поддержку во многих архитектурах. Однако он является неэффективным в том случае, если процедура или функция выполняет несложные вычисления над небольшим количеством параметров. Тогда всякий раз при вызове процедуры или функции компилятор будет создавать объектный код для размещения ее фактических параметров в стеке, а при выходе из нее — код для освобождения ячеек, занятых параметрами. При выполнении результирующей программы этот код будет задействован. Если процедура или функция выполняет небольшие по объему вычисления, код для размещения параметров в стеке и доступа к ним может составлять существенную часть ко всему коду, созданному для этой процедуры или функции. А если эта функция вызывается многократно, то этот код будет заметно снижать эффективность ее выполнения.
Заключение
В результате проведенного исследования были изучены общие принципы генерации кода, рассмотрены основные методы генерации кода и проанализированы методы оптимизации кода.
Изучение принципов генерации кода позволило выделить основные этапы процесса генерации кода и определить ключевые алгоритмы, которые используются в этом процессе. Рассмотрение методов генерации кода позволило ознакомиться с различными подходами к созданию программного кода. Анализ основных методов оптимизации кода показал, что существует множество техник и инструментов, которые способствуют улучшению производительности программного кода, такие как оптимизация циклов, использование более эффективных алгоритмов и структур данных, а также использование специальных оптимизирующих компиляторов.
В целом, изучение темы кодогенерации позволило получить представление о том, как создается программный код, какие методы используются для его автоматической генерации и как можно улучшить его производительность. Это может быть полезно для разработчиков, которые хотят оптимизировать свой код или создавать генераторы кода, а также для исследователей, которые занимаются исследованием этой темы
Список используемой литературы .
-
А.Якобсон, Г.Буч, Дж.Рамбо, Унифицированный процесс разработки программного обеспечения, 2020 – 496 c. -
Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум. – СПб.: Питер, 2018 – 284 с. -
Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов. 3-е изд. — СПб.: Питер, 2018 — 400 с. -
Свердлов С.З. Языки программирования и методы трансляции: учеб. пособие. — СПб.: Питер, 2019 — 400 с.
Список используемых электронных источников
-
https://martinfowler.com/tags/code generation.html -
https://www.codeproject.com/ -
https://modeling-languages.com/