- •Лекція №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 : Генератори компіляторів.
Діагностика помилок.
Транслятор ретранслює системні повідомлення;
Установлюються коди для перевірки.
Якість діагностики помилок залишається не дуже хорошою. Необхідно чітко класифікувати, де з’явилась помилка та за яких умов. Більшість трансляторів цього не виконує. Причини:
Значно збільшується об’єм інформації під час виконання;
Ускладнюється сам транслятор;
Розвиток технології програмування.
Лекція №13. Тема 8 : Проектування транслятора. Визначення кількості проходів під час трансляції.
Додаткові проходи спричиняються:
Невдалим синтаксисом мови:
Опис програмних об’єктів можливий після їх використання;
Використання процедур, які описані пізніше її виклику;
Синтаксис не визначений з їх структури, тобто неоднозначність управляючих конструкцій.
Побудова сімейств трансляторів та трансляторів з оптимізацією коду, наприклад, під час першого проходу виконується лексичний та синтаксичний аналіз, а під час другого проходу – генерація та оптимізація коду.
Наявність препроцесорів.
Тема 9 : Оптимізація коду.
Розрізняють машинно-залежну та машинно-незалежну оптимізацію коду. Машинно-незалежна пов’язана з поліпшенням алгоритму, наприклад,
.
Машинно-залежна пов’язана з конкретною архітектурою конкретної ЕОМ.
Оптимізація коду може бути як оптимальною фазою та йти паралельно генерації коду, так і окремим етапом трансляції.
Локальна та глобальна оптимізація коду.
Локальна (вона частіше виконується з генерацією коду) – займається оптимізацією невеликої ділянки програми і частіше вона пов’язана з оптимальними означеннями управляючих структур, наприклад, оптимізація циклів, виразів, привласнень.
Глобальна (вона може бути як окрема фаза, але не обов’язково) – будується на аналізові потоку даних та управлінні всієї програми, або значних її частин.
Критерії оптимізації.
Розмір об’єктного коду;
Час виконання об’єктного коду;
Побудова оптимального оверлею;
Оптимізація вводу – виводу.
Перший та другий критерії є основними. Майже всім мовам програмування властиві засоби локальної оптимізації коду. Якщо засоби різні, тоді і результати різні. Деякі мови мають різні варіанти оптимізації.
Локальна оптимізація коду.
Заходи локальної оптимізації коду:
Усунення перепривласнювань, наприклад, a:=b; b:=a;
Вирахування пріоритетів та вартості операції, наприклад,
![]()
Оптимізація циклів, наприклад,
k:=0;
for i:=1 to n do
k:=j+1+i+k;
Маємо четвірки:
k=0;
i=1;
L1: T=j+1;
S=T+i;
k=S+k;
i=i+1;
i<=n;
Goto + L1;
а) винесення обчислень за цикл:
k=0;
i=1;
T=j+1;
L1: S=T+i;
k=k+S;
i=i+1;
i<=n;
Goto + L1;
б) використання індуктивних змінних, в даному випадку k:
k=0;
S=j+1;
R=S+n;
L1: S=S+1;
k=S+k;
S<>R;
Goto + L1;
в) заміна складних операцій простішими:
for i:=1 to n do
for j:=1 to n do a:=b;
a[i,j]:=b[i,j];
f
or
i:=1 to 2 do a[1]:=2;
a[i]:=i+1; a[2]:=3;
(маємо шість (маємо дві четвірки, тобто
четвірок, тобто дві команди)
одинадцять команд)
