Які етапи проектування компілятора?
Компілятор працює в різні фази, кожна фаза перетворює вихідну програму з одного подання на інше. Кожна фаза бере вхідні дані з попереднього етапу і подає свої результати на наступну фазу компілятора.
У компіляторі 6 фаз. Кожен з цих етапів допомагає перетворити машинний код високого рівня. Етапи компілятора:
- Лексичний аналіз
- Синтаксичний аналіз
- Семантичний аналіз
- Проміжний генератор коду
- Оптимізатор коду
- Генератор коду
Усі ці фази перетворюють вихідний код шляхом поділу на маркери, створення дерев синтаксичного аналізу та оптимізації вихідного коду за різними фазами.
У цьому підручнику ви дізнаєтесь:
- Які етапи проектування компілятора?
- Фаза 1: Лексичний аналіз
- Фаза 2: Аналіз синтаксису
- Фаза 3: Семантичний аналіз
- Фаза 4: Генерація проміжного коду
- Етап 5: Оптимізація коду
- Етап 6: Генерація коду
- Управління таблицею символів
- Помилка обробки звичайного:
Фаза 1: Лексичний аналіз
Лексичний аналіз - це перша фаза, коли компілятор сканує вихідний код. Цей процес можна зліва направо, символ за символом, і об’єднати ці символи в лексеми.
Тут потік символів з вихідної програми групується у значущі послідовності шляхом ідентифікації лексем. Він робить запис відповідних квитків у таблиці символів і передає цей маркер на наступний етап.
Основними функціями цієї фази є:
- Визначте лексичні одиниці у вихідному коді
- Класифікуйте лексичні одиниці за класами, такими як константи, зарезервовані слова та введіть їх у різні таблиці. Це проігнорує коментарі у вихідній програмі
- Визначте лексему, яка не є частиною мови
Приклад :
x = y + 10
Токени
X | ідентифікатор |
= | Оператор присвоєння |
Y | ідентифікатор |
+ | Оператор додавання |
10 | Кількість |
Фаза 2: Аналіз синтаксису
Синтаксичний аналіз полягає у виявленні структури в коді. Він визначає, чи відповідає текст очікуваному формату. Основна мета цього етапу - переконатися, що вихідний код написаний програмістом, правильний чи ні.
Синтаксичний аналіз базується на правилах, заснованих на конкретній мові програмування, шляхом побудови дерева синтаксичного аналізу за допомогою лексем. Він також визначає структуру мови-джерела та граматику чи синтаксис мови.
Ось список завдань, що виконуються на цьому етапі:
- Отримати лексеми з лексичного аналізатора
- Перевіряє, чи є вираз синтаксично правильним чи ні
- Повідомте про всі синтаксичні помилки
- Побудуйте ієрархічну структуру, яка відома як дерево синтаксичного аналізу
Приклад
Будь-який ідентифікатор / номер - це вираз
Якщо x - ідентифікатор, а y + 10 - вираз, то x = y + 10 - твердження.
Розглянемо дерево розбору для наступного прикладу
(a+b)*c
У дереві розбору
- Внутрішній вузол: запис із картою оператора та два файли для дітей
- Аркуш: записи з 2 і більше полями; один для маркера та інша інформація про маркер
- Переконайтеся, що компоненти програми суттєво збігаються
- Збирає інформацію про тип та перевіряє сумісність типу
- Перевірка операндів дозволена мовою джерела
Фаза 3: Семантичний аналіз
Семантичний аналіз перевіряє семантичну узгодженість коду. Він використовує дерево синтаксису попередньої фази разом із таблицею символів, щоб переконатися, що даний вихідний код є семантично узгодженим. Він також перевіряє, чи надає код відповідного значення.
Семантичний аналізатор перевірятиме невідповідність типу, несумісні операнди, функцію, що викликається з неправильними аргументами, незадекларовану змінну тощо.
Функціями фази семантичного аналізу є:
- Допомагає зберігати зібрану інформацію про тип та зберігати її в таблиці символів або дереві синтаксису
- Дозволяє виконувати перевірку типу
- У разі невідповідності типу, коли немає точних правил корекції типу, які задовольняють бажаній операції, відображається семантична помилка
- Збирає інформацію про тип і перевіряє сумісність типів
- Перевіряє, чи дозволяє вихідна мова операнди чи ні
Приклад
float x = 20.2;float y = x*30;
У наведеному вище коді семантичний аналізатор введе ціле число 30, щоб плавати 30,0 перед множенням
Фаза 4: Генерація проміжного коду
Після закінчення фази семантичного аналізу компілятор генерує проміжний код для цільової машини. Він представляє програму для якоїсь абстрактної машини.
Проміжний код знаходиться між мовою високого та машинного рівня. Цей проміжний код потрібно генерувати таким чином, щоб було легко перекласти його в цільовий машинний код.
Функції генерації проміжного коду:
- Він повинен генеруватися із семантичного подання вихідної програми
- Утримує значення, обчислені в процесі перекладу
- Допомагає перекласти проміжний код на цільову мову
- Дозволяє підтримувати впорядкування за пріоритетом вихідної мови
- Він містить правильну кількість операндів інструкції
Приклад
Наприклад,
total = count + rate * 5
Проміжний код за допомогою методу адресного коду:
t1 := int_to_float(5)t2 := rate * t1t3 := count + t2total := t3
Етап 5: Оптимізація коду
Наступним етапом є оптимізація коду або проміжний код. Цей етап видаляє непотрібний рядок коду та упорядковує послідовність операторів, щоб пришвидшити виконання програми, не витрачаючи витрат ресурсів. Головною метою цього етапу є вдосконалення проміжного коду для створення коду, який працює швидше і займає менше місця.
Основними функціями цієї фази є:
- Це допомагає встановити компроміс між виконанням та швидкістю компіляції
- Покращує час роботи цільової програми
- Генерує впорядкований код, який все ще знаходиться в проміжному представленні
- Видалення недосяжного коду та позбавлення від невикористаних змінних
- Видалення операторів, не змінених із циклу
Приклад:
Розглянемо наступний код
a = intofloat(10)b = c * ad = e + bf = d
Може стати
b =c * 10.0f = e+b
Етап 6: Генерація коду
Генерація коду - це остання та остання фаза компілятора. Він отримує вхідні дані з фаз оптимізації коду і в результаті створює код сторінки або код об’єкта. Метою цього етапу є розподіл сховища та генерація машинного коду, що переміщується.
Він також виділяє місця для пам'яті для змінної. Інструкції в проміжному коді перетворюються на машинні інструкції. Ця фаза охоплює код оптимізації або проміжний код цільовою мовою.
Мовою перекладу є машинний код. Отже, усі місця пам'яті та регістри пам'яті також вибираються та розподіляються на цьому етапі. Код, згенерований на цій фазі, виконується для прийому вхідних даних та отримання очікуваних вихідних даних.
Приклад:
a = b + 60,0
Можливо, буде переведено в реєстри.
MOVF a, R1MULF #60.0, R2ADDF R1, R2
Управління таблицею символів
Таблиця символів містить запис для кожного ідентифікатора з полями для атрибутів ідентифікатора. Цей компонент полегшує компілятору пошук запису ідентифікатора та його швидке отримання. Таблиця символів також допоможе вам в управлінні сферою. Таблиця символів та обробник помилок взаємодіють з усіма фазами та оновленням таблиці символів відповідно.
Помилка обробки звичайного:
У процесі проектування компілятора помилка може виникати на всіх наступних етапах:
- Лексичний аналізатор: помилково написані лексеми
- Аналізатор синтаксису: відсутні дужки
- Генератор проміжного коду: Невідповідні операнди для оператора
- Оптимізатор коду: коли заява недоступна
- Генератор коду: недосяжні твердження
- Таблиці символів: Помилка декількох оголошених ідентифікаторів
Найпоширенішими помилками є недійсна послідовність символів при скануванні, недійсні послідовності маркерів у типі, помилка області та аналіз при семантичному аналізі.
Помилка може зустрічатися на будь-якому з вищезазначених етапів. Після пошуку помилок фазі потрібно впоратися з помилками, щоб продовжити процес компіляції. Ці помилки потрібно повідомляти обробнику помилок, який обробляє помилку для виконання процесу компіляції. Як правило, про помилки повідомляється у формі повідомлення.
Резюме
- Компілятор працює в різні фази, кожна фаза перетворює вихідну програму з одного подання на інше
- Шість фаз проектування компілятора: 1) Лексичний аналіз 2) Синтаксичний аналіз 3) Семантичний аналіз 4) Проміжний генератор коду 5) Оптимізатор коду 6) Генератор коду
- Лексичний аналіз - це перша фаза, коли компілятор сканує вихідний код
- Синтаксичний аналіз полягає у виявленні структури в тексті
- Семантичний аналіз перевіряє семантичну узгодженість коду
- Як тільки фаза семантичного аналізу закінчиться компілятором, згенеруйте проміжний код для цільової машини
- Етап оптимізації коду видаляє непотрібний рядок коду та упорядковує послідовність операторів
- Фаза генерації коду отримує вхідні дані з фази оптимізації коду і в результаті створює код сторінки або об'єктний код
- Таблиця символів містить запис для кожного ідентифікатора з полями для атрибутів ідентифікатора
- Помилка обробки процедури обробляє помилки та звіти протягом багатьох етапів