Преводиоци

Извор: ВикиЕТФ

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

Садржај

Превођење

Код који треба превести је најчешће низ знакова. Први корак је груписање знакова у логичке целине које имају неке особине које се називају токени. Превођење из низа знакова у низ токена врши се најчешће коначним аутоматима (мада постоје и друге методе). Даље, превођење из низа токена у одредишни код врши парсер, који анализира низове токена и утврђује да ли сваки од њих припада граматици (скупу правила који описује изворишни језик.

Превођење низа знакова у токене (лексичка анализа)

Програм је задат низом знакова. Прва фаза у превођењу је груписање ових знакова у "токене". Токени су јединице које имају за језик смислено значење (нпр. кључне речи, идентификатори, константе и сл.). Један пример може да буде много илустративнији него много апстрактне приче, па ћемо је тако и представити. Линија кода

class X { int a = 1; }

представља декларацију класе на неком програмском језику у којој је дефинисана променљива а са иницијалном вредношћу 1. Прва реч class је кључна реч програмског језика, т.ј. има посебно значење (да означи класу), X је идентификатор те класе а све што је између отворених и затворених витичастих заграда се рачуна да припада декларацији те класе. Низ токена који би одговарао овом низу знакова је

Празна места, табулатори и нов ред служе да раздвоје токене. Сваки токен који се препозна се обележава посебним називом као што је CLASS, IDENT, NUMBER и слично. У примеру као резултат лексичке анализе на основу улаза се шаље низ токена:

CLASS IDENT { IDENT IDENT = NUMBER ; }

Неким токенима се могу додати и информације о низовима знакова на основу којих је идентификован токен. У том случају излаз лексичког анализатора би био:

CLASS IDENTx { IDENTint IDENTa = NUMBER1 ; }

На основу оног низа токена и вредности токена неки други модул може Како се низ знакова претвара у низ токена прочитајте у Коначни аутомати.

Грешка при прављењу умањене слике: Unable to run external programs, passthru() is disabled.
Како ради лексички анализатор - улазни низ знакова се групише у токене. Токени су елементи језика који су неке врсте (типа) и имају вредност. На слици је сваки токен засебно подвучен, и стрелица указује на њега. За неке токене је дато и које су врсте и која им је вредност.

Синтаксна анализа

Лексички анализатор проверава само да ли су низови карактера у улазном програмском коду у складу са скупом дозвољених вредности али не проверава да ли је њихов редослед исправан. На пример улазна секвенца:

{class} 1=x

је лексички потпуно исправна зато што се сви знакови на улазу могу представити секвенцом валидних токена { CLASS } NUMBER = IDENT - међутим очигледно је да оваква секвенца није у складу са језиком. Да би се проверила исправност редоследа токена у низу потребно је извршити синтаксну анализу. Низ токена представља улаз у програм који служи за синтаксну анализу, и који се назива парсер. Парсер анализира токене с улаза, и проверава да ли датa секвенца токена на улазу описује улазни језик, који је задан граматиком. Граматика која би описивала језик из претходног примера, може да изгледа овако:

1. <class_decl> -> CLASS IDENT {<class_body> }
2. <class_body> -> 
3. <class_body> -> <type> IDENT = NUMBER; 
4. <type>       -> IDENT 

Граматика се састоји од четири смене

У сменама се могу наћи две врсте симбола:

Улазни програм:

class X { int a = 1; }

је према граматици из примера исправан. Ако се int представи као нетерминални симбол <type>, секвенца int a = 1; се може представити као нетерминал <class_body> на основу треће смене, што значи да се class X { int a = 1; } може представити стартним нетерминалом <class_decl> што значи да је улаз исправна декларација класе.

Резултат овакве анализе је одговор на питање: да ли низ токена с улаза представља исправан програм улазног језика. Током ове анализе, парсер конструише синтаксно стабло, које се користи у даљем току превођења.

У зависности од начина како се врши парсирање граматике се могу поделити у две групе:

Семантичка анализа

Програм може да задовољава граматику језика, али да ипак не буде исправан. Пример програма који је лексички и синтаксно исправан али има семантичких грешака је:

int a, b, bool;
string s = 1;
char a;
b = c;
a = b + s;

У примеру се може видети да је у првој линији коришћена кључна реч bool као име променљиве иако је то преддефинисани тип, стринг s је иницијализован бројем 1 уместо низом карактера, за име карактерне променљиве a је коришћен идентификатор који је већ коришћен за целобројну променљиву у првој линији, у наредби доделе је коришћена променљива c која нигде није дефинисана, у изразу се сабирају цели бројеви и стрингови. Ове грешке се не могу открити током лексичке или синтаксне анализе пошто нису познате информације о променљивама. Да би се валидирао улаз семантички потребно је поред редоследа токена извршити још неке провере као што су:

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

Генерисање програма у одредишном језику

Као што је већ речено, оно се врши или током семантичке анализе (где се директно код написан у једном језику преводи у други) или се код који је написан у међукоду преводи у код одредишног језика (у овом случају овај модул је независтан према семантичкој анализи).

Личне алатке
Именски простори
Варијанте
Акције
Навигација
Алатке