- •1. Инструментальные средства разработки программного обеспечения сапр
- •2. Абстрактные типы данных. Примеры и варианты реализации.
- •3. Прямые методы сортировки массивов
- •4. Быстрая сортировка
- •5. Сортировка Шелла
- •6. Пирамидальная сортировка.
- •7. Алгоритмы внешней сортировки (вс)
- •8. Бинарный поиск и поиск по бинарному дереву
- •9. Алгоритмы обхода бинарных деревьев и их применение в трансляции программ и обработке данных
- •10. Машинное представление деревьев.
- •11. Машинное представление графов
- •12. Процедура поиска в глубину и ее применение в задачах обработки данных
- •13. Формальные грамматики и языки. Классификация грамматик.
- •14. Синтаксические диаграммы
- •15. Фазы трансляции программ и варианты организации языковых процессоров
- •16. Лексический анализ программ. Организация работы сканера
- •17. Нисходящий грамматический разбор с возвратом.
- •18 Восходящий грамматический разбор программ.
- •19 Формы внутреннего представления программ в языковых процессорах сапр.
- •2. Польская запись.
- •20 Семантический анализ. Примеры организации семантических программ.
- •21. Машинно-независимая оптимизация программ
- •22 . Генерация кода в языковых процессорах сапр (Генерация кода в компиляторах)
- •23 Машинно-зависимая оптимизация программ
- •24 Организация информационных таблиц транслятора с хеш-адресацией
- •25 Методы разрешения коллизий в информационных таблицах с хэш-адресацией
- •Метод повторного хеширования (рехеширование)
- •Линейное рехеширование
- •Случайное рехеширование
- •Квадратичное рехеширование
- •Рехеширование – сложение
- •Метод цепочек
23 Машинно-зависимая оптимизация программ
В самом простом случае маш.зависим. оптимизация заключается в удалении из сформированной последовательности команд избыточных команд загрузки и чтения.
Целью машинно-зависимой оптимизации является сокращение времени выполнения программы или объема занимаемой памяти.
Для оптимизации кода в пределах линейных участков могут использоваться следующие правила:
Если сложение является коммутативной операцией, то последовательность команд
LOAD OP1 можно заменить LOAD OP2
ADD OP2 => ADD OP1
Если умножение является коммутативной операцией, то последовательность команд
LOAD OP1 можно заменить LOAD OP2
MULT OP2 => MULT OP1
Эти 2 правила основаны на свойстве коммутативности операций и обеспечивают перестановку местами операндов в соответствующих тетрадах с целью получения пар команд, попадающих под действие третьего правила
3.Последовательность команд вида записи и чтения можно исключить из программы ( STORE OP, LOAD OP), если ячейка памяти с именем ОР далее не используется или перед использованием вновь определяется командой записи STORE OP. В противном случае из указанной пары команд всегда можно исключить вторую команду.
Третье правило означает следующее:
Если какой либо операнд не потребуется далее, то его не нужно сохранять в памяти.
Если этот операнд уже находится в сумматоре, то его не нужно загружать туда снова.
Существуют и другие правила оптимизации кода, подобно перечисленным.
Их применение позволяет сократить длину полученного объектного кода , а так же уменьшить количество ячеек памяти, используемых для хранения промежуточных результатов.
Пример
Выполним оптимизацию кода 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
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 0 1000010 ……………………… 0 ……………………… |
Аргумент |
Значение |
А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

1000001
1001001