Файл: Содержание Введение Глава Генерация кода. Методы генерации кода.docx

ВУЗ: Не указан

Категория: Реферат

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 62

Скачиваний: 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.

Выполнение такого рода операций можно исключить из текста программы, если известен инвариантный для них операнд. Этот метод оптимизации имеет смысл в сочетании с методом свертки операций.

Оптимизация передачи параметров в процедуры и функции

Выше рассмотрен метод передачи параметров в процедуры и функции через стек. Этот метод применим к большинству языков программирования и используется практически во всех современных компиляторах для различных архитектур це­левых вычислительных систем (на которых выполняется результирующая про­грамма).

Данный метод прост в реализации и имеет хорошую аппаратную поддержку во многих архитектурах. Однако он является неэффективным в том случае, если процедура или функция выполняет несложные вычисления над небольшим ко­личеством параметров. Тогда всякий раз при вызове процедуры или функции компилятор будет создавать объектный код для размещения ее фактических па­раметров в стеке, а при выходе из нее — код для освобождения ячеек, занятых параметрами. При выполнении результирующей программы этот код будет за­действован. Если процедура или функция выполняет небольшие по объему вы­числения, код для размещения параметров в стеке и доступа к ним может состав­лять существенную часть ко всему коду, созданному для этой процедуры или функции. А если эта функция вызывается многократно, то этот код будет замет­но снижать эффективность ее выполнения.


Заключение
В результате проведенного исследования были изучены общие принципы генерации кода, рассмотрены основные методы генерации кода и проанализированы методы оптимизации кода.

Изучение принципов генерации кода позволило выделить основные этапы процесса генерации кода и определить ключевые алгоритмы, которые используются в этом процессе. Рассмотрение методов генерации кода позволило ознакомиться с различными подходами к созданию программного кода. Анализ основных методов оптимизации кода показал, что существует множество техник и инструментов, которые способствуют улучшению производительности программного кода, такие как оптимизация циклов, использование более эффективных алгоритмов и структур данных, а также использование специальных оптимизирующих компиляторов.

В целом, изучение темы кодогенерации позволило получить представление о том, как создается программный код, какие методы используются для его автоматической генерации и как можно улучшить его производительность. Это может быть полезно для разработчиков, которые хотят оптимизировать свой код или создавать генераторы кода, а также для исследователей, которые занимаются исследованием этой темы

Список используемой литературы .


  1. А.Якобсон, Г.Буч, Дж.Рамбо, Унифицированный процесс разработки программного обеспечения, 2020 – 496 c.

  2.  Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум. – СПб.: Питер, 2018 – 284 с.

  3.   Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов. 3-е изд. — СПб.: Питер, 2018 — 400 с.

  4.   Свердлов С.З. Языки программирования и методы трансляции: учеб. пособие. — СПб.: Питер, 2019 — 400 с.



Список используемых электронных источников

  1. https://martinfowler.com/tags/code generation.html 

  2. https://www.codeproject.com/ 

  3. https://modeling-languages.com/