SlideShare a Scribd company logo
1 of 53
Download to read offline
Limbaje formale și
translatoare
Cadru didactic
 Curs+Laborator
 Elisa Moisi
 E-mail: emoisi@uoradea.ro
Ce vom face la LFT în acest an
 Cum se implementeaza un limbaj de
programare
 Analiza lexicală, sintactică, semantică
 Generare de cod intermediar
 Sistemul de runtime
 Optimizări
 Garbage collection, Just In Time compilers
Tehnologii
 Limbaje de programare
 Pentru unele lucrări practice la alegere
 Parsare
 generatoare de analizoare lexicale+semantice
Notare
 Laboratoare - 50%
 Verificare pe parcurs - 50%
Bibliografie
The Purple Dragon Book
Compilers - Principles, Techniques and Tools
Aho, Lam, Sethi & Ullman
Exista un numar mare de cursuri online bazate pe Dragon Book
(de ex. coursera.org )
Bibliografie
Compiler Construction. Principles and Practice
Kenneth Louden
Structura cursului
 Cursul cuprinde aspecte teoretice si practice
 Aveți nevoie de limbaje de programare!
 Teme programare = practică
De ce un curs de compilatoare
 Scopul cursului: cum se implementeaza un limbaj
de programare
 De ce e nevoie de multe limbaje…
 Fiecare domeniu de aplicatie are cerintele proprii (aplicatii
de sistem, baze de date, calcul stiintific, aplicatii web)
 Dinamica limbajelor de programare
 Este relativ usor de scris un limbaj nou.
 Este greu de modificat un limbaj popular.
 Apar noi domenii de aplicatii.
 Limbaje legate de platforma (Java, .NET , Android)
De ce un curs de compilatoare
 Sunt peste tot
 Toolchains; IDE-uri; analiza statică; execuție simbolică;
scripting; domain specific languages; baze de date;
tehnoredactare; servere HTTP; framework-uri web;
browsere; drivere video
 Combina cunostinte de hardware, software,
inginerie, matematica
 Multe probleme grele/complexe, implica multa
teorie dar si practica
 Compilatoarele “ghideaza” procesoarele viitoare
Cum sunt implementate limbajele?
 Două strategii principale
 Interpretoarele rulează programele “așa cum sunt”
 Preprocesare puțină sau de loc
 Compilatoarele – preprocesare extinsă
Istoria limbajelor high-level
 1954: IBM dezvoltă 704
 Succesorul lui 701
 Problema
 Costurile software depășesc costurile hardware
 Toată programarea se efectuează în limbaj de
asamblare
Soluția
 Introducerea Speedcoding
 Un interpretor
 Rulează de 10-20 de ori mai
încet decât asambloarele
scrise manual
John Backus
FORTRAN I
 John Backus
 Ideea
 Translatează codul de nivel înalt în limbaj de
asamblare
 Mulți au considerat imposibil
FORTRAN I
 1954-7
 Proiectul FORTRAN I
 1958
 >50% din software-uri sunt în FORTRAN
 Timpul de dezvoltare redus la jumătate
FORTRAN I
 Primul compilator
 Impact major în sțiința calculatoarelor
 Dezvoltare teoretica
 Compilatoarele moderne mențin scheletul
FORTRAN I
Structura compilatoarelor
 Analiza lexicală
 Analiza sintactică
 Analiza semantică
 Optimizator
 Generator de cod
Structura compilatoarelor
Structura detaliata
24
Fazele compilarii
▪ Preprocesorul macro substituţie, eliminarea
comentariilor, etc.
▪ Analiză + generare de cod = componenta principală a
traducerii
❑ Se verifica corectitudinea formala a textului programului
❑ Se traduce acest text într-o alta forma
▪ Optimizari = îmbunătăţirea calitatii traducerii
(performanţelor programului tradus)
▪ Fazele nu sunt neapărat clar separate ci sunt realizate
printr-un ansamblu de funcţii care cooperează
25
Analiza lexicală
▪ Automate finite, expresii regulate
▪ Imparte programul in unitati lexicale (atomi
lexicali, tokeni)
❑ Cuvinte cheie
❑ Numere
❑ Nume
▪ Prima decizie stabilirea atomilor lexicali ai
limbajului
26
Analiza lexicala
▪ Un atom lexical are
❑ Clasa (cod numeric) folosit in analiza sintactica
❑ Atribute specifice clasei analiza semantica,
generare de cod
▪ De obicei, analizorul lexical are o interfata
simpla
❑ lexer.getNextToken()
27
Analiza lexicală
 Primul pas
 Recunoașterea cuvintelor
