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

Съдържание:

Anonim

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

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

Има 6 фази в компилатора. Всяка от тази фаза помага при конвертирането на високия ниво на машинния код. Фазите на компилатора са:

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

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

В този урок ще научите:

  • Какви са фазите на компилаторния дизайн?
  • Фаза 1: Лексикален анализ
  • Фаза 2: Анализ на синтаксиса
  • Фаза 3: Семантичен анализ
  • Фаза 4: Генериране на междинен код
  • Фаза 5: Оптимизация на кода
  • Фаза 6: Генериране на код
  • Управление на таблицата със символи
  • Грешка при обработка на рутинни:

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

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

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

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

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

Пример :

x = y + 10

Токени

х идентификатор
= Оператор за присвояване
Y. идентификатор
+ Оператор за събиране
10 Брой

Фаза 2: Анализ на синтаксиса

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

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

Ето списък на задачите, изпълнявани в тази фаза:

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

Пример

Всеки идентификатор / номер е израз

Ако x е идентификатор и y + 10 е израз, тогава x = y + 10 е изявление.

Помислете за разбор на дърво за следващия пример

(a+b)*c

В Parse Tree

  • Вътрешен възел: запис с регистриран оператор и два файла за деца
  • Лист: записи с 2 / повече полета; един за токен и друга информация за токена
  • Уверете се, че компонентите на програмата се вписват по смисъл
  • Събира информация за типа и проверява за съвместимост на типа
  • Операндите за проверки са разрешени от изходния език

Фаза 3: Семантичен анализ

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

Semantic Analyzer ще проверява за несъответствия на типа, несъвместими операнди, функция, извикана с неправилни аргументи, недекларирана променлива и т.н.

Функциите на фазата на семантичния анализ са:

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

Пример

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) Генератор на код
  • Лексикалният анализ е първата фаза, когато компилаторът сканира изходния код
  • Синтаксисният анализ е свързан с откриването на структура в текста
  • Семантичният анализ проверява семантичната последователност на кода
  • След като фазата на семантичния анализ приключи над компилатора, генерирайте междинен код за целевата машина
  • Фазата на оптимизиране на кода премахва ненужния кодов ред и подрежда последователността на изявленията
  • Фазата за генериране на код получава входове от фазата на оптимизация на кода и в резултат произвежда кода на страницата или обектния код
  • Таблица със символи съдържа запис за всеки идентификатор с полета за атрибутите на идентификатора
  • Грешката при обработка на рутината обработва грешки и отчети по време на много фази