Sunteți pe pagina 1din 4

Compilatoare

Un compilator este un program de computer care traduce codul computerului scris dintr- un limbaj de
programare (limba sursă) intr-o altă limbă (limba țintă). Numele de Compilator este utilizat în principal pentru
programele care traduc codul sursă dintr-un limbaj de programare la un nivel înalt într-un limbaj de nivel
inferior pentru a crea un program executabil.
Cu toate acestea, există multe tipuri diferite de compilatoare.
 Dacă programul compilat poate rula pe un computer al cărui procesor sau sistem de operare este diferit
de cel pe care rulează compilatorul, acesta este un compilator încrucișat.
 Un compilator pentru bootstrap este scris in limba pe care intenționează să o compileze.
 Un program care se traduce de la un limbaj de nivel scăzut la unul de nivel superior este un
decompilator.
 Un program care traduce între limbi de nivel înalt este de obicei numit compilator sursă- la-sursă.
 Un rescriptor de limbă este de obicei un program care traduce forma expresiilor fără o schimbare de
limbă.
 Termenul compilator-compilator se referă la instrumentele utilizate pentru a crea parsere care
efectuează analiza sintaxei.
Un compilator este probabil să efectueze multe sau toate operațiunile următoare: prcproccsarea. analiza
lexicală, analiza, analiza semantică (traducere orientată de sintaxă), conversia programelor de intrare într-o
reprezentare intermediară, optimizarea codului și generarea de coduri. Compilatoarele implementează aceste
operațiuni in faze care promovează o proiectare eficientă și transformări corecte ale sursei de intrare în rezultatul
vizat. Defecțiunile programului cauzate de un comportament incorect al compilatorului pol fi foarte dificil de
urmărit și de rezolvat: prin urmare, operatorii de compilare investesc eforturi importante pentru a asigura
corectitudinea compilatorului.
Compilatoarele nu sunt singurul procesor de limbă utilizat pentru transformarea programelor sursă. Un
interpretator este un software informatic care transformă și apoi execută operațiunile indicate. Procesul de
traducere influențează proiectarea limbajelor computerizate ceea ce duce la o preferință de compilare sau
interpretare. în practică, un interpretator poate fi implementat pentru limbi compilate și compilatoare pot fi
implementate pentru limbi interpretate.

Construcție compilatoare
Un compilator implementează o transformare formală de la un program sursă de nivel înalt la un program țintă
de nivel scăzut. Proiectarea compilatonilui poate defini o soluție de la capăt la capăt sau poate aborda un subset
definit, care interferează eu alte instrumente de compilare, de ex. prcproccsoare, asamblatoare. linkere. Cerințele
de proiectare includ interfețe riguros definite atât intern între componentele compilatorului, eât și extern. între
seturile de instrumente de sprijin.
In primele zile, abordarea adoptată pentru proiectarea compilatorului a fost direct afectată de complexitatea
limbajului computerului care urmează să fie procesat, de experiența persoanei (persoanelor) care îl proiectează
și de resursele disponibile. Limitările resurselor au dus la necesitatea de a trece prin codul sursă de mai multe
ori.
Un compilator pentru un limbaj relativ simplu scris de o singură persoană ar putea tl un singur software
monolitic. Cu toate acestea, pe măsură ce limbajul sursă crește în complexitate, proiectarea poate fi împărțită
intr-o serie de faze interdependente. Fazele separate oferă îmbunătățiri ale proiectării care concentrează
dezvoltarea funcțiilor din procesul de compilare.

Compilatoare de tip one-pass versus multi-pass


Clasificarea compilatoarelor în funcție de numărul de
treceri iși arc fondul in limitările de resurse hardware ale
computerelor. Compilarea presupune efectuarea multor lucrări, iar
calculatoarele timpurii nu aveau suficientă memorie pentru a
conține un program care făcea toate aceste lucrări. Așadar,
compilatoarele au fost împărțite în programe mai mici, care au
făcut fiecare o trecere peste sursă (sau o reprezentare a acesteia),
efectuând o parte din analiza și traducerile necesare.
Abilitatea de a compila într-o singură trecere a fost considerată in mod clasic ca un beneficiu, deoarece
simplifică munca de a serie un compilator, iar compilatorii cu un singur pas. în general, realizează compilări mai
repede decât compilatorii cu mai multe treceri. Astfel, conduse parțial de limitările de resurse ale sistemelor
timpurii, multe limbi timpurii au fost concepute special astfel încât să poată fi compilate intr-un singur pas (de
exemplu. Pascal).

Dezavantajul compilării într-un singur pas este că nu este posibil să se efectueze multe dintre
optimizările sofisticate necesare pentru a genera cod de înaltă calitate. Poate fi dificil să numeri exact câte
treceri realizează un compilator optimizat. De exemplu, diferite faze de optimizare pot analiza o expresie de
multe ori, dar analizează o altă expresie o singură dată.

Structura compilatorului în trei etape


Indiferent de numărul exact dc faze in proiectarea compilatorului, fazele pot fi alocate uncia dintre cele
trei etape.

Etapele includ front end, middle end și back end.