Aceasta este o propoziției.
Analiza lexicală
 Analizorul lexical împarte textul programului în
cuvinte sau atomi
if x == y then z = 1; else z = 2;
Analiza sintactică
▪ Descompune textul programului sursa în
componentele sale "gramaticale"
30
Analiza sintactită
 După înțelegerea cuvintelor, trebuie înțeleasă
structura propoziției
 Analiza sintactică = diagrame de sintaxă
 Arbore sintactic
Diagrama unei propoziții
Aceasta este o propoziției
substantiv verb
complement
articol substantiv
predicat
subiect
propoziție
Analizor sintactic al unui program
if x == y then z = 1; else z = 2;
x == y z 1 z 2
atribuire atribuire
operator de relaționare
condiție logică instrucțiune-then instrucțiune-else
instrucțiune-if-then-else
Arbore de derivare / sintactic
34
Analiza semantică
▪ O mare parte e integrata de obicei in analiza
sintactica
▪ Verificarea corectitudinii semantice a
propozitiilor
❑ In compilatoare verificarea consistentei
programului, verificari de tip
▪ Adnoteaza arborele de derivare cu informatii
semantice (de tip)
❑ Pregateste generarea de cod
35
Analiza semnatică
 Înțelegerea “sensului” unei propoziții
 Sensul este foarte greu pentru compilatoare
 Compilatoarele efectuează analize limitate pentru
a găsi incoerențe
Analiza semantică – limba română
 Exemplu
 Andrei a spus că Marian a lăsat tema lui acasă.
◼ La cine se referă “lui”? la Andrei sau la Marian?
 Și mai complicat
 Andrei a spus că Andrei a lăsat tema lui acasă?
◼ Câți Andrei sunt?
◼ Care și-a lăsat tema acasă?
Analiza semantică în programare
 Limbajele de
programare definesc
reguli clare pentru a
evita ambiguitatea
 Codul C++ afișează 4;
este utilizată
instrucțiunea din
interior
{
int Andrei = 3;
{
int Andrei = 4;
cout<<Andrei;
}
}
Analiza semantică
 Compilatoarele efectuează multe verificări
semantice pe lângă cele legate de variabile
 Exemplu
 Andrei a spus că a lăsat tema ei acasă.
 Nepotrivire de tip între Andrei și ei
Detectarea erorilor
▪ Analiza lexicală - şir care nu corespunde unui
atom lexical
❑ 0x1234ABFG
▪ Analiza sintactica erori legate de structura
instrucţiunilor
❑ int real alfa; alfa;/* corect lexical, nu sintactic
▪ Analiză semantică erori semantice
❑ A=b+c; /*incorect daca b e de tip ‘struct’ */
▪ Recuperarea din eroare - cum continuam analiza
cand am intalnit o eroare
40
Generarea de cod intermediar
▪ Uneori, direct in timpul parsarii
❑ Sau prin parcurgerea arborelui de derivare
sintactic
▪ “cod obiect pentru o masina virtuală”
❑ Permite multe optimizari comune pentru diferite
frontend-uri limbaje si backend-uri procesoare
❑ Unele optimizari se pot face si direct pe arbore
41
Optimizare
 Modificarea automată a programelor astfel încât
acestea să
 Ruleze mai rapid
 Utilizeze mai puțină memorie
 În general, să păstreze anumite resurse
