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

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

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

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

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

Фаза 1: Лексикален анализ

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

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

Пример:
x = y + 10

Знаците

X идентификатор
= Оператор за присвояване
Y идентификатор
+ Оператор на събиране
10 Телефон за връзка:

Фаза 2: Синтаксисен анализ

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

  • Вземете жетони от лексикалния анализатор
  • Проверява дали изразът е синтактично правилен или не
  • Докладвайте всички синтактични грешки
  • Изградете йерархична структура, която е известна като дърво за анализ

Пример

Всеки идентификатор/число е израз
Ако x е идентификатор и y+10 е израз, тогава x= y+10 е израз.
Помислете за дърво за анализ за следния пример

(a+b)*c

Пример за синтактичен анализ

В Parse Tree

  • Вътрешен възел: запис с операторски файл и два файла за деца
  • Лист: записи с 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 * t1 
t3 := count + t2
total := t3

Фаза 5: Оптимизация на кода

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

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

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

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

Може да стане

b =c * 10.0
f = e+b

Фаза 6: Генериране на код

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

Пример

a = b + 60.0
Евентуално ще бъдат преведени в регистри.

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

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

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

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

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

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

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

Oбобщение

  • Компилаторът работи на различни фази, всяка фаза трансформира изходната програма от едно представяне в друго
  • Шест фази на дизайн на компилатор са 1) Лексикален анализ 2) Синтактичен анализ 3) Семантичен анализ 4) Генератор на междинен код 5) Оптимизатор на код 6) Код Generator
  • Лексикалният анализ е първата фаза, когато компилаторът сканира изходния код
  • Синтактичният анализ е свързан с откриването на структура в текста
  • Семантичният анализ проверява семантичната последователност на кода
  • След като фазата на семантичен анализ приключи компилатора, генерирайте междинен код за целевата машина
  • Фазата на оптимизиране на кода премахва ненужния кодов ред и подрежда последователността от изрази
  • Фазата на генериране на код получава входни данни от фазата на оптимизиране на кода и като резултат създава кода на страницата или обектния код
  • Таблица със символи съдържа запис за всеки идентификатор с полета за атрибутите на идентификатора
  • Рутината за обработка на грешки обработва грешки и докладва по време на много фази