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

9.9.5 Назначение памяти атрибутам во время компиляции

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

Пример 41

Предположим, что атрибуты вычисляются в порядке, заданном номерами узлов в графе зависимости на рис. 64(б), построенном в последнем примере. Время жизни каж­дого узла начинается в момент вычисления его атрибута и заканчивается, когда этот ат­рибут используется в последний раз. Например, время жизни узла 1 заканчивается, когда вычислен атрибут узла 2, поскольку 2 — единственный узел, зависящий от 1. Аналогич­но время жизни узла 2 заканчивается при вычислении атрибута узла 6.

На рис. 65 показано вычисление атрибутов с использованием минимально возможного количества регистров. Узлы графа зависимости D дерева разбора рассматриваются в порядке их вычисления. Изначально имеется пул регистров r1, r2, … . Ес­ли атрибут b определен семантическим правилом b:=f1, с2, …,сk), то при вычислении b может закончиться время жизни одного или нескольких сi. Соответствующие им реги­стры освобождаются после вычисления b. По возможности b вычисляется в регистре, хранившем один из с1, с2, …,сk.

Рис.65. Регистры, используемые для значений атрибутов на рис. 55

Регистры, используемые в процессе вычисления графа зависимостей на рис. 64(б), по­казаны на рис. 65. Вычисления начинаются с узла 1 в регистре r1. Время жизни узла 1 заканчивается при вычислении узла 2, поэтому узел 2 использует тот же регистр r1. Узел 3 получает новый регистр r2, поскольку значение узла 2 потребуется при вычислении узла 6.

9.9.6 Устранение копий

Можно усовершенствовать метод, приведенный на рис. 65, рассматривая прави­ла копирования как специальный случай. Правило копирования имеет вид

b := с, так что если значение с находится в регистре r, то там же автоматически размещается и значение b. Количество атрибутов, определяемых правилами копирования, может оказаться зна­чительным, и явного копирования желательно избегать.

При рассмотрении узла т вначале прове­ряется, не определяется ли его значение правилом копирования. Если это так, следова­тельно, его значение уже находится в регистре и т присоединяется к классу эквивалент­ности со значением в этом регистре. Кроме того, такой регистр возвращается в пул только в конце времени жизни всех узлов со значениями в этом регистре.

Пример 42

На ри­сунке использован знак равенства для указания узлов, определяемых правилом копиро­вания. Исходя из синтаксически управляемого определения на рис. 63, находим, что тип, определенный в узле 1, копируется в каждый элемент списка идентификаторов; в результате узлы 2, 3, 6 и 7 на рис. 64 являются копиями 1.

Рис. 66. Использование регистров с учетом правил копирования

Поскольку 2 и З являются копиями 1, их значения могут быть получены из регистра r1 на рис. 66. Время жизни 3 заканчивается при вычислении 5, но регистр r1, хранящий значение 3, не возвращается при этом в пул, поскольку еще не за­вершено время жизни 2 из класса эквивалентности.

Вопросы

1) Какие существуют способы записи семантических правил в компиляторах?

2) Какие атрибуты называются синтезированными и наследуемыми?

3) В чем основные различия между наследуемыми и синтезируемыми атрибутами?

4) Как используется стек для вычисления значений атрибутов?

5) Что представляет собой правило вычисления атрибутов?

Список литературы

1. Гордеев А.В., Молчанов А.Б. Системное программное обеспечение. – СПб.: Питер, 2002.– 736 с.: ил.

2. Карпов Ю.Г. Теория и технология программирования. Основы построения трансляторов. – СПб.: БХВ-Петербург, 2005. – 272 с. : ил.

3. Ахо Альфред, Сети Равви, Ульман Джеффри Компиляторы: принципы, технологии и инструменты. : Пер. с англ. – М. : Издательский дом «Вильямс», 2001. – 768 с. : ил.

4. Опалева Э.А., Самойленко В.П. Языки программирования и методы трансляции. – СПб. : БХВ-Петербург, 2005. – 480 с. : ил.

5. Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программирование. Основы построения трансляторов. – СПб.: КОРОНА принт, 2000. – 256 с.