Generator de cod
 Produce cod în limbaj de asamblare (în general)
 Translatare într-un alt limbaj
 Asemănător cu traducerea limbajelor
Limbaj intermediar
 Multe compilatoare efectuează translatări între
forme intermediare succesive
 Toate, cu excepția primului și ultimului sunt
considerate limbaje intermediare
 De obicei este 1 LI
Limbaj intermediar
 Proiectarea limbajului are un impact mare asupra
compilatorului
 Determină ce este ușor sau greu de compilat
Compilatoare în ziua de azi
 Structura generală a aproape fiecărui compilator
aderă la schema din curs
 Proporțiile s-au modificat de când a fost inventat
FORTRAN
 La început: analiza lexicală, sintactică era partea cea
mai complexă, cea mai scumpă
 Astăzi: optimizarea domină toate celelalte faze
Analizor lexical (Scanner) - Exemplu
a[index] = 4 + 2
 conține 12 caractere nealbe și 8 atomi
a identificator
[ paranteză dreaptă
Index identificator
] paranteză dreaptă
= atribuire
4 număr
+ adunare
2 număr
Analizor sintactic (Parser)
 Analiza sintactică
 verifică dacă programul sursă de la intrare este corect
din punct de vedere sintactic
◼ gruparea atomilor în structuri sintactice - arbore sintactic
Analizor sintactic (Parser) - Exemplu
 Arbore de derivare - a[index] = 4 + 2
 Eficient
◼ vizualizarea sintaxei programului
 Ineficient
◼ reprezentarea structurii programului
Analizor sintactic (Parser) - Exemplu
 Arbore de derivare
a[index] = 4 + 2
Analizor sintactic (Parser) - Exemplu
 Arbore sintactic - a[index] = 4 + 2
 Analizoarele sintactice tind sa genereze un arbore
sintactic care este o condensare a arborelui de
derivare
Analizor semantic - Exemplu
 Arbore semantic - a[index] = 4 + 2
Optimizatorul de cod sursă
 Modifică arborele sintactic, ori porţiuni din codul intermediar,
astfel încât programul rezultat să îndeplinească unele cerinţe de
performanţă
 În cazul nostru compilatorul poate efectua adunarea 4 + 2 și se
obține valoarea 6 - împachetarea constantelor - constant
folding
 Se optimizeaza o forma liniara a arborelui
 Se poate folosi o variabila temporara t pentru a stoca rezultatul
adunarii
t=4+2 a[index]=t
 Optimizatorul imbunatateste acest cod in doi pasi
 Efectuând adunarea t = 6 a[index]=t
 Înlocuind valoarea lui t: a[index]=6
Optimizatorul de cod sursă
Generatorul de cod - Exemplu
MOV R0, index ;; value of index R0
MUL R0, 2 ;; double value in R0
MOV R1, &a ;; address of a R1
ADD R1, R0 ;; add R0 to R1
MOV *R1, 6 ;; constant 6 address in R1
*R1 – adresare indirecta la registrii - ultima instructiune
stocheaza valoarea 6 la adresa continuta in R1
Optimizatorul de cod obiect
MOV R0, index ;; value of index R0
SHL R0 ;; double value in R0
MOV &a[R0], 6 ;; constant 6 address a + R0
Limbaje si gramatici
▪ Ce este o gramatica?
▪ Dar un limbaj?
▪ Tipuri de gramatici
▪ Ierarhia Chomsky a gramaticilor
❑ Regulate
❑ Independente de context
❑ Dependente de context
❑ Generice
▪ Unde se incadreaza un limbaj de programare?
57
Limbaje si gramatici
58

More Related Content

Similar to LFT-C1-Introducere.pdf (9)

Graduation projects in Crispico
Graduation projects in CrispicoGraduation projects in Crispico
Graduation projects in Crispico
 
Algoritmi 121014204617-phpapp02
Algoritmi 121014204617-phpapp02Algoritmi 121014204617-phpapp02
Algoritmi 121014204617-phpapp02
 
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
 
