Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2218 / 892 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 15:

Выбор инструкций при генерации кода

Грамматики восходящего переписывания


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

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

Неформально говоря, каждое правило описывает либо машинную команду, либо ее операнд. Стоимость при этом отображает некоторое представление о сложности команды или операнда.

Представление вывода в BURS


Аналогично обычным деревянным грамматикам, построим разметку дерева, описывающую его вывод в BURS-грамматике. Поскольку BURS-грамматика однозначна, каждый нетерминал может быть выведен только одним правилом (точнее, достаточно помнить только одно правило, которое доставляет вывод наименьшей стоимости). Кроме того, в разметку будет входить число, соответствующее стоимости данного вывода.

Если же поддерево с корнем в текущей вершине невыводимо из данного нетерминала, то будем считать, что существует вывод бесконечной стоимости.

Динамическое программирование


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

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