Какво е дизайн на компилатор? Видове, строителни инструменти, пример

⚡ Умно обобщение

Фазите на компилатора описват шестте етапа, които трансформират изходния код в машинен код: лексикален анализ, синтактичен анализ, семантичен анализ, генериране на междинен код, оптимизация на код и генериране на код, подкрепени от управление на таблици със символи и обработка на грешки.

  • 🔤 Лексикален анализ: Скенерът групира символите в токени и ги записва в таблицата със символи.
  • 🌳 Синтаксисен анализ: Парсерът проверява граматиката и изгражда йерархично дърво на разбор от токени.
  • ✔️ Семантичен анализ: Тази фаза проверява съвместимостта и значението на типовете, използвайки синтактичното дърво.
  • Code Поколение: Междинният код се генерира, оптимизира и накрая се превежда в целевия машинен код.
  • 📋 Поддържащи процедури: Таблица със символи и рутина за обработка на грешки взаимодействат с всяка фаза на компилация.

Фази на компилатора с пример: Процес на компилация и стъпки

Какви са фазите на дизайна на компилатора?

A съставител работи в различни фази, като всяка фаза трансформира изходния код на програмата от едно представяне в друго. Всяка фаза приема входни данни от предишния си етап и подава изхода си към следващата фаза на компилатора. В един компилатор има 6 фази. Всяка от тези фази помага за преобразуването на езика от високо ниво в машинен код. Фазите на един компилатор са:

  1. Лексикален анализ
  2. Синтактичен анализ
  3. Семантичен анализ
  4. Генератор на междинен код
  5. Code оптимизатор
  6. Code генератор

Фази на компилатора

Фази на компилатора

Всички тези фази преобразуват изходния код, като го разделят на токени, създават дървета за разбор и оптимизират изходния код чрез различни фази.

Фаза 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: Междинно ниво Code Поколение

След като фазата на семантичен анализ приключи, компилаторът генерира междинен код за целевата машина. Той представлява програма за някои ABS задачи.tracт машина.

Междинният код е между езика за програмиране от високо ниво и машинния език. Този междинен код трябва да бъде генериран по такъв начин, че да е лесно да се преведе в целевия машинен код.

Функции на междинния звено Code поколение:

  • Трябва да се генерира от семантичното представяне на изходната програма.
  • Съхранява стойностите, изчислени по време на процеса на преобразуване.
  • Помага ви да преведете междинния код на целевия език.
  • Позволява ви да поддържате подреждане на приоритетите на изходния език.
  • Той съдържа правилния брой операнди на инструкцията.

Пример

Например:

total = count + rate * 5

Междинният код, използван с помощта на метода на адресния код, е:

t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3

Фаза 5: Code Оптимизация

Следващата фаза е оптимизация на междинния код. Тази фаза премахва ненужните редове от код и подрежда последователността от оператори, за да ускори изпълнението на програмата, без да се губят ресурси. Основната цел на тази фаза е да се подобри междинният код, за да се генерира код, който работи по-бързо и заема по-малко място.

Основните функции на тази фаза са:

  • Това ви помага да установите компромис между скоростта на изпълнение и скоростта на компилация.
  • Подобрява времето за изпълнение на целевата програма.
  • Генерира рационализиран код, все още в междинно представяне.
  • Премахване на недостъпен код и освобождаване от неизползвани променливи.
  • Премахване на оператори, които не са променени от цикъла.

Пример: Разгледайте следния код:

a = intofloat(10)
b = c * a
d = e + b
f = d

Може да стане:

b = c * 10.0
f = e + b

Фаза 6: Code Поколение

Code Генерирането е последната и последна фаза на компилатора. То получава входни данни от фазата на оптимизация на кода и в резултат на това създава кода на страницата или обектния код. Целта на тази фаза е да се разпредели памет и да се генерира преместим машинен код.

Той също така разпределя места в паметта за променливите. Инструкциите в междинния код се преобразуват в машинни инструкции. Тази фаза преобразува оптимизирания или междинен код в целевия език.

Целевият език е машинният код. Следователно, всички места в паметта и регистри също се избират и разпределят по време на тази фаза. Кодът, генериран от тази фаза, се изпълнява, за да приема входни данни и да генерира очаквани изходни данни.

Пример

a = b + 60.0 би могло да се преведе в регистри като:

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Управление на таблици със символи

Таблицата със символи съдържа запис за всеки идентификатор с полета за атрибутите на идентификатора. Този компонент улеснява компилатора да търси записа на идентификатора и да го извлича бързо. Таблицата със символи ви помага и при управлението на обхвата. Таблицата със символи и обработчикът на грешки взаимодействат с всички фази и таблицата със символи се актуализира съответно.

Рутина за обработка на грешки

В процеса на проектиране на компилатора могат да възникнат грешки във всички посочени по-долу фази:

  • Лексикален анализатор: Неправилно изписани токени.
  • Синтаксичен анализатор: Липсва скоба.
  • Генератор на междинен код: Несъответстващи операнди за оператор.
  • Code Оптимизатор: Когато твърдението не е достъпно.
  • Code Generator: Когато паметта е пълна или не са разпределени правилните регистри.
  • Таблици със символи: Грешка при множество декларирани идентификатори.

Най-често срещаните грешки са невалидни поредици от символи при сканиране, невалидни поредици от токени в типа, грешка в обхвата и парсинг при семантичен анализ.

Грешката може да възникне във всяка от горните фази. След откриване на грешки, фазата трябва да се справи с тях, за да продължи процеса на компилация. Тези грешки трябва да бъдат докладвани на обработчика на грешки, който ги обработва, за да извърши процеса на компилация. Обикновено грешките се докладват под формата на съобщение.

Въпроси и Отговори

Да. Асистентите с изкуствен интелект могат да обяснят всяка фаза, tracкак примерният код се превръща в токени и дървета на синтактичния разбор, и посочва къде възниква синтактична или семантична грешка. Те са полезни помощни средства за обучение, но проверявайте обясненията спрямо учебния материал.

Машинното обучение може да предвиди кои оптимизационни проходи ще създадат най-бързия код за дадена програма и машина, като настройва избори, които някога са били ръчно изработени евристики. Компилаторът все пак трябва да гарантира, че оптимизираната програма се държи точно като оригинала.

Фронт-ендът обработва лексикален, синтактичен и семантичен анализ, както и междинен код, и зависи от изходния език. Бек-ендът обработва оптимизацията и генерирането на код и зависи от целевата машина. Това разделяне опростява пренасочването.

Не. Лексикалният анализ (сканиране) групира символите в токени, докато парсингът (синтактичен анализ) подрежда тези токени в дърво на парсинга според граматическите правила. Лексикалният анализ се изпълнява първи и подава своите токени на парсера.

Обобщете тази публикация с: