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

Преглед садржаја:

Anonim

Које су фазе дизајна компајлера?

Компајлер делује у различитим фазама, а свака фаза трансформише изворни програм из једне репрезентације у другу. Свака фаза узима улазе из своје претходне фазе и доводи свој излаз у следећу фазу компајлера.

У компајлеру постоји 6 фаза. Свака од ових фаза помаже у претварању високог нивоа језичког машинског кода. Фазе компајлера су:

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

Све ове фазе претварају изворни код дељењем на токене, стварањем стабала за рашчлањивање и оптимизацијом изворног кода по различитим фазама.

У овом упутству ћете научити:

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

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

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

Овде се ток знакова из изворног програма групише у значајне секвенце идентификовањем токена. Омогућава унос одговарајућих тикета у табелу симбола и тај жетон преноси у следећу фазу.

Примарне функције ове фазе су:

  • Идентификујте лексичке јединице у изворном коду
  • Лексичке јединице класификујте у класе попут константи, резервисаних речи и унесите их у различите табеле. Занемариће коментаре у изворном програму
  • Идентификујте жетон који није део језика

Пример :

к = и + 10

Жетони

Икс идентификатор
= Оператор доделе
И. идентификатор
+ Оператор сабирања
10 Број

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

Анализа синтаксе подразумева откривање структуре у коду. Одређује да ли текст следи очекивани формат. Главни циљ ове фазе је осигурати да је изворни код написао програмер, да ли је тачан или не.

Анализа синтаксе заснива се на правилима заснованим на одређеном програмском језику конструисањем стабла рашчлањивања уз помоћ токена. Такође одређује структуру изворног језика и граматику или синтаксу језика.

Ево листе задатака извршених у овој фази:

  • Набавите жетоне из лексичког анализатора
  • Проверава да ли је израз синтаксички исправан или не
  • Пријави све синтаксне грешке
  • Конструисати хијерархијску структуру која је позната као стабло рашчлањивања

Пример

Било који идентификатор / број је израз

Ако је к идентификатор, а и + 10 израз, тада је к = и + 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: Генерирање кода

Генерирање кода је последња и последња фаза компајлера. Добија улазе из фаза оптимизације кода и као резултат даје код странице или објектни код. Циљ ове фазе је да додели складиште и генерише машински код који се може преместити.

Такође додељује меморијске локације за променљиву. Упутства у средњем коду претварају се у машинске инструкције. Ова фаза покрива оптимизациони или средњи код на циљном језику.

Циљни језик је машински код. Због тога су све меморијске локације и регистри такође изабрани и додељени током ове фазе. Код генерисан у овој фази извршава се да узима улазе и генерише очекиване излазе.

Пример:

а = б + 60,0

Било би могуће превести у регистре.

MOVF a, R1MULF #60.0, R2ADDF R1, R2

Управљање табелом симбола

Табела симбола садржи запис за сваки идентификатор са пољима за атрибуте идентификатора. Ова компонента олакшава компајлеру да претражује запис идентификатора и брзо га преузме. Табела симбола такође вам помаже у управљању опсегом. Табела симбола и обрађивач грешака одговарајуће ажурирају све фазе и табелу симбола.

Грешка при руковању рутином:

У процесу дизајнирања компајлера може доћи до грешке у свим доле датим фазама:

  • Лексички анализатор: Погрешно написани знакови
  • Анализатор синтаксе: Недостају заграде
  • Генератор средњег кода: Неусклађени операнди за оператора
  • Оптимизатор кода: Када изјава није доступна
  • Генератор кода: недостижни искази
  • Табеле симбола: Грешка више декларисаних идентификатора

Најчешће грешке су неважећа секвенца знакова у скенирању, неважеће секвенце токена у типу, грешка опсега и рашчлањивање у семантичкој анализи.

На грешку се може наићи у било којој од горе наведених фаза. Након проналаска грешака, фаза треба да се позабави грешкама да би наставила са процесом компајлирања. Ове грешке треба пријавити обрађивачу грешака који рукује грешком да би извршио поступак компилације. Генерално, грешке се пријављују у облику поруке.

Резиме

  • Компајлер делује у различитим фазама, а свака фаза трансформише изворни програм из једне репрезентације у другу
  • Шест фаза дизајна компајлера су 1) Лексичка анализа 2) Анализа синтаксе 3) Семантичка анализа 4) Интермедијарни генератор кода 5) Оптимизатор кода 6) Генератор кода
  • Лексичка анализа је прва фаза када компајлер скенира изворни код
  • Анализа синтаксе подразумева откривање структуре у тексту
  • Семантичка анализа проверава семантичку доследност кода
  • Једном када фаза семантичке анализе заврши преко компајлера, генеришите средњи код за циљну машину
  • Фаза оптимизације кода уклања непотребну линију кода и уређује редослед израза
  • Фаза генерисања кода добија улазе из фазе оптимизације кода и као резултат даје код странице или објектни код
  • Табела симбола садржи запис за сваки идентификатор са пољима за атрибуте идентификатора
  • Руковање са грешкама обрађује грешке и извештаје током многих фаза