- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Загальний алгоритм генерації й оптимізації об'єктного коду
Тепер розглянемо загальний варіант алгоритму генерації коду, що одержує на вході дерево висновку (побудоване в результаті синтаксичного розбору) і створює по ньому фрагмент об'єктного коду результуючої програми. Алгоритм повинен виконати наступну послідовність дій:
побудувати послідовність тріад на основі дерева висновку;
виконати оптимізацію коду методом згортки для лінійних ділянок результуючої програми;
виконати оптимізацію коду методом виключення зайвих операцій для лінійних ділянок результуючої програми;
перетворити послідовність тріад у послідовність команд мовою асемблера (отримана послідовність команд і буде результатом виконання алгоритму).
Алгоритм перетворення тріад у команди мови асемблера - це єдина машинно-залежна частина загального алгоритму. При перетворенні компілятора для роботи з іншим результуючим об'єктним кодом буде потрібно поставити тільки цю частину, при цьому всі алгоритми оптимізації й внутрішнє подання програми залишаться незмінними.
У даній роботі алгоритм перетворення тріад у команди мови асемблера пропонується розробити самостійно. У тривіальному виді такий алгоритм заміняє кожну тріаду на послідовність відповідних команд, а результат її виконання запам'ятовується в часовий змінній з деяким ім'ям (наприклад ТМРi, де i - номер тріади). Тоді замість посилання на цю тріаду в іншій тріаді буде підставлене значення цієї змінної. Однак алгоритм може передбачати й оптимізацію тимчасових змінних.
Вимоги до виконання роботи Порядок виконання роботи
Для виконання лабораторної роботи потрібно написати програму, що на підставі дерева синтаксичного розбору породжує об'єктний код і виконує потім його оптимізацію методом згортки об'єктного коду й методом виключення зайвих операцій. Як вихідне дерево синтаксичного розбору рекомендується взяти дерево, що породжує програма, побудована за завданням лабораторної роботи № 3.
Програму рекомендується побудувати із трьох основних частин: перша частина - породження дерева синтаксичного розбору (за результатами лабораторної роботи №3), друга частина - реалізація алгоритму породження об'єктного коду по дереву розбору й третя частина - оптимізація породженого об'єктного коду (якщо в результуючій програмі присутні лінійні ділянки коду). Результатом роботи повинна бути побудована на основі заданої пропозиції граматики програма на об'єктній мові або побудованій послідовності тріад (за узгодженням з викладачем вибирається форма подання кінцевого результату).
Як об'єктну мову пропонується обрати мову асемблера для процесорів типу Intel 80x86 у реальному режимі (можливий вибір іншої об'єктної мови за узгодженням з викладачем). Всі ідентифікатори, що зустрічаються у вихідній програмі, уважати простими скалярними змінними, не потребуючими виконання перетворення типів. Обмеження на довжину ідентифікаторів і констант відповідають вимогам лабораторної роботи № 3.
Одержати варіант завдання у викладача.
Вивчити алгоритм генерації об'єктного коду по дереву синтаксичного розбору.
Розробити схеми Су-перекладу для операцій вихідної мови відповідно до заданої граматики.
Виконати генерацію послідовності тріад вручну для обраного найпростішого приклада. Перевірити коректність результату.
Вивчити й реалізувати (якщо потрібно) для заданої вхідної мови алгоритми оптимізації результуючого коду методом згортки й методом виключення зайвих операцій.
Розробити алгоритм перетворення послідовності тріад у заданий об'єктний код (за узгодженням з викладачем).
Підготувати й захистити звіт.
Написати й налагодити програму на ЕОМ.
Здати працюючу програму викладачеві.
Вимоги до оформлення звіту
Звіт повинен містити наступні розділи:
Завдання по лабораторній роботі.
Короткий виклад мети роботи.
Запис заданої граматики вхідної мови у формі Бекуса-Наура.
Опис схем СУ-перекладу для операцій вихідної мови відповідно до заданої граматики.
Приклад генерації й оптимізації послідовності тріад на основі найпростішої вихідної програми.
Текст програми (оформляється після виконання програми на ЕОМ).
Основні контрольні питання
Що таке транслятор, компілятор і інтерпретатор? Розкажіть про загальну структуру компілятора.
Як будується дерево висновку (синтаксичного розбору)? Які вихідні дані необхідні для його побудови?
Яку роль виконує генерація об'єктного коду? Які дані необхідні компілятороу для генерації об'єктного коду? Які дії виконує компілятор перед генерацією?
Поясніть, чому генерація об'єктного коду виконується компілятором по окремих синтаксичних конструкціях, а не для всієї вихідної програми в цілому.
Розкажіть, що таке синтаксично керований переклад.
Поясніть роботу алгоритму генерації послідовності тріад по дереву синтаксичного розбору на своєму прикладі.
За рахунок чого забезпечується можливість генерації коду на різних об'єктних мовах по тому самому дереву?
Дайте визначення поняттю оптимізації програми. Для чого використовується оптимізація? Яким умовам повинна задовольняти оптимізація?
Поясніть, чому генерацію програми доводиться проводити у два етапи: генерація й оптимізація.
Які існують методи оптимізації об'єктного коду?
Що таке тріади й для чого вони використовуються? Які ще існують методи для подання об'єктних команд?
Поясніть роботу алгоритму згортки. Приведіть приклад виконання згортки об'єктного коду.
Що таке зайва операція? Що таке число залежності?
Поясніть роботу алгоритму виключення зайвих операцій. Приведіть приклад виключення зайвих операцій.
Варіанти завдань
Варіанти завдань відповідають варіантам завдань для лабораторної роботи №3. Для виконання роботи рекомендується використовувати результати, отримані в ході виконання лабораторних робіт № 2 і 3.
