Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

37

 

 

 

LOAD

=0.98

 

 

 

 

 

STORE $2

 

 

 

 

 

LOAD

TAX

 

 

 

 

 

STORE $1

 

 

 

 

 

LOAD

PRICE

 

 

 

 

n3

ADD

$1

 

 

 

 

 

 

MPY

$2

 

 

 

 

 

 

STORE COST

 

=0.98

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

STORE $2

 

 

 

 

 

 

 

LOAD

TAX

<ИД1>

 

 

 

 

n2

STORE $1

 

 

 

 

LOAD

PRICE

=

 

 

cost

 

 

 

 

ADD

$1

 

 

 

 

 

 

 

 

 

 

 

MPY

$2

TAX

 

 

 

 

 

 

 

 

STORE $1

 

 

 

 

 

 

n1

*

<ИД4>

 

LOAD

PRICE

 

ADD

$1

 

 

 

 

 

0.98

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<ИД2>

+

 

<ИД3>

 

 

 

PRICE

 

 

TAX

 

 

Рис. 2.4. Дерево с генерированными кодами

2.8. Оптимизация кода

Во многих случаях желательно иметь компилятор, который бы создавал эффективно работающие объектные программы. Термин оптимизация кода применяется к попыткам сделать объектные программы более «эффективными», т.е. быстрее работающими или более компактными.

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

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

38

Поэтому в общем случае термин«оптимизация» совершенно неправильный – на практике мы должны довольствоватьсяулучшением кода. На разных стадиях процесса компиляции применяются различные приемы улучшения кода.

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

Преобразования можно проводить в различные моменты компиляции, начиная от входной программы, заканчивая фазой генерации кода.

Более подробно оптимизацией кода мы займемся далее.

Сейчас рассмотрим лишь те приемы, которые делают код более коротким.

1) Если + - коммутативная операция, то можно заменить последовательность команд LOAD a; ADD b; последовательностью LOAD b; ADD a. Требуется, однако, чтобы в других местах не было перехода к оператору ADD b.

2)Подобным же образом, если * - коммутативная операция, то можно заменить LOAD a; MPY b на LOAD b; MPY a.

3)Последовательность операторов типа STORE a; LOAD a можно удалить из программы при условии, что либо ячейка a не будет использоваться далее, либо перед использованием ячейка a будет заполнена заново.

4)Последовательность LOAD a; STORE b; можно удалить, если за ней следует другой операторLOAD и нет перехода к оператору STORE b, а последующие вхождения b будут заменены на a вплоть до того места, где появится другой операторSTORE

b.

Рассмотрим наш пример. Мы получили программу (табл. 2.3).