Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Skvortsov_vsyo_vmeste.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
1.4 Mб
Скачать

23 Машинно-зависимая оптимизация программ

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

Целью машинно-зависимой оптимизации является сокращение времени выполнения программы или объема занимаемой памяти.

Для оптимизации кода в пределах линейных участков могут использоваться следующие правила:

  1. Если сложение является коммутативной операцией, то последовательность команд

LOAD OP1 можно заменить LOAD OP2

ADD OP2 => ADD OP1

  1. Если умножение является коммутативной операцией, то последовательность команд

LOAD OP1 можно заменить LOAD OP2

MULT OP2 => MULT OP1

Эти 2 правила основаны на свойстве коммутативности операций и обеспечивают перестановку местами операндов в соответствующих тетрадах с целью получения пар команд, попадающих под действие третьего правила

3.Последовательность команд вида записи и чтения можно исключить из программы ( STORE OP, LOAD OP), если ячейка памяти с именем ОР далее не используется или перед использованием вновь определяется командой записи STORE OP. В противном случае из указанной пары команд всегда можно исключить вторую команду.

Третье правило означает следующее:

  1. Если какой либо операнд не потребуется далее, то его не нужно сохранять в памяти.

  2. Если этот операнд уже находится в сумматоре, то его не нужно загружать туда снова.

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

Их применение позволяет сократить длину полученного объектного кода , а так же уменьшить количество ячеек памяти, используемых для хранения промежуточных результатов.

Пример

Выполним оптимизацию кода A:= (B+D+A)* (D+B+C). Выполним действия предложенные этим правилом и в итоге получим:

LOAD B

ADD D

STORE T1

ADD A

STORE T2

LOAD C

ADD T1

MULT T2

STORE A

LOAD B

ADD D

3

STORE T1

LOAD T1

ADD A

STORE T2 =>

LOAD C

ADD T1

3

STORE T4

LOAD T4

STORE A

MULT T2

Замечание: При использовании оптим. правил следует учитывать, что для некоммутативных операций в сумматор должен 1-м загружаться операнд 1-ой операции, т.е. перестановка местами операндов недопустима.

24 Организация информационных таблиц транслятора с хеш-адресацией

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

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

Простейший вариант таблицы с хеш-адресацией может служить использованием кода внутреннего представления 1-го символа имени. В этом случае: ABD-01000001ый соответствует предствавлению символа – «А»

Схематично такой способ адресации:

Имя Хеш-функция

……………………..

0 1000001

0 1000010

………………………

0 1001001

………………………

Аргумент

Значение

АBD

В25

I


АBD

B25

I

С помощью хеш-функции каждое имя само указывает свое место в таблице. До тех пор, пока для двух различных имен результаты хеширования отличаются, время поиска элемента в таблице равно времени вычисления хеш-функции. Хеш-функция задает отображение множества имен на множество индексов элементов таблицы и в идеале должна давать различные значения для двух любых отличающихся имен. Но это невозможно, т.к. любой язык допускает бесконечное количество имен, а объем таблицы ограничен. Т.о. всегда возможен конфликт при попытке записи двух отличающихся имен в одну ячейку таблицы. Такой конфликт называется коллизией и возникает, когда для отличающихся имен значения хеш-функции совпадают. Коллизии можно разрешить 2 методами: рехеширование и методом цепочек.

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

Вычисление хеш-функции.

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

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

В трансляторах хеш-функция является более сложной и зависит как от кодов внутреннего представления символов имени, так и от его длины. Обобщенный алгоритм вычисления хеш-функции включает 2 шага:

1 шаг: Выполняется, если исходное имя s имеет длину более 1 машинного слова (4 байта). Из исходного имени s формируется код s’ длиной в одно машинное слово. Этот код получается суммированием всех слов исходного имени сложением или сложением по модулю 2. (В случае сложения, вместо s’ выбираются младшие разряды результата).

2 шаг: на основе s’ вычисл-ся индекс эл-та табл.если размер табл N=2K - Возможны варианты:

- s’* s’ и к средних битов результата выбирается в качестве значений хеш-функции.

- s’ делится на поля по к бит, эти разряды «+» и к младш бит рез-та берутся как знач хеш-ф

- знач хеш-ф: s’ mod N

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]