- •Лабораторная работа № 1 Работа с таблицей символов
- •Краткие теоретические сведения Простейшие способы организации таблицы идентификаторов
- •Принципы работы хеш-функций
- •Построение таблиц идентификаторов на основе хеш-функций
- •Построение таблиц идентификаторов по методу цепочек
- •Комбинированные способы построения таблиц идентификаторов
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 2 Проектирование лексического анализатора
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 3 Построение простейшего дерева вывода
- •Краткие теоретические сведения
- •Распознавание цепочек кс-языков
- •Грамматики предшествования
- •Алгоритм “сдвиг-свертка” для грамматик простого и операторного предшествования
- •Общий алгоритм работы синтаксического анализатора
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты исходных грамматик
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 4 Генерация и оптимизация объектного кода
- •Краткие теоретические сведения
- •Алгоритм генерации объектного кода по дереву вывода
- •Построение ассемблерного кода по дереву вывода
- •Построение списка триад по дереву вывода.
- •Оптимизация объектного кода методом свертки
- •Оптимизация объектного кода методом исключения лишних операций
- •Общий алгоритм генерации и оптимизации объектного кода
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 5 Определения объема памяти для структур данных
- •Краткие теоретические сведения Принципы распределения памяти
- •Виды переменных и областей памяти Распределение памяти для переменных скалярных типов
- •Распределение памяти для сложных структур данных
- •Выравнивание границ областей памяти
- •Виды областей памяти. Статическое и динамическое связывание Глобальная и локальная память
- •Статическая и динамическая память
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты исходных грамматик
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 6 Разработка простейшего приложения на основе технологии «клиент-сервер»
- •Краткие теоретические сведения Методы организации распределенных вычислений
- •Технология odbc
- •Технологии ole db и ado
- •Поддержка технологий доступа к субд в системах программирования
- •Проблемы и недостатки архитектуры «клиент-сервер»
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
Общий алгоритм генерации и оптимизации объектного кода
Теперь рассмотрим общий вариант алгоритма генерации кода, который получает на входе дерево вывода (построенное в результате синтаксического разбора) и создает по нему фрагмент объектного кода линейного участка результирующей программы.
Алгоритм должен выполнить следующую последовательность действий:
построить последовательность триад на основе дерева вывода;
выполнить оптимизацию кода методом свертки;
выполнить оптимизацию кода методом исключения лишних операций;
преобразовать последовательность триад в последовательность команд на языке ассемблера (полученная последовательность команд и будет результатом выполнения алгоритма).
Алгоритм преобразования триад в команды языка ассемблера - это единственная машинно-зависимая часть общего алгоритма. При преобразовании компилятора для работы с другим результирующим объектным кодом потребуется изменить только эту часть, при этом все алгоритмы оптимизации и внутреннее представление программы останутся неизменными.
В данной работе алгоритм преобразования триад в команды языка ассемблера предлагается разработать самостоятельно. В тривиальном виде такой алгоритм заменяет каждую триаду на последовательность соответствующих команд, а результат ее выполнения запоминается во временной переменной с некоторым именем (например, TMPi, где i - номер триады). Тогда вместо ссылки на эту триаду в другой триаде будет подставлено значение этой переменной. Однако алгоритм может предусматривать и оптимизацию временных переменных.
Порядок выполнения работы
Получить вариант задания у преподавателя.
Изучить алгоритм генерации объектного кода по дереву синтаксического разбора.
Разработать фрагменты объектного кода, реализующие на языке ассемблера простейшие операции в заданной грамматике.
Выполнить генерацию объектного кода вручную для выбранного простейшего примера. Проверить корректность результата.
Изучить алгоритмы оптимизации результирующего кода методом свертки и методом исключения лишних операций.
Подготовить и защитить отчет.
Написать и отладить программу на ЭВМ.
Сдать работающую программу преподавателю.
Требования к оформлению отчета
Отчет должен содержать следующие разделы:
Задание по лабораторной работе.
Краткое изложение цели работы.
Запись заданной грамматики входного языка в форме Бэкуса-Наура.
Фрагменты объектного кода на языке ассемблера для операций заданной грамматики.
Простейший пример генерации кода по дереву синтаксического разбора.
Текст программы (оформляется после выполнения программы на ЭВМ по согласованию с преподавателем).
Основные контрольные вопросы
Что такое транслятор, компилятор и интерпретатор? Расскажите об общей структуре компилятора.
Как строится дерево вывода (синтаксического разбора)? Какие исходные данные необходимы для его построения ?
Объясните работу алгоритма генерации объектного кода по дереву синтаксического разбора.
Расскажите, что такое синтаксически управляемый перевод.
За счет чего обеспечивается возможность генерации кода на разных объектных языках по одному и тому же дереву?
Какую роль выполняет генерация объектного кода в процессе компиляции?
Какие данные необходимы компилятору для генерации объектного кода? Какие действия выполняет компилятор перед генерацией?
Дайте определение понятию оптимизации программы. Для чего используется оптимизация?
Объясните, почему генерацию программы приходится проводить в два этапа: генерация и оптимизация.
Какие существуют методы оптимизации объектного кода?
Что такое триады и для чего они используются? Какие еще существуют методы для представления объектных команд?
Объясните работу алгоритма свертки.
Что такое лишняя операция? Что такое “число зависимости”?
Объясните работу алгоритма исключения лишних операций.