Front end-ul verifică sintaxa și semantica conform unui limbaj sursă specific. Pentru limbile tipizate statistic,
acesta verifică tipul colectând informații dc tip. Dacă programul dc intrare este incorect sintactic sau arc o eroare
dc tip. generează mesaje dc eroare și sau avertizare, identificând dc obicei locația din codul sursă unde a fost
detectată problema: în unele cazuri, eroarea reală poate fi (mult) mai devreme în program. Aspectele front-end-
ului includ analiza lexicală, analiza sintaxei și analiza semantică. Partea frontală transformă programul dc intrare
intr-o reprezentare intermediară (IR> pentru prelucrarea ulterioara până la capătul mijlociu. Acest IR este dc
obicei o reprezentare la nivel inferior a programului în ceea ce privește codul sursă.
Middle end-ul realizează optimizări pe IR care sunt independente dc arhitectura procesorului vizată. .Această
independență a codului sursă codului mașinii este destinată să permită partajarea optimizărilor generice intre
versiunile compilatorului care acceptă diferite limbi și procesoare țintă. Exemple dc optimizări ale middle end-
ului sunt eliminarea inutilă (eliminarea codului mort) sau a codului care nu poate fi atins (analiza accesibilității),
descoperirea și propagarea valorilor constante (propagare constantă), relocarea calculului intr-un loc mai puțin
executat (de ex. Dintr-o buclă) sau specializarea calculului bazat pe context. în cele din urmă producerea IR
"optimizat", care este utilizat de back end.
Back end-ul ia IR optimizat dc la capătul mijlociu. Poate efectua mai multe analize, transformări și optimizări
specifice arhitecturii procesorului țintă. Back end-ul generează codul dc asamblare dependent dc țintă,
executând alocarea registrului în proces. Back end-ul realizează planificarea instrucțiunilor, care ordonează
instrucțiuni pentru a menține unitățile dc execuție paralele ocupate prin umplerea sloturilor dc întârziere. Deși
majoritatea problemelor dc optimizare sunt NP. tehnicile euristice pentru rezolvarea lor sunt bine dezvoltate și
sunt implementate in prezent in compilatoare dc calitate. Dc obicei, ieșirea unui back end este codul mașinii
specializat pentru un anumit procesor și sistem de operare.
Limbi compilate versus interpretate
Limbile de programare la nivel superior apar de obicei eu un tip de traducere in minte: fie concepute ca limbaj
compilat, fie limbaj interpretat. Cu toate acestea. în practică există rareori ceva despre o limbă care necesită să
tie compilată exclusiv sau interpretată exclusiv, deși este posibil să se proiecteze limbaje care se bazează pe
reinterpretare in timpul rulării. Clasificarea reflectă de obicei cele mai populare sau răspândite implementări ale
unui limbaj - de exemplu, BASIC este uneori numit limbaj interpretat, iar C unul compilat în ciuda existenței
compilatoarelor de bază și a interpreților C.
Interpretarea nu înlocuiește complet compilarea. îl ascunde doar de utilizator și îl face treptat. Chiar dacă un
interpret poate ti interpretat in sine, este nevoie de un program executat direct undeva în partea de jos a stivei.
Mai mult, compilatoarele pot conține interpreți din motive dc optimizare. De exemplu, când o expresie poate fi
executată în timpul compilării și a rezultatelor introduse în programul dc ieșire, atunci aceasta împiedică să fie
recalculată dc fiecare dată când programul rulează, ceea ce poate accelera mult programul final. Tendințele
moderne către compilarea exactă in timp și interpretarea bytecode încearcă uneori și mai mult clasificarea
tradițională a compilatorilor și interpreților.
Unele specificații lingvistice precizează că implementările trebuie să includă o facilitate dc compilare:
de exemplu. Lisp comun. Cu toate acestea, nu există nimic inerent in definiția lui Lisp comun care să o
împiedice să fie interpretată. Alte limbi au caracteristici foarte ușor dc implementat într-un interpret, dar fac ca
scrisul unui compilator să fie mult mai greu: dc exemplu. APL. SNOBOL4 și multe limbaje de script permit
programelor să construiască cod sursă arbitrară la runtime, cu operații dc șiruri regulate, și apoi să execute acel
cod trecându-l la o funcție dc evaluare specială. Pentru a implementa aceste funcții într-un limbaj compilat,
programele trebuie dc obicei livrate cu o bibliotecă dc rulare care include o versiune a compilatorului in sine.

Tipuri de compilatoare
O clasificare a compilatoarelor este realizată de platforma pe care se execută codul lor generat. Aceasta este
cunoscută sub numele de platforma țintă.
Un compilator nativ sau găzduit este unul al cărui proces este destinat să ruleze direct pe același tip de computer
și sistem de operare pe care compilatorul in sine il rulează. Ieșirea unui compilator încrucișat este proiectată
pentru a rula pc o platformă diferită. Compilatoarele încrucișate sunt adesea utilizate atunci când dezvoltă
software pentru sisteme încorporate care nu sunt destinate să susțină un mediu de dezvoltare software.
Ieșirea unui compilator care produce cod pentru o mașină virtuală (VM) poate fi sau nu executată pc aceeași
platformă cu compilatorul cârc a produs-o. Din acest motiv, aceste compilatoare nu sunt de obicei clasificate ca
compilatoare native sau încrucișate.
Limbajul de nivel inferior care este ținta unui compilator poate fi el însuși un limbaj de programare la nivel
înalt. C, privit de unii ca un fel de limbaj portabil de asamblare, este frecvent limbajul țintă al acestor
compilatoare. De exemplu, front, compilatorul original pentru C ++, a folosit C ca limbă țintă. Codul C generat
de un astfel de compilator nu este de obicei conceput pentru a fi citit și întreținut de către oameni, astfel încât
stilul indent și crearea codului intermediar C destui de mult sunt ignorate. Unele dintre caracteristicile C care il
fac un limbaj țintă bun includ directiva #linc, care poate ti generată dc compilator pentru a susține debugging- ul
sursei originale și suportul pentru platformă larg disponibil cu compilatoare C.
în timp ce un tip dc compilator obișnuit produce codul mașinii, există multe alte tipuri:
- Compilatoarele sursă la sursă sunt un tip de compilator care ia un limbaj la nivel înalt ca intrare și
produce un limbaj la nivel înalt. De exemplu, un compilator de paralelizare automată va lua frecvent un program
dc limbaj la nivel înalt ca o intrare și apoi să transforme codul și să-l adnoteze cu adnotări de cod paralele (dc
cx. OpcnMP) sau constructie de limbaj (dc exemplu, declarațiile DOALL ale lui Fortran).
- Compilatoare Bytecode care compilează la limbajul dc asamblare al unei mașini teoretice, precum
unele implementări Prolog
Acest aparat Prolog este cunoscut și sub denumirea de Warren Abstract Machine (sau WAM).
- Compilatoarele Bytecode pentru Java. Python sunt, dc asemenea, exemple din această categoric.
- Compilatoarele J-in-time (compilatorul J1T) amână compilarea până la timpul de execuție.
Compilatoarele J1T există pentru multe limbi moderne, inclusiv Python. JavaScript. Smalltalk. Java.
Microsoft .NET Common Intermediate Language (CIL) și altele. Un compilator JIT rulează, in general, in
interiorul unui interpret. Când interpretul detectează că o cale de cod este “fierbinte", adică este executat
frecvent, compilatorul J1T va fi invocat și va compila codul „la cald" pentru o performanță sporită.
Pentru unele limbi, cum ar fi Java, aplicațiile sunt compilate mai întâi folosind un compilator bytecode și livrate
într-o reprezentare intermediară independentă de mașină. Un interpret bytecode execută bytecode, dar
compilatorul JIT va traduce bytecode în codul mașinii atunci când este necesară o performanță crescută.
- Compilatoarele hardware (cunoscute și sub numele dc instrumente dc sinteză) sunt compilatoare a căror
ieșire este o descriere a configurației hardware în loc dc o secvență dc instrucțiuni.
Rezultatele acestor compilatoare vizează hardware-ul computerului la un nivel foarte scăzut, dc
exemplu, un array gate-programabil dc câmp (FPGA) sau un circuit integrat specific AS1C să fie compilatori de
hardware, deoarece codul sursă pe care il compila controlează eficient configurația finală a hardware-ului și
modul de funcționare al acestuia. Rezultatul compilării este doar o interconectare a tranzistoarelor sau a
tabelelor de căutare.

Un exemplu de compilator hardware este XST, instrumentul de sinteză Xilinx utilizat pentru configurarea
FPGA.
 un asamblator este un program care compilează limbajul de asamblare care poate fi citit de om la codul
mașinii, instrucțiunile reale executate de hardware. Programul invers care traduce codul mașinii in
limbajul de asamblare se numește dezasamblator.
 un program care se traduce de la un limbaj de nivel scăzut la unul superior este un decompilator.
 un program care se traduce între limbi la nivel înalt este de obicei numit traducător de limbă,
compilator sursă-sursă, convertor de limbă sau rescriptor de limbă. Ultimul termen este de obicei
aplicat traducerilor care nu implică o schimbare de limbă .
 un program care se traduce într-un format de cod obiect cârc nu este acceptat pe mașina de compilare
se numește compilator încrucișat și este utilizat în mod obișnuit pentru pregătirea codului pentru
aplicațiile încorporate.
 Un program care rescrie codul obiect din nou in același tip de cod obiect in timp ce aplică optimizări și
transformări este un recompilator binar.

Bibliografie
https://ro.wikipedia.org/wiki/Compilator
https://en.wikipedia.org/wiki/Compiler
https://www.guru99.com/compiler-design-tutorial.html
https://whatis.techtarget.com/definition/compiler
https://resources.saylor.org/wwwresources/archived/site/wp-content/uploads/2012/01/CS304-1.2.2-
COMPILERSHISTORYWIKI.pdf
https://en.wikipedia.org/wiki/History_of_compiler_construction
https://en.wikipedia.org/wiki/List_of_compilers
https://www.sciencehq.com/computing-technology/compiler-construction.html
https://www.geeksforgeeks.org/compiler-construction-tools/

S-ar putea să vă placă și