DP_1_1 ro.pptx
DP_1_1 ro.pptxDP_1_1 ro.pptx
DP_1_1 ro.pptx
 
Cap02
Cap02Cap02
Cap02
 
Irina Cureraru
Irina CureraruIrina Cureraru
Irina Cureraru
 
Elemente de programare ap
Elemente de programare apElemente de programare ap
Elemente de programare ap
 
24365896 tutorial-instalare-wordpress-carteamea-net
24365896 tutorial-instalare-wordpress-carteamea-net24365896 tutorial-instalare-wordpress-carteamea-net
24365896 tutorial-instalare-wordpress-carteamea-net
 
Capitolul 3
Capitolul 3Capitolul 3
Capitolul 3
 

LFT-C1-Introducere.pdf

  • 2. Cadru didactic  Curs+Laborator  Elisa Moisi  E-mail: emoisi@uoradea.ro
  • 3. Ce vom face la LFT în acest an  Cum se implementeaza un limbaj de programare  Analiza lexicală, sintactică, semantică  Generare de cod intermediar  Sistemul de runtime  Optimizări  Garbage collection, Just In Time compilers
  • 4. Tehnologii  Limbaje de programare  Pentru unele lucrări practice la alegere  Parsare  generatoare de analizoare lexicale+semantice
  • 5. Notare  Laboratoare - 50%  Verificare pe parcurs - 50%
  • 6. Bibliografie The Purple Dragon Book Compilers - Principles, Techniques and Tools Aho, Lam, Sethi & Ullman Exista un numar mare de cursuri online bazate pe Dragon Book (de ex. coursera.org )
  • 8. Structura cursului  Cursul cuprinde aspecte teoretice si practice  Aveți nevoie de limbaje de programare!  Teme programare = practică
  • 9. De ce un curs de compilatoare  Scopul cursului: cum se implementeaza un limbaj de programare  De ce e nevoie de multe limbaje…  Fiecare domeniu de aplicatie are cerintele proprii (aplicatii de sistem, baze de date, calcul stiintific, aplicatii web)  Dinamica limbajelor de programare  Este relativ usor de scris un limbaj nou.  Este greu de modificat un limbaj popular.  Apar noi domenii de aplicatii.  Limbaje legate de platforma (Java, .NET , Android)
  • 10. De ce un curs de compilatoare  Sunt peste tot  Toolchains; IDE-uri; analiza statică; execuție simbolică; scripting; domain specific languages; baze de date; tehnoredactare; servere HTTP; framework-uri web; browsere; drivere video  Combina cunostinte de hardware, software, inginerie, matematica  Multe probleme grele/complexe, implica multa teorie dar si practica  Compilatoarele “ghideaza” procesoarele viitoare
  • 11. Cum sunt implementate limbajele?  Două strategii principale  Interpretoarele rulează programele “așa cum sunt”  Preprocesare puțină sau de loc  Compilatoarele – preprocesare extinsă
  • 12. Istoria limbajelor high-level  1954: IBM dezvoltă 704  Succesorul lui 701  Problema  Costurile software depășesc costurile hardware  Toată programarea se efectuează în limbaj de asamblare
  • 13. Soluția  Introducerea Speedcoding  Un interpretor  Rulează de 10-20 de ori mai încet decât asambloarele scrise manual John Backus
  • 14. FORTRAN I  John Backus  Ideea  Translatează codul de nivel înalt în limbaj de asamblare  Mulți au considerat imposibil
  • 15. FORTRAN I  1954-7  Proiectul FORTRAN I  1958  >50% din software-uri sunt în FORTRAN  Timpul de dezvoltare redus la jumătate
  • 16. FORTRAN I  Primul compilator  Impact major în sțiința calculatoarelor  Dezvoltare teoretica  Compilatoarele moderne mențin scheletul FORTRAN I
  • 17. Structura compilatoarelor  Analiza lexicală  Analiza sintactică  Analiza semantică  Optimizator  Generator de cod
  • 20. Fazele compilarii ▪ Preprocesorul macro substituţie, eliminarea comentariilor, etc. ▪ Analiză + generare de cod = componenta principală a traducerii ❑ Se verifica corectitudinea formala a textului programului ❑ Se traduce acest text într-o alta forma ▪ Optimizari = îmbunătăţirea calitatii traducerii (performanţelor programului tradus) ▪ Fazele nu sunt neapărat clar separate ci sunt realizate printr-un ansamblu de funcţii care cooperează 25
  • 21. Analiza lexicală ▪ Automate finite, expresii regulate ▪ Imparte programul in unitati lexicale (atomi lexicali, tokeni) ❑ Cuvinte cheie ❑ Numere ❑ Nume ▪ Prima decizie stabilirea atomilor lexicali ai limbajului 26
  • 22. Analiza lexicala ▪ Un atom lexical are ❑ Clasa (cod numeric) folosit in analiza sintactica ❑ Atribute specifice clasei analiza semantica, generare de cod ▪ De obicei, analizorul lexical are o interfata simpla ❑ lexer.getNextToken() 27
  • 23. Analiza lexicală  Primul pas  Recunoașterea cuvintelor Aceasta este o propoziției.
  • 24. Analiza lexicală  Analizorul lexical împarte textul programului în cuvinte sau atomi if x == y then z = 1; else z = 2;
  • 25. Analiza sintactică ▪ Descompune textul programului sursa în componentele sale "gramaticale" 30
  • 26. Analiza sintactită  După înțelegerea cuvintelor, trebuie înțeleasă structura propoziției  Analiza sintactică = diagrame de sintaxă  Arbore sintactic
  • 27. Diagrama unei propoziții Aceasta este o propoziției substantiv verb complement articol substantiv predicat subiect propoziție
  • 28. Analizor sintactic al unui program if x == y then z = 1; else z = 2; x == y z 1 z 2 atribuire atribuire operator de relaționare condiție logică instrucțiune-then instrucțiune-else instrucțiune-if-then-else
  • 29. Arbore de derivare / sintactic 34
  • 30. Analiza semantică ▪ O mare parte e integrata de obicei in analiza sintactica ▪ Verificarea corectitudinii semantice a propozitiilor ❑ In compilatoare verificarea consistentei programului, verificari de tip ▪ Adnoteaza arborele de derivare cu informatii semantice (de tip) ❑ Pregateste generarea de cod 35
  • 31. Analiza semnatică  Înțelegerea “sensului” unei propoziții  Sensul este foarte greu pentru compilatoare  Compilatoarele efectuează analize limitate pentru a găsi incoerențe
  • 32. Analiza semantică – limba română  Exemplu  Andrei a spus că Marian a lăsat tema lui acasă. ◼ La cine se referă “lui”? la Andrei sau la Marian?  Și mai complicat  Andrei a spus că Andrei a lăsat tema lui acasă? ◼ Câți Andrei sunt? ◼ Care și-a lăsat tema acasă?
  • 33. Analiza semantică în programare  Limbajele de programare definesc reguli clare pentru a evita ambiguitatea  Codul C++ afișează 4; este utilizată instrucțiunea din interior { int Andrei = 3; { int Andrei = 4; cout<<Andrei; } }
  • 34. Analiza semantică  Compilatoarele efectuează multe verificări semantice pe lângă cele legate de variabile  Exemplu  Andrei a spus că a lăsat tema ei acasă.  Nepotrivire de tip între Andrei și ei
  • 35. Detectarea erorilor ▪ Analiza lexicală - şir care nu corespunde unui atom lexical ❑ 0x1234ABFG ▪ Analiza sintactica erori legate de structura instrucţiunilor ❑ int real alfa; alfa;/* corect lexical, nu sintactic ▪ Analiză semantică erori semantice ❑ A=b+c; /*incorect daca b e de tip ‘struct’ */ ▪ Recuperarea din eroare - cum continuam analiza cand am intalnit o eroare 40
  • 36. Generarea de cod intermediar ▪ Uneori, direct in timpul parsarii ❑ Sau prin parcurgerea arborelui de derivare sintactic ▪ “cod obiect pentru o masina virtuală” ❑ Permite multe optimizari comune pentru diferite frontend-uri limbaje si backend-uri procesoare ❑ Unele optimizari se pot face si direct pe arbore 41
  • 37. Optimizare  Modificarea automată a programelor astfel încât acestea să  Ruleze mai rapid  Utilizeze mai puțină memorie  În general, să păstreze anumite resurse
  • 38. Generator de cod  Produce cod în limbaj de asamblare (în general)  Translatare într-un alt limbaj  Asemănător cu traducerea limbajelor
  • 39. Limbaj intermediar  Multe compilatoare efectuează translatări între forme intermediare succesive  Toate, cu excepția primului și ultimului sunt considerate limbaje intermediare  De obicei este 1 LI
  • 40. Limbaj intermediar  Proiectarea limbajului are un impact mare asupra compilatorului  Determină ce este ușor sau greu de compilat
  • 41. Compilatoare în ziua de azi  Structura generală a aproape fiecărui compilator aderă la schema din curs  Proporțiile s-au modificat de când a fost inventat FORTRAN  La început: analiza lexicală, sintactică era partea cea mai complexă, cea mai scumpă  Astăzi: optimizarea domină toate celelalte faze
  • 42. Analizor lexical (Scanner) - Exemplu a[index] = 4 + 2  conține 12 caractere nealbe și 8 atomi a identificator [ paranteză dreaptă Index identificator ] paranteză dreaptă = atribuire 4 număr + adunare 2 număr
  • 43. Analizor sintactic (Parser)  Analiza sintactică  verifică dacă programul sursă de la intrare este corect din punct de vedere sintactic ◼ gruparea atomilor în structuri sintactice - arbore sintactic
  • 44. Analizor sintactic (Parser) - Exemplu  Arbore de derivare - a[index] = 4 + 2  Eficient ◼ vizualizarea sintaxei programului  Ineficient ◼ reprezentarea structurii programului
  • 45. Analizor sintactic (Parser) - Exemplu  Arbore de derivare a[index] = 4 + 2
  • 46. Analizor sintactic (Parser) - Exemplu  Arbore sintactic - a[index] = 4 + 2  Analizoarele sintactice tind sa genereze un arbore sintactic care este o condensare a arborelui de derivare
  • 47. Analizor semantic - Exemplu  Arbore semantic - a[index] = 4 + 2
  • 48. Optimizatorul de cod sursă  Modifică arborele sintactic, ori porţiuni din codul intermediar, astfel încât programul rezultat să îndeplinească unele cerinţe de performanţă  În cazul nostru compilatorul poate efectua adunarea 4 + 2 și se obține valoarea 6 - împachetarea constantelor - constant folding  Se optimizeaza o forma liniara a arborelui  Se poate folosi o variabila temporara t pentru a stoca rezultatul adunarii t=4+2 a[index]=t  Optimizatorul imbunatateste acest cod in doi pasi  Efectuând adunarea t = 6 a[index]=t  Înlocuind valoarea lui t: a[index]=6
  • 50. Generatorul de cod - Exemplu MOV R0, index ;; value of index R0 MUL R0, 2 ;; double value in R0 MOV R1, &a ;; address of a R1 ADD R1, R0 ;; add R0 to R1 MOV *R1, 6 ;; constant 6 address in R1 *R1 – adresare indirecta la registrii - ultima instructiune stocheaza valoarea 6 la adresa continuta in R1
  • 51. Optimizatorul de cod obiect MOV R0, index ;; value of index R0 SHL R0 ;; double value in R0 MOV &a[R0], 6 ;; constant 6 address a + R0
  • 52. Limbaje si gramatici ▪ Ce este o gramatica? ▪ Dar un limbaj? ▪ Tipuri de gramatici ▪ Ierarhia Chomsky a gramaticilor ❑ Regulate ❑ Independente de context ❑ Dependente de context ❑ Generice ▪ Unde se incadreaza un limbaj de programare? 57