ВУЗ:
Составители:
52
Методы преобразования исходной программы зависят от синтаксических
конструкций исходного языка. Теоретически разработаны методы оптимизации
для многих типовых конструкций языков программирования. Однако рассмот-
рим мы только методы оптимизации линейных участков – они встречаются в
любой программе и составляют существенную часть программного кода.
Линейный участок программы – это выполняемая по порядку последова-
тельность операций, имеющая один вход и один выход. Чаще всего линейный
участок содержит последовательность арифметических операций и операторов
присвоения значений переменным.
Но прежде чем перейти к вопросам оптимизации линейных участков рас-
смотрим их внутреннее представление в компиляторе.
Алгоритм генерации объектного кода по дереву вывода
Возможны различные формы внутреннего представления синтаксических
конструкций исходной программы в компиляторе, к примеру, на этапе синтак-
сического разбора часто используется форма, именуемая деревом вывода. Од-
нако такая форма представления оказывается неудобной в работе при генера-
ции и оптимизации объектного кода. Поэтому перед оптимизацией и непосред-
ственно генерацией объектного кода внутреннее представление программы
преобразуется в одну из соответствующих форм записи. Примерами таких
форм записи являются:
• обратная польская запись операций;
• тетрады операций;
• триады операций;
• собственно команды ассемблера.
Обратная польская запись – это постфиксная запись операций. Преимуще-
ством ее является то, что все операции записываются непосредственно в поряд-
ке их выполнения. Она особенно эффективна в тех случаях, когда для вычисле-
ний используется стек.
Тетрады представляют собой запись операций в форме из четырех состав-
ляющих: <операция>(<операнд1>,<операнд2>,<результат>). Тетрады ис-
пользуются редко, так как требуют больше памяти для своего представления,
чем триады, не отражают взаимосвязи операций и, кроме того, плохо отобра-
жаются в команды ассемблера и машинные коды, так как в наборах команд
большинства современных машин нет операций с тремя операндами.
Триады представляют собой запись операций в форме из трех составляю-
щих: <операция>(<операнд1>,<операнд2>), при этом один или оба операнда
могут быть ссылками на другую триаду в том случае, если в качестве операнда
данной триады выступает результат выполнения другой триады. Поэтому триа-
ды при записи последовательно номеруют для удобства указания ссылок одних
триад на другие. Например, выражение A := B*C + D - B*10, записанное в виде
триад будет иметь вид:
1) * ( B, C ); 2) + ( ^1, D ); 3) * ( B, 10 ); 4) - ( ^2, ^3 ); 5) := ( A, ^4 )
Страницы
- « первая
- ‹ предыдущая
- …
- 48
- 49
- 50
- 51
- 52
- …
- следующая ›
- последняя »