sâmbătă, 11 aprilie 2020

LFA - IFR Compilatoare - saptamana a 8-a - Cap5-6

Partea despre compilatoare (deocamdata doar pentru grupa LFA IFR):

Aici avem mai multe lucruri de facut...

1) Intai pe dvs. va rog sa cititi capitolul al 5-lea [aprox pg 48-> cap 6], urmat de explicatiile din pozele de mai jos, care formeaza un supliment.
2) Intre timp voi fotocopia dintr-o carte niste diagrame care arata cum se poate optimiza arborele sintactic al unei expresii. Facut.
3) Pregatiti-va dosarul Lab6 care este o copie a dosarului Lab4 (nu 5!) cu fisierele simple.y simple.lex  avand TOATE update-urile exact pina in capitolul al patrulea !
4) Azi aveti de terminat compilatorul din cartea de Constructie a compilatoarelor.
5) Azi aveti de testat compilatorul construit, folosind cele 12-19 programe Simple scrise in timpul laboratorului 1. Cautati-le in dosarul Lab1.
6) Azi aveti de citit codurile generate de compilator din diversele programe, pentru a vedea cum arata codul generat.

Spor la treaba, va voi asista, partial, prin comentarii la diferitele capitole.
 
 Sa incepem comentariile de sprijin:

Comentarii la Cap 5 [pg 48].
Asa cum este descris in schema unui compilator, dupa faza de analiza sintactica (care se bazeaza pe faza de analiza lexicala anterioara sau subordonata) se poate produce arborele sintactic, (sau se poate lucra doar pe o ramura su pe un nivel din el).
In cazul in care compilatorul produce intregul arbore, am gasit in cartea Structuri arborescente cu aplicatiile lor (de Ionescu Texe Clara si Zsako Ioan, Editura Tehnica, Bucuresti 1990), niste diagrame care explica foarte frumos, vizual, transformarile care se fac cu ocazia optimizarii arborelui.

Optimizari ale arborelui: Eliminarea sumei,diferentei, produsului,catului de constante si trecerea constantelor la dreapta expresiei. [pg. 126, din stanga.]

Optimizari ale arborelui: expresiile ca in fig 4.1 c (dreapta sus) nu au operanzii constante alaturati, deci au nevoie de reguli speciale de optimizare, dreapta sus.  fig 4.11.d.

Si existenta elementelor neutre la operatii, 0 la adunare, 1 la inmultire, permite niste optimizari, dreapta jos. fig 4.12.


Optimizari ale arborelui: si expresii cum ar fi x+3+y+5 au nevoie de migrarea constantei la coada sirului, iar regulile sunt altele. fig 4.13.

Exercitii: Daca setul instructiunilor limbajului masina al procesorului contin Inc, Dec, si o rotire care face dublarea (Le vom nota Inc,Dec, Dubl) in ce s-ar transforma dupa optimizare arborii expresiilor:

x+1,
x+2,
x-1,
x-2,
x*2,
x*4.

Desenati arborii corespunzatori, inainte si dupa optimizare.
Ex:

   (Sum)                        (Inc)
  /         \              =>       |
 x         (1)                       x

Revenim la cartea de Constructia Compilatoarelor folosind Flex si Bison:

Cap 6. Masini Virtuale

Nota: Acest capitol prezinta o masina virtuala simpla, avand doar procesor, memorie, stiva si functii de system pentru afisare de texte.
Nu va depuneti CV-ul la Oracle ca specialisti in Masini Virtuale doar dupa citirea acestui capitol.

Simplitatea acestei masini virtuale provine din nevoia de a construi o componenta soft  pe care sa ruleze programele compilate produse de compilatorul Simple.

P.S. Java face ceva asemanator ca sa ruleze coduri pe mai multe Hardware-uri, dar masina e ceva mai complicata.  La fel si Android-ul.

N-ar fi rau sa revedeti, pe alta pagina de blog, ASC - Invatam un procesor, care sunt "piesele" componente ale procesorului, din punct de vedere software.

Masina cu stiva [pg 53]

Sa reluam cartea de compilatoare, de la pagina 53, The Stack machine (dupa Niklaus Wirth, din volumul Algorithms + Data Structure = Programs)

Cititi va rog cap 6 in continuare si ...atentie mare la pg 55.
Acolo sunt toate instructiunile masinii virtuale folosite.

Practica:
Treceti apoi la pg 57. Vom adauga in compilatorul nostru modulul SM.h.
Mergeti la pg 59 unde este esenta masinii virtuale, acolo gasiti bucla "fetch-execution-loop" care cum ii spune numel, ia cate o instructiune pe rand, testeaza de care este si o executa.

Observati felul cum lucreaza cu stiva, deoarece se respecta principiul:
Ai o operatie de facut: ia operanzii din stiva, fa operatia, pune rezultatul la loc.

Intrebare: O editie a cartii de compilatoare are o greseala la instructiunea GT. Este la fel sau nu cu EQ sau cu LT ?
a) La mine e la fel, in editia mea.
b) La mine nu este si in acest caz am gasit randul in plus si l-am taiat.

Exercitiu: Corectati cazul instructiunii PWR , din penultima pg a cap 6.
Cum calculati ridicarea la putere ?

Intrebare: Daca masina ar fi lucrat cu numere reale, cum ati fi calculat ridicarea la putere a lui a la puterea b cand si a si b sunt numere reale /

Acum adaugati in SM.h linia de cod pt depanarea buclei fetch - execute  si varianta noua a functie main va apela acest fetch_execute_cycle().

Comentati totusi: //print_code() . Compilatorul nostru nu genereaza cod, deci fetch-execute nu are ce sa execute.

Construiti compilatorul din nou si trimiteti output-ul daar nu fiti dezamagiti, cat timp nu am generat codul, rezultatele rularii compilatorului nu vor fi impresionante.

Continuam ... cu Cap 7 pe o alta pagina de blog.

Sfarsitul paginii de blog de ajutor la Cap 6 - Compilatoare

Niciun comentariu:

Trimiteți un comentariu