Конкурсное задание подробное.ppt
- Количество слайдов: 19
Два подхода к управлению компиляцией: синтаксическое и событийное управление + Конкурсное задание 1
Содержание 1. Структура компилятора 2. Front-end компилятора и взаимодействие его компонентов 3. Событийный стиль программирования 4. Front-end компилятора в традиционном стиле синтаксического управления 5. Front-end компилятора в событийном стиле 6. Вопрос-задание 2
Задача компиляции Тексты компилируемой программы и встраиваемых библиотечных компонент Front-end Задача компилятора Внутреннее представление программы Создание внутреннего представления программы Middle-end Модифицированное внутреннее представление Архитекутурнонезависимая оптимизация Объектный код программы и библиотечных модулей Back-end Построение объектного кода 3
Структура компилятора (1) Тексты компилируемой программы и встраиваемых библиотечных компонент Front-end Внутреннее представление программы Создание внутреннего представления программы Лексический анализатор Синтаксический анализатор Middle-end Модифицированное внутреннее представление Архитекутурнонезависимая оптимизация Back-end Построение объектного кода int a ; float b 1 , b 2 ; // описания переменных a = 3 ; b 1 = 2. 3 ; b 2 = 0. 7 ; a = ( b 1 + b 2 ) / a ; print ( a ) a int b 1 Анализатор контекстных зависимостей Программа float b 2 = Генератор внутреннего представления a = = 3 b 1 2. 3 a цел вещ Значение = … b 2 print = 0. 7 a Значение = … b 1 Таблица имен Объектный код программы и библиотечных модулей / a a + b 1 b 2 4
Синтаксический анализ и вычисление предложения Грамматика E → T 1| E + T 2| E – T 3 T → I 4| T * I 5| T / I 6 I → ( E ) 7| N 8 ––––––––– N→D|DN D→ 1|2|3|4|5|6| 7|8|9|0 + + 4 E 7 T Дерево абстрактного синтаксиса 5 I 7 E 2 E T 4 T 8 52 4 I N 11 Дерево конкретного синтаксиса 2 1 I Дерево вычислений * 52 E 8 T I N + 4 T I 4 8 N * ( 7 Придумал Л. В, Канторович в 1953 г. 4 8 N + 11 )
Синтаксический анализ и вычисление предложения Грамматика E → T 1| E + T 2| E – T 3 T → I 4| T * I 5| T / I 6 I → ( E ) 7| N 8 ––––––––– N→D|DN D→ 1|2|3|4|5|6| 7|8|9|0 + + 4 E 7 T 1 Дерево абстрактного синтаксиса 7 E 2 E T 4 T 8 52 4 I N 11 5 I I Дерево вычислений * 52 E Дерево конкретного синтаксиса I 7 2 8 T I N + ( 4 T 8 N * ( 7 4 I 4 8 N + 11 ) ) Оба дерева конкретного синтаксиса имеют одно и то же дерево абстрактного синтаксиса
Структура компилятора (2) Тексты компилируемой программы и встраиваемых библиотечных компонент Front-end Внутреннее представление программы Создание внутреннего представления программы 1) b 1 заменить на 2. 3 2) b 2 заменить на 0. 7 3) 2. 3 + 0. 7 заменить на 3. 0 4) 3. 0 / a заменить на 1. 0: — подставить 3 вместо a — 5) удалить a : вычислить 3. 0 — удалить a = 3; т. к. / 3 есть— = 1. 0; a a заменить на 1. 0 = 1. 0; — удалить a — удалить int a; Таблица имен Middle-end Модифицированное внутреннее представление Архитекутурнонезависимая оптимизация Объектный код программы и библиотечных модулей Back-end Построение объектного кода int a ; float b 1 , b 2 ; // описания переменных a = 3 ; b 1 = 2. 3 ; = 0. 7 =a 1/ )( b 1 print(a(1))) ; print )()a ) b 2 = a a ; (( = a ; 0. 7 )b 2(a; a a ( ( a print 2. 3 3; +print/ / ) /; print a ; = ( 2. 3 b 2 ) 3. 0 + print 1. 0; + a int b 1 Программа float b 2 = a 3 b 1 2. 3 a цел вещ Значение = … b 2 вещ Значение = … 1. 0 / a 0. 7 Значение = … b 1 b 2 print = = = 3 a 3. 0 + 2. 3 b 1 1 a 0. 7 b 2 7
Структура компилятора (3) Тексты компилируемой программы и встраиваемых Внутреннее библиотечных представление компонент Front-end программы Middle-end Модифицированное внутреннее представление Объектный код программы и библиотечных модулей Back-end Создание внутреннего представления программы Архитекутурнонезависимая оптимизация Построение объектного кода Лексический анализатор Анализатор потоков данных и управления Архитекутурноориентированный оптимизатор Анализаторы зависимостей циклов и процедур Генератор объектного кода Синтаксический анализатор Анализатор контекстных зависимостей Генератор внутреннего представления Оптимизирующий преобразователь внутреннего представления программы Редактор связей 8
Front-end компилятора и взаимодействие его компонентов • Процессы Front-end’а компиляции: – Синтаксический анализ реализуется посредством анализаторов: • синтаксический (SA) разбирает поток (последовательность) лексем, рассматриваемых как неделимые единицы данных; если лексема не соответствует требованиям синтаксиса, то сообщает об ошибке • лексический (LA) — генерирует лексемы (для любого использования этого модуля безразлично, как это делается): <тип, атрибуты> – Анализ контекстных зависимостей – Генерация внутреннего представления идентификатора: Например, для • Процессы middle-end’а: • • Тип — имя, • Атрибуты —последовательность букв и – Архитекутурно-независимая оптимизация цифр, возможно, что-то еще про имя Семантические Процессы back-end’а: подпрограммы – Архитекутурно-ориентированная оптимизация – Генерация объектного кода 9
Front-end компилятора и взаимодействие его компонентов (2) int a ; float b 1 , b 2 ; // описания переменных a = 3 ; b 1 = 2. 3 ; b 2 = 0. 7 ; a = ( b 1 + b 2 ) / a ; print ( a ); SA. Построение дерева int Программа = float a / a b 1 = b 2 a = 3 b 1 = 2. 3 b 2 print + 0. 7 b 1 b 2 a a LA. Лексемы: Описатель целого Идентификатор Имя = ‘a’ Разделитель ‘; ’ Описатель вещественного Идентификатор Имя = ‘b 1’ Разделитель ‘, ’ Идентификатор Имя = ‘b 2’ Константа Имя = ‘ 3’ Разделитель ‘; ’ Идентификатор Имя = ‘a’ Знак операции Имя = ‘=’ Разделитель ‘; ’ Идентификатор Имя =‘b 1’ Знак операции Имя =‘=’ Константа Имя =‘ 2. 3’ Разделитель ‘; ’ Идентификатор Имя =‘b 2’ Знак операции Имя =‘=’ Константа Имя =‘ 0. 7’ Разделитель ‘; ’ Идентификатор Имя =‘a’ Знак операции Имя =‘=’ Скобка Имя =‘(’ Идентификатор Имя =‘b 1’ Знак операции Имя =‘+’ Идентификатор Имя =‘b 2’ Скобка Имя =‘)’ Знак операции Имя =‘/’ Идентификатор Имя =‘a’ Разделитель Имя =‘; ’ Идентификатор Имя = ‘Print’ Скобка Имя = ‘(’ Идентификатор Имя = ‘a’ Скобка Имя = ‘)’ Разделитель 10 Имя =‘; ’
Front-end компилятора в традиционном стиле синтаксического управления • LA : – пассивно ждет запрос на поставку лексемы – когда такой запрос поступает, читает символы и формирует из них одну лексему • SA: – вызывает подпрограмму из LA, поставляющую одну лексему, когда это требуется для анализа. SA ничего не знает о том, как реализуется его требование. – вызывает семантические подпрограммы, для выполнения нужных действий (см. выше). – может не вызывать подпрограмму, а планировать такой вызов в будущем, т. е. организовывать отложенную обработку • Вызываемые из SA подпрограммы могут иметь параметры: – например, SA может сообщить LA, что в текущем контексте требуется целое, и тогда символы “ 12. 5” трактуются как лексема <целое число 12>, или вещественное, и тогда эта последовательность порождает лексему <вещественное число 12> Дисциплина управления определяется действиями SA, который активизирует LA, и сам решает, как очередная полученная им лексема влияет на его поведение в соответствии с синтаксисом (для семантических подпрограмм — семантикой) транслируемого языка. 11
Событийный стиль программирования Основа управления для этого стиля — активизация выполнения программных единиц (определенных фрагментов программы: модулей, подпрограмм, …) в качестве реакций на распознаваемые события Другой (альтернативный) взгляд: программные единицы «знают» события, на которые они способны реагировать в текущий момент выполнения, распознавание есть часть функциональности программных единиц, которые не активизируют действия для «чужих» событий События трактуются максимально широко: это любое распознаваемое изменение обстановки, в которой происходят вычисления (контекст вычисления) 12
Событийный стиль программирования Распознавание: – определение программных единиц, которые должны реагировать на событие, – передача всем этим единицам сообщения, связанного с событием, т. е. информации, сопровождающей событие, – передача управления выделенным программным единицам; если их несколько, то определяется последовательное, параллельное или совместное их выполнение и очередность отработки реакций, когда это необходимо — дисциплина управления. Реакция: выполнение программной единицы, начинающееся в определенной точке программы (возможно, но необязательно с одной и той же). В ходе реакции могут изменяться: – локальные данные и другие атрибуты, относящиеся к реагирующей программной единице, – обстановка (глобальный контекст), включая свойства других программных единиц. 13
Front-end компилятора в событийном стиле – LA: • Каждый акт генерации лексемы сопровождается порождением события с сообщением, содержащим атрибуты лексемы – SA: • Ожидает события, которые порождает LA. Если это происходит, то • Выполняет реакцию на появление лексемы: все необходимые для анализа действия, если лексема соответствует требованиям синтаксиса, или сообщение об ошибке в противном случае • Генерирует события, на которые реагируют семантические подпрограммы • Может передавать в контекст выполнения LA полезную информацию для влияния на его поведение (аналог параметризации) Дисциплина управления определяется последовательностью (потоком) лексем, приходящих от LA, а когда синтаксис требует нескольких подпрограмм SA, реагирующих на одну и ту же лексему — правилами транслируемого языка. Сравним это с синтаксическим управлением: Дисциплина управления определяется действиями SA, который активизирует LA, и сам решает, как очередная полученная им лексема влияет на его поведение в соответствии с синтаксисом (для семантических подпрограмм — семантикой) транслируемого языка. 14
Вопрос-задание Почему обычно реализуют схему синтаксического управления компиляцией, а не событийно-ориентированное управление? Ответ мотивировать и обосновать. 15
«Очевидные» преимущества Синтаксическое управление Событийное управление 16
Конкретная формулировка задачи Какие особенности компиляции делают синтаксическое управление компиляцией более предпочтительным по сравнению с событийно-ориентированным управлением? В чем они проявляют себя: • в свойствах языка компилируемых программ? • в требованиях к системе программирования? • в требованиях к практическому использованию? Для каких процессов компиляции синтаксическое управление перестает быть предпочтительным (указать критерии предпочтения)? Когда это может приводить к решению об отказе от синтаксического управления? 17
Важное наблюдение • Возможность статического вычисления (т. е. заранее, до компиляции) всех вариантов последовательностей событий Þ Обобщение для метода программирования от событий: – Стоит всегда проверить это свойство с том, чтобы решать, применять или нет событийное управление 18
Спасибо за внимание! 19
Конкурсное задание подробное.ppt