- •Лекція №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 : Генератори компіляторів.
Розбір декларативної частини програми.
Розбір виконується за допомогою LL(1)-граматики з включеними діями лексичного аналізатора.
Лекція №9. Тема 6 : Розподіл пам’яті під час виконання (прогону).
Під час прогону маємо стек часу прогону, для кожної процедури виділяється рамка. Опишемо деяку програму і покажемо стек часу прогону на різних етапах її виконання:
Program A1;
Var x,y:real;
Procedure A2;
Var a,b:integer;
Begin
{тіло процедури}
End;
Procedure A3;
Var c,d:char;
Begin
… {момент часу T5}
A2;{момент часу T6}
… {момент часу T7}
End;
Begin
… {момент часу T1}
A2; {момент часу T2}
… {момент часу T3}
A3; {момент часу T4}
End.
П
ри
прогоні в стек заноситься:
Локальна середа процедури, виконання якої розпочинається.
Також маємо стек-дісплей, в який заносимо посилання на рамки вложених процедур. При генерації коду:
Заносимо адресу теперішньої рамки в дисплей;
В дисплеї перейти на одну адресу нижче;
Прийняти цю адресу за базову, а за зміщення береться теперішнє зміщення в рамці.
В рамці :
Локальні дані та робочий стек – це є статична частина рамки;
Робочий стек має максимальну кількість комірок для виразів, тимчасових змінних в даній програмі, в нього поміщаються значення тимчасових змінних;
Динамічна частина – це область для статичних даних, але будується динамічно.
Під час ініціалізаціі процедури в стек часу прогону заноситься рамка, яка містить локальні дані, робочий стек , динамічну область. Після закінчення цієї процедури рамка видаляється.
Для роботи з нелокальними даними ведеться спеціальний стек – дисплей. Для коректності роботи з дисплеєм необхідна інформація про структуру всієї програми. Під час виконання потрібний зміст всіх рамок та адреси їх початку і кінця. Для динамічних даних створюється ”куча», до того ж вона і стек часу прогону ведуться назустріч, щоб віддалити момент нестачі пам’яті.
Розподіл пам’яті при наявності паралельних процесів:
Для кожного процесу свій стек-дисплей;
Стек часу прогону один для всіх процесів;
Повинен бути присутнім дескриптор кожної рамки;
Для кожного процесу необхідно зберігати структуру процедур для цього процесу.
Структури даних, які необхідні для генерації коду.
Таблиця блоків:
|
№блоку |
Рівень вложеності |
L ідентифікатора |
L робочого стеку |
L динамічної області |
|
1 |
1 |
32 |
0 |
0 |
|
|
|
|
|
|
Блок – це частина програми де є опис змінних.
Рівень вложеності – збільшується на один при зустрічі слів PROCEDURE, FUNCTION, і т.п. і зменшується по останньому END процедури чи блоку.
Стек ідентифікаторів – згідно типу даних, які добавляємо в стек ідентифікаторів, а те що стоїть перед добавленням, заносимо в таблицю ідентифікаторів. Під час розбору декларативної частини для кожного опису змінної із поля L стеку ідентифікаторів таблиці блоків переноситься адреса в таблицю ідентифікаторів та L стеку ідентифікаторів збільшується на довжину значення ідентифікатора. Якщо маємо опис масиву, тоді довжина масиву сумується не до L стеку ідентифікаторів, а до L динамічної області.
Робочий стек – на початку формування коду для виразу обнуляється номер робочої комірки в робочому стекові. По закінченню розбору виразу маємо номер останньої робочої змінної. Порівнюємо з L робочого стеку в таблиці блоків і, якщо значення більше, заносимо в поле L робочого стеку кінець виразу.
Адреса часу прогону містить:
Тип адреси;
Номер блоку;
Зміщення в блоці.
Тип адреси містить:
Адресу або адресу адреси;
Інформацію де ця адреса (в стекові ідентифікаторів, в робочій області чи динамічній);
Вказує на те, що один із операндів є літерал і знаходиться по номеру блоку та зміщенню. Номер блоку береться із таблиці блоків, а зміщення – із таблиці ідентифікаторів.
Стек ділиться на три стеки:
Стек знаків операцій (СЗО);
Верхній стек для роботи з операндами (ВС);
Нижній стек (НС).
В верхній та нижній стеки поміщаються статичні властивості операндів (СВ), які визначають:
Адресу часу прогону;
Тип даних;
Область дії.
