
- •Лекція №1. Тема 1: Компілятори, інтерпретатори, критерії розробки, основні етапи та їх взаємозв’язок . Основні поняття.
- •Критерії розробки трансляторів:
- •Етапи трансляції:
- •Фази трансляції:
- •Лекція №2. Тема 2 : Лексичний аналізатор та його основні задачі. Основна задача лексичного аналізатора.
- •Макроалгоритм та структури даних лексичного аналізатора.
- •Структура даних для розпізнавання роздільників та знаків операцій.
- •Таблиця зарезервованих слів.
- •Таблиця ідентифікаторів.
- •Таблиця типів.
- •Таблиця типів, враховуючи блоки та процедури.
- •Лекція №3. Тема 3 : Синтаксичний аналіз.
- •Метод рекурсивного спуску.
- •Ll(1)-граматика.
- •Приведення до ll(1)-граматики.
- •Алгоритм перевірки належності граматики до класу ll(1)-граматик.
- •Лекція №4. Синтаксичний розбір за допомогою lr(1)-граматики.
- •Лекція №5. Формування lr-таблиці розбору.
- •Лекція №6. Тема 4 : Аналіз контекстних умов.
- •Аналіз контекстних умов за допомогою програмних граматик.
- •Класифікація програмних граматик:
- •Лекція №7. Граматики Ван Вейнгаарда.
- •Розбір з використанням граматики Ван Вейнгаарда та лінійно-обмеженого автомату.
- •Лекція №8. Тема 5 : Генерація коду. Метод включення дій в граматику.
- •Метод включення дій в граматику.
- •Розбір декларативної частини програми.
- •Лекція №9. Тема 6 : Розподіл пам’яті під час виконання (прогону).
- •Структури даних, які необхідні для генерації коду.
- •Лекція №10.
- •Лекція №11. Генерація коду для циклу for.
- •Генерація коду для циклу while.
- •Генерація коду для нескінченого циклу.
- •Генерація коду для декларативної частини програми.
- •Генерація коду вході в процедуру та виході з неї.
- •Лекція №12. Тема 7: Діагностика та виправлення помилок.
- •Точність діагностики помилок.
- •Виправлення помилок.
- •Діагностика помилок.
- •Лекція №13. Тема 8 : Проектування транслятора. Визначення кількості проходів під час трансляції.
- •Тема 9 : Оптимізація коду.
- •Локальна та глобальна оптимізація коду.
- •Критерії оптимізації.
- •Локальна оптимізація коду.
- •Оптимізація лінійної ділянки.
- •Глобальна оптимізація коду.
- •Тема 10 : Генератори компіляторів.
Оптимізація лінійної ділянки.
Лінійна ділянка (блок) програми
характеризується
,
де
P – послідовність операторів, дорівнює Bi (Bi типу a:=f(b1,…,bn));
B0 – означає для вхідних даних;
Bn+1 – означає для вихідних даних;
I – множина вхідних даних для блоку;
U – множина вихідних даних для блоку.
Існує чотири операції над блоками:
T1 – видалення непотрібних привласнень:
Якщо
(послідовність
операторів) не використовує A1,
тоді говорять, що область дії A1
є пустою, при цьому
вона може бути видалена. Наприклад,
F=a+a; {визначаємо F }
G=F+c; {визначаємо G}
F=F+b; {тут G не використовується }
G=a+b; {нове визначення G, тому другу стрічку можна видалити }.
T2 – видалення надлишку обчислень:
Якщо
не
змінюється в A1,
тоді
T3 – перейменування, наприклад,
T=a+b; S=a+b;
T=T+a;
T=S+a;
T=T*T; T=T*T;
K=a+b; K=S;
T4 – перестановка там де не змінюються ліві частини.
Теорема:
Застосування T1,T2,T3,T4
переводить блок
,
еквівалентну , тобто при рівних вхідних
даних ми отримаємо рівні вихідні дані.
Оптимізація лінійної ділянки зводиться до наступного:
Вибираємо функцію оцінки блоку, область визначення є блок, область значень – раціональне число. Область визначення повинна бути такою, щоб зменшувалась область значень. За функцію оцінки беруть сумарний час виконання операції (вводяться терези операції або ж деякі характеристики процесора);
Видаляються зайві обчислення, перейменування та перестановки;
Обчислюється функція оцінки, виконується до тих пір доки функція оцінки за деяку кількість проходів залишається незмінною.
Глобальна оптимізація коду.
Описаний алгоритм може бути використаний частково для глобальної оптимізації коду. Глобальна оптимізація коду пов’язана з аналізом управління програмою, а з іншого боку з аналізом потоку даних. Маємо деякий алгоритм програми, який розбитий на блоки:
Для
оптимізації даної ділянки програми
визначається чотири типа даних для
кожного блоку
:
- дані, які активні при вході в блок та
змінюються в блоці;
- дані, які активні при вході та не
змінюються в блоці;
- дані, які не активні на вході та активні
на виході;
- дані, які генеруються блоком, наприклад,
read(i), та не перевизначаються
в блоці.
Оператори IN, TRANS, GEN визначають не самі дані, а й команди, в яких змінюються ці дані. Виділяються лінійні ділянки (інтервали). Інтервал містіть:
Заголовок, тобто перша команда цього інтервалу;
Всі команди, на які є передача управління лише з цього інтервалу.
I(F) є похідний граф від F.
Означення. Граф називається зведеним, якщо можна на m-тому крокові отримати похідний граф із однієї вершиною.
Відмінність глобальної оптимізації від локальної оптимізації:
Аналізується граф управління та потоки даних;
Все зводиться до виконання T1,T2,T3,T4 та використанню в ролі лінійних ділянок даних інтервалів. Суттєву роль грає критерій оптимальності. Якщо це об’єм пам’яті, тоді зайві операції виносяться вище всіх блоків, якщо це час виконання, тоді, навпаки, заносяться в ті місця, де вони використовуються;
Функція оцінки блоку буде містити в собі особливості управляючих структур та критерій оптимальності. Функція оцінки лінійної ділянки буде відрізнятися від функції оцінки інтервалу.