<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-38768718</id><updated>2012-01-02T22:29:38.464+02:00</updated><category term='Altele'/><category term='Rascal'/><category term='Compilatoare'/><title type='text'>Code Lake</title><subtitle type='html'>[..]</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-38768718.post-6469064929945642219</id><published>2007-04-28T00:25:00.000+03:00</published><updated>2007-04-28T00:37:53.906+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Altele'/><title type='text'>Ce ne mai tine ocupati..</title><content type='html'>&lt;div style="text-align: justify;"&gt;In ultimul timp am avut un program destul de incarcat, asa ca Rascal nu a primit prea multa atentie. Marti am fost la o sesiune de comunicari Microsoft (unde atat Laur cat si eu am primit cate un Windows Vista -- jucarii noi &lt;span style="color: rgb(51, 51, 255);"&gt;:D&lt;/span&gt;). Apoi am pierdut putin timp cu &lt;a href="http://www.vlite.net/"&gt;vLite&lt;/a&gt;. E uimitor sa vezi cum un kit de windows de patru giga scade pana la 950 de mega (si as mai fi economisit ceva, dar mi-a fost mila sa scot suportul pentru natural speech la search). &lt;br /&gt;&lt;br /&gt;In cea de-a doua parte a saptamanii ne-am ocupat cu organizarea etapelor judetene ale concursurilor InfoEduatie si CIA (care vor avea loc in aceeasi zi). Mai multe detalii &lt;a href="http://infoedu.webessence.ro/"&gt;aici&lt;/a&gt;. Asa ca am fost a toate liceele importante, am discutat cu profesorii si inca nu am apucat sa facem un barem. Cu putin noroc o sa ne ocupam de Rascal in weekendul asta.&lt;br /&gt;&lt;br /&gt;Pana la urmatorul post, bucurati-va de semi-vara pe care ne-a oferit-o incalzirea globala.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-6469064929945642219?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/6469064929945642219/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=6469064929945642219' title='2 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6469064929945642219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6469064929945642219'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/ce-ne-mai-tine-ocupati.html' title='Ce ne mai tine ocupati..'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-4655458555826473425</id><published>2007-04-21T16:14:00.000+03:00</published><updated>2007-04-22T00:20:18.736+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Cum se scrie un compilator (4)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Acum ceva timp v-am promis un articol in care sa vorbesc despre similitudinile dintre evaluarea de expresii si realizarea unui parser. Iata ca azi continui aceasta serie.&lt;br /&gt;&lt;br /&gt;Parser-ul nostru de expresii pleca de la o idee simpla: la fiecare pas, el stia la ce sa se astepte si actiona in consecinta, in functie de token-ul nou citit. Nu am putea gandi la fel si in cazul unui parser pentru un intreg program? Haideti sa vedem (in liniile urmatoare, token-urile dintre paranteze drepte sunt optionale, acoladele indica repetitii, iar bara verticala indica o lista de alternative):&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Un program (Rascal) contine doua tipuri de declaratii pe nivelul superior: variabile si functii.&lt;/li&gt;&lt;li&gt;Functiile sunt marcate prin "[entry] func", pe cand restul declaratiilor trebuie sa fie variabile.&lt;/li&gt;&lt;li&gt;O declaratie de variabila are forma "&lt;nume&gt; as &lt;tip&gt; [ := &lt;expresie&gt;]".&lt;/expresie&gt;&lt;/tip&gt;&lt;/nume&gt;&lt;/li&gt;&lt;li&gt;O declaratie de functie are forma "[entry] func &lt;nume&gt; ([{&lt;nume&gt; as &lt;tip&gt;}]): &lt;tip&gt; | none", fiind urmata pe linia urmatoare de catre un bloc de instructiuni.&lt;br /&gt;&lt;/tip&gt;&lt;/tip&gt;&lt;/nume&gt;&lt;/nume&gt;&lt;/li&gt;&lt;li&gt;Expresiile au o forma asemanatoare cu cea data in post-ul trecut.&lt;/li&gt;&lt;li&gt;Un bloc de instructiuni poate fi vid, poate contine apeluri de functii, atribuiri sau instructiuni de control.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Daca studiem cu atentie o lista asemanatoare cu cea de mai sus, observam ca la fiecare moment putem spune ce structura urmeaza, in functie de ceea ce am intalnit si de starea curenta.&lt;br /&gt;&lt;br /&gt;In aceste conditii, putem refolosi algoritmul din post-ul trecut, introducand mai multe stari pe langa cele de expresie, termen si factor. In acelasi timp, vom folosi cateva structuri de date in care memoram informatii despre variabilele si functiile declarate pana la momentul curent. Intr-adevar, efectuarea a doua treceri ar permite folosirea in programe a functiilor nedeclarate inca (vezi problemele asemanatoare din Pascal, C/C++, etc.), dar cred ca implementarea unei treceri preliminare va fi lasata pentru o "versiune" ulterioara.&lt;br /&gt;&lt;br /&gt;Chiar daca articolul de astazi a fost nici prea lung, nici prea substantial, nu voi post-a cod deoarece acesta este destul de complex pentru a-l rescrie in momentul de fata; intr-un articol viitor voi vorbi ori despre IL si generarea de cod, ori voi aduce mai multe amanunte referitoare la memorarea informatiilor colectate de-a lungul compilarii.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-4655458555826473425?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/4655458555826473425/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=4655458555826473425' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4655458555826473425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4655458555826473425'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/cum-se-scrie-un-compilator-4.html' title='Cum se scrie un compilator (4)'/><author><name>GrayShade</name><uri>http://www.blogger.com/profile/08614811410089147863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-4197930076111651811</id><published>2007-04-21T11:58:00.000+03:00</published><updated>2007-04-22T00:20:46.550+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Cateva lamuriri</title><content type='html'>&lt;div style="text-align: justify;"&gt;Am zis ca revin ieri. Am avut putina treaba si nu am putut sa scriu, dar iata astazi articolul promis. Si amanarea asta a fost una de bun augur pentru ca intre timp am facut cateva schimbari la compilator care vor face articolul mai interesant.&lt;br /&gt;Dupa cum spunea si Laur incercam sa scriem compilatorul fara sa ne agatam prea tare de teorie. Fara limbaje formale, fara automate, folosind intuitia. Dar cat de buna este ideea? Sa luam un exemplu practic: scannerul din compilator. Scannerul este componenta care transforma secvenele de caractere citite din fisier in lexeme/atomi lexicali pe care ii poate intelege parserul. Asadar, transformam &lt;span style="font-style: italic;"&gt;secventele de caractere&lt;/span&gt; in &lt;span style="font-style: italic;"&gt;siruri&lt;/span&gt;. Cum? Simplu, citind caracter cu caracter din fisier si respectand cateva reguli construim atomii lexicali (stringuri). Destul de intuitiv, nu? Dar sa vedem despre ce reguli discutam:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Spatiile albe (blankuri): nu au nici o semnificatie (cu mici exceptii) pentru parser deci trebuie sa le eliminam. Exceptiile sunt caracterul tab si caracterul newline, care sunt importante pentru Rascal, dar nu si pentru majoritatea compilatoarelor.&lt;/li&gt;&lt;li&gt;Separatorii: caractere precum "(", ")", ":", etc. Ele despart secvente de caractere mai lungi (cuvinte cheie, idetificatori, constante sir de caracter si numere).&lt;/li&gt;&lt;li&gt;Identificatorii: secvente de caractere care pot fi cuvinte cheie, nume de variabile, etc.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Pe baza regulilor algoritmul scannerului este destul de simplu (nici nu trebuie sa fie complicat):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: white;"&gt;cat timp caracterul curent este blank&lt;br /&gt;   ignoram&lt;br /&gt;&lt;br /&gt;daca avem in caracterul curent un separator&lt;br /&gt;   daca in caracterul curent se afla "&lt;br /&gt;       citim constanta sir de caractere&lt;br /&gt;   // Intr-un mod similar se fac verificarile&lt;br /&gt;   // pentru &lt;&gt;, &lt;=, &gt;=, :=&lt;br /&gt;   altfel&lt;br /&gt;       iesim din scanner&lt;br /&gt;&lt;br /&gt;daca avem cifra&lt;br /&gt;   citim numar&lt;br /&gt;altfel&lt;br /&gt;   citim idetficator&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Algoritmul de mai sus are cateva neajunsuri. Unul ar fi ca nu ia in seama caracterele nepermise in codul sursa al programuli scris in Rascal (%, #, $, etc) si cel de-al doilea ca lucreaza foarte mult cu stringuri. "&lt;&gt;" este un string si toate celelalte lexeme de asemenea. Poate ca nu pare un lucru rau la prima vedere, dar pentru aproximativ 50.000 de linii de cod numarul stringurilor alocate de compilator ajunge la 700.000 si ocupa circa 40 de mega de RAM! Clar abordarea noastra nu era buna. Atunci ne-am intors catre teoria, care spune ca este bine sa mapezi lexemele pe constante. Asta inseamna ca fiecarui terminal din gramatica ii corespunde o valoare numerica. Parserul nu va mai lucra cu stringuri (cu exceptia identificatorilor si a constanteor de tip sir de caractere) ci cu numere intregi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dupa optimizarile de mai sus numarul de alocari a scazut de la 700.000 la 200.000 si compilatorul a ajuns sa compileze 77.000 de linii de cod pe secunda. Destul de rapid as zice.&lt;br /&gt;&lt;br /&gt;In concluzie, nu este deloc o idee rea sa citesti cate ceva inainte sa te apuci sa implementezi, cu conditia sa nu te pierzi intr-atat de mult in documentatie incat sa nu mai poti iesi ;)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-4197930076111651811?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/4197930076111651811/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=4197930076111651811' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4197930076111651811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4197930076111651811'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/cateva-lamuriri.html' title='Cateva lamuriri'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-7960643376679065260</id><published>2007-04-20T00:01:00.000+03:00</published><updated>2007-04-20T10:45:29.585+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Good old times</title><content type='html'>Iata primele doua programe scrise in Rascal (da, sunt &lt;span style="font-weight: bold;"&gt;executabile&lt;/span&gt;):&lt;br /&gt;&lt;pre style="background-color: white;"&gt;entry func EnterSandman(): none&lt;br /&gt;   a as int32&lt;br /&gt;   b as int32&lt;br /&gt;   n as int32&lt;br /&gt;&lt;br /&gt;   a := 0&lt;br /&gt;   b := 1&lt;br /&gt;   n := 20&lt;br /&gt;   for i := 2 to n + 1&lt;br /&gt;       write(a)&lt;br /&gt;       c as int32 := a + b&lt;br /&gt;       a := b&lt;br /&gt;       b := c&lt;br /&gt;&lt;/pre&gt;Tema pentru voi: ghiciti ce face programul de mai sus :).&lt;br /&gt;&lt;br /&gt;Iar cel de-al doilea:&lt;br /&gt;&lt;pre style="background-color: white;"&gt;entry func GhicesteNumarul(): none&lt;br /&gt;   raspuns as int32&lt;br /&gt;   start as int32 := 0&lt;br /&gt;   stop as int32 := 100&lt;br /&gt;&lt;br /&gt;   writeline("Ganditi-va la un numar intre 0 si 100...")&lt;br /&gt;   write("Apasati 0 cand v-ati ales un numar. ")&lt;br /&gt;   readline(raspuns)&lt;br /&gt;&lt;br /&gt;   gasit as bool := false&lt;br /&gt;&lt;br /&gt;   do&lt;br /&gt;       write("Numarul dvs. este mai mic, mai mare sau egal cu ")&lt;br /&gt;       mijloc as int32 := (start + stop) / 2&lt;br /&gt;       write(mijloc)&lt;br /&gt;       write(" ? (-1, 0, 1) ")&lt;br /&gt;       readline(raspuns)&lt;br /&gt;&lt;br /&gt;       if raspuns = -1&lt;br /&gt;           stop := mijloc - 1&lt;br /&gt;       elseif raspuns = 1&lt;br /&gt;           start := mijloc + 1&lt;br /&gt;       elseif raspuns = 0&lt;br /&gt;           gasit := true&lt;br /&gt;       else&lt;br /&gt;           writeline("Nu inteleg decat -1, 0 sau 1!")&lt;br /&gt;   while start &lt;= stop and not gasit                 &lt;br /&gt;&lt;br /&gt;   if not gasit                              &lt;br /&gt;       writeline("M-ai mintit, nu ma mai joc :(")               &lt;br /&gt;   else                              &lt;br /&gt;       writeline("Am ghicit, asa e ca sunt bun?")  &lt;/pre&gt;&lt;br /&gt;Go, Rascal!&lt;br /&gt;&lt;br /&gt;Revin maine cu un post mai detaliat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-7960643376679065260?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/7960643376679065260/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=7960643376679065260' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/7960643376679065260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/7960643376679065260'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/good-old-times.html' title='Good old times'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-2472237784976132134</id><published>2007-04-15T23:05:00.000+03:00</published><updated>2007-04-15T23:11:00.726+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><title type='text'>("On"|"Off"),"toppic".</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pentru cei interesati de teoria compilatoarelor o sa postez linkul catre cartea lui Niklaus Wirth: &lt;a href="http://www.oberon.ethz.ch/WirthPubl/CBEAll.pdf"&gt;Compiler Construction&lt;/a&gt;. De ce tocmai cartea lui? Pentru ca nu te lovesti de un zid de limbaje formale, automate finite si alte cele. Este explicata logic, clar si cu multe exemple de cod (in Oberon).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-2472237784976132134?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/2472237784976132134/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=2472237784976132134' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2472237784976132134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2472237784976132134'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/onofftoppic.html' title='(&quot;On&quot;|&quot;Off&quot;),&quot;toppic&quot;.'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-2622800579784046634</id><published>2007-04-15T20:25:00.000+03:00</published><updated>2007-04-15T23:11:35.158+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Rascal lives</title><content type='html'>&lt;div style="text-align: justify;"&gt;Cam asta era statusul lui Laur zilele trecute si nu se insela. Rascal e mai viu ca niciodata. Si din ce in ce mai destept: a invatat sa compare si sa numere. Da, ati ghicit, am trecut la generarea de cod. Miercuri noapte (ca doar noaptea se programeaza cel mai bine) am inceput (de fapt Laur a inceput, eu am asistat in mare parte) generatorul de cod. In postul trecut ne intrebam ce metoda sa alegem (ILASM, Reflection.Emit, Cecil sau IL). Am hotarat ca cea mai buna variabta este Reflection.Emit. Asta pentru ca este parte din .net, deci nu avem nevoie de o librarie externa, ca in cazul Cecil, si este mai eleganta decat generarea de ILASM, pentru ca nu o sa mai avem devoie de il assembler. Nu, nu o sa generam IL.&lt;br /&gt;&lt;br /&gt;Daca, in legatura cu Cecil, ma plangeam ca nu are documentatie, pentru Reflection e destula, nu asta e problema.. Doar ca e laconica uneori. Macar e mai bine decat nimic. Asa ca prin "trial and error" in vreo 4 ore nedormite Rascal a invatat sa adune. Urmatoarea zi a invatat sa compare, iar ieri a invatat sa numere. Cu alte cuvinte stim: if, while, do si for. Mai e ceva de lucru, dar lucrurile nu arata deloc rau.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-2622800579784046634?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/2622800579784046634/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=2622800579784046634' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2622800579784046634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2622800579784046634'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/rascal-lives.html' title='Rascal lives'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-6788260442739704792</id><published>2007-04-06T00:33:00.000+03:00</published><updated>2007-04-06T09:04:54.968+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Din bucataria Rascalului</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ne apropiem din ce in ce mai mult de faza a doua a dezvoltarii compilatorului: generarea de cod. Pentru ca Laur nu a terminat inca seria de articole dedicata parserului nu o sa intru in detalii. Tinta compilatorului fiind platforma .net stim doar ceea ce vrem: un executabil care sa ruleze pe platforma Microsoft. Cum ajungem acolo insa e partea interesanta. O prima alternativa ar fi sa generam cod ILASM si sa folosim il-assemblerul pentru generarea executabilului. In fond il-assemblerul vine cu platforma .net, deci o sa il avem la indemana. Desi nu pare tocmai elegant este o tehnica destul de intalnita. ILASM este un limbaj puternic si flexibil, dar extrem de complex. Daca nu ma credeti aruncati o privire peste &lt;a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf"&gt;specificatii&lt;/a&gt;. Descurajator, nu? Ei bine, o a doua posibilitate, mult mai .. hm .. accesibila, ar fi sa folosim libraria &lt;a href="http://www.mono-project.com/Cecil"&gt;Cecil&lt;/a&gt;, o librarie dezvoltata de &lt;a href="http://evain.net/blog/" class="external" title="http://evain.net/blog/" rel="nofollow"&gt;Jb Evain&lt;/a&gt; pentru emiterea de cod IL. Este destul de completa din cate imi spune Laur. Ca alternativa am putea folosi System.Reflection din .net, dar nu e la fel de completa ca si Cecil. Bineinteles, am putea sa generam si IL direct, dar tinem la sanatatea noastra mintala si preferam sa nu ne gandim la varianta asta.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Inainte de ideea unui assembly pentru .net a fost o alta, mult mai atragatoare: implementarea unei masini virtuale pentru Rascal. Da, o masina virtuala. De ce? Pentru ca numai in felul asta Rascal ar putea sa isi respecte filosofia pana la capat. Deocamdata o sa fim nevoiti sa o "adaptam" la principiile .net-ului. Asta pentru ca o masina virtuala nu este cel mai usor lucru de scris. Mai ales una performanta. Am spus "deocamdata" pentru ca decizia initiala a fost sa terminam prima versiune a limbajului. Dupa versiunea 1.0 o sa luam deciziile legate de directia in care se va dezvolta limbajul si daca vom implementa sau nu o masina virtuala (in functie de cat de dureroasa e experienta generarii de cod).&lt;br /&gt;Sper ca Laur sa ierte asincronismul postului (am spus cam multe pentru un singur post). Pana data viitoare, numai bine.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-6788260442739704792?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/6788260442739704792/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=6788260442739704792' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6788260442739704792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6788260442739704792'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/din-bucataria-rascalului.html' title='Din bucataria Rascalului'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-138403642337198938</id><published>2007-04-04T22:47:00.000+03:00</published><updated>2007-04-06T23:14:15.066+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><title type='text'>Cum se scrie un compilator (3)</title><content type='html'>&lt;div style="text-align: justify;"&gt;V-am promis ca voi continua cu un articol despre structura unui parser. Incerc sa fac asta acum, desi nu ajuta nici oboseala, nici durerea de dinti, nici faptul ca Rascal nu se simte prea bine :).&lt;br /&gt;&lt;br /&gt;Am spus la un moment dat ca limbajele de programare se pot imparti in mai multe categorii, in functie de tipul de parser ce poate fi folosit pentru a le recunoaste. Rascal face si el parte dintr-una din aceste categorii, aceeasi cu cea a limbajului C (si, eventual, C++) -- totusi, nu voi da numele acesteia, deoarece am promis o serie de post-uri fara astfel de "notiuni teoretice", notiuni pe care am de gand sa le introduc intr-un mod mai subtil.&lt;br /&gt;&lt;br /&gt;Sa luam un limbaj foarte simplu (nu neaparat "limbaj de programare" in sensul standard): cel al expresiilor aritmetice formate cu operatorii *, +, -, constante, variabile si paranteze. O expresie corecta in acest limbaj este "(1-2)---3*a". Vom incerca sa gasim o metoda prin care putem deterimina corectitudinea (apartenenta la limbajul nostru a) unei astfel de expresii. Eu, cel putin, cunosc doua modalitati de a realiza acest lucru.&lt;br /&gt;&lt;br /&gt;Prima necesita utilizarea a doua stive: una pentru operanzi (constante si variabile) si una pentru operatori. Acestora le putem asocia diferite prioritati: parantezele au prioritatea cea mai mica, apoi urmeaza adunarea si scaderea pe acelasi nivel, incheiand cu inmultirea. Vom parcurge expresia de la stanga la dreapta, procesand cate un token. Daca intalnim un operand, il punem in stiva, iar daca intalnim un operator, comparam prioritatea acestuia cu prioritatea celui din varful stivei. Daca este mai mare, il adaugam, daca nu, efectuam ultima operatie (extragem operanzii necesari din varful stivei operanzilor, apoi adaugam la aceasta rezultatul). Efectuarea operatiei nu este neaparat necesara, dar trebuie memorat numarul de elemente din aceasta. Daca avem destula grija si tinem cont de anumite cazuri particulare (cum ar fi "-" unar) si eventual incadram expresia initiala cu paranteze pentru a avea o structura unitara, ne putem indeplini scopul propus.&lt;br /&gt;&lt;br /&gt;A doua metoda foloseste si ea o stiva, dar una implicita. Ideea pare un pic mai naturala -- sa privim expresia "de la distanta": vedem o suma de termeni (deoarece adunarile si scaderile se efectueaza ultimele), asemanatoare cu ... + ... - ... + .... Pare atunci firesc sa definim expresia ca fiind o suma de termeni. Dar ce este un termen? Simplu: un produs de factori: ... * ... * ..., etc. Si ce este un factor? Au ramas constantele, variabilele, parantezele si operatorul minus unar. Se observa ca prin coborarea in aceasta ierarhie se ajunge la "prioritati" mai mari.&lt;br /&gt;&lt;br /&gt;Vom incerca sa explicitam observatiile acestea intr-un mod mai formal:&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Expresie := Termen ['+'|'-' Termen]*&lt;br /&gt;Termen := Factor ['*' Factor]*&lt;br /&gt;Factor := Constanta | Variabila | '+' Factor | '-' Factor&lt;br /&gt;          | '(' Expresie ')'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Unde "|" inseamna alternativa, iar "*" inseamna repetarea expresiei precedente de un numar oarecare de ori. Aspectul factorilor poate parea bizar, dar sa ne amintim de legatura dintre nivelul in ierarhie si prioritate: operatorii unari, parantezele si constantele/variabilele sunt "evaluate" primele, trecandu-se apoi la produse, respectiv sume.&lt;br /&gt;&lt;br /&gt;Priviti bine cele trei linii de mai sus. Vreau sa le intelegeti. &lt;span style="font-style: italic;"&gt;Trebuie&lt;/span&gt; sa le intelegeti, pentru ca vom aborda in mod similar problema verificarii sursei unui program.&lt;br /&gt;&lt;br /&gt;Le-ati inteles? Ok. Va cred, in fond :).&lt;br /&gt;&lt;br /&gt;Atunci n-ar trebui sa va mire faptul ca propun o solutie recursiva de evaluare. Plecam din Expresie, in care citim un Termen; apoi, in functie de token-ul curent (care trebuie sa fie +, - sau sfarsit de fisier), continuam sau nu cautarea termenilor. Termen va apela Factor, iar Factor se va intoarce direct (variabila sau constanta), se va autoapela (operator unar) sau va apela Expresie (paranteza deschisa), si va astepta o paranteza inchisa.&lt;br /&gt;&lt;br /&gt;Parerea mea, cel putin, este ca a doua varianta este mai naturala si mai explicita; este, oarecum, si mai lenta, datorita apelurilor recursive. Este si varianta folosita in Rascal :). (Dar nu va faceti griji pentru viteza: Rascal poate, la ora actuala, sa verifice aproape 35000 de linii pe secunda, pe un calculator destul de vechi). Putem, totusi, deosebi cele doua modalitati: una foloseste o stiva explicita si face operatii in varful acesteia, pe cand a doua pleaca de la o descriere naturala si foloseste apeluri recursive.&lt;br /&gt;&lt;br /&gt;Dar sa revenim la expresiile noastre aritmetice: putem scrie un program care sa le verifice? &lt;a href="http://monoport.com/2315"&gt;Fireste&lt;/a&gt;. Studiati cu atentie codul: desi poate parea ciudat la prima vedere, nu am facut decat sa transpun cele discutate aici.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Data viitoare voi vorbi despre cum putem aplica aceeasi metoda la programe intregi.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-138403642337198938?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/138403642337198938/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=138403642337198938' title='0 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/138403642337198938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/138403642337198938'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/cum-se-scrie-un-compilator-3.html' title='Cum se scrie un compilator (3)'/><author><name>GrayShade</name><uri>http://www.blogger.com/profile/08614811410089147863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-2125975511016046108</id><published>2007-04-03T20:55:00.000+03:00</published><updated>2007-04-06T01:22:10.687+03:00</updated><title type='text'>Compiler Design and Implementation</title><content type='html'>&lt;div style="text-align: justify;"&gt;On this blog we will post a series of articles on the theme of compilers. It was intended to be written in Romanian, but due to a number of visits from other countries we think it's better to ask whether anyone else is interested in this subject. If so, please post a comment on this page.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-2125975511016046108?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/2125975511016046108/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=2125975511016046108' title='1 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2125975511016046108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/2125975511016046108'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/compiler-design-and-implementation.html' title='Compiler Design and Implementation'/><author><name>GrayShade</name><uri>http://www.blogger.com/profile/08614811410089147863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-6700679229648674904</id><published>2007-04-02T21:55:00.000+03:00</published><updated>2007-04-15T23:12:01.594+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><title type='text'>Cum se scrie un compilator (2)</title><content type='html'>&lt;div style="text-align: justify;"&gt;In articolul trecut am promis ca voi scrie despre analiza lexicala. Ce reprezinta ea? Fiecare limbaj (nu neaparat de programare) are un set de simboluri care pot fi folosite, un alfabet. Trebuie tinut cont, totusi, de faptul ca o insiruire de astfel de "semne"/simboluri nu are (inca/neaparat) un sens asociat ei. Dar cunoasterea acestora este necesara pentru intelegerea limbajului in cauza.&lt;br /&gt;&lt;br /&gt;In cazul nostru, vom sari peste cateva etape si vom considera ca alfabetul limbajului Rascal este format din unitati carora le poate fi asociat, direct sau nu, un inteles: de exemplu, nu vom considera o litera ca element acestuia, ci un cuvant. Cum arata ele in cazul limbajului Rascal?&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;O serie de cuvinte-cheie: "entry", "func", "as", "return", "ref" (parametru transmis prin referinta), etc.&lt;/li&gt;&lt;li&gt;Operatori: ":=" (atribuire), "+", "-", "*", "/", "mod", "or", "&lt;=", "&lt;&gt;" (diferit) si in continuare.&lt;/li&gt;&lt;li&gt;Delimitatori: ";" (sfarsitul unei instructiuni, este optionala), "," (delimitator folosit in lista de variabile), "(" si ")" (pentru expresii, respectiv apeluri de functie).&lt;/li&gt;&lt;li&gt;Tipuri de date: "bool", tipuri intregi de forma "int8", "uint16", ... (prefixul "u" insemnand "unsigned"), poate chiar tip caracter sau string.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Constante: "42", "0", "true", "false", eventual caracter, string sau numar real.&lt;/li&gt;&lt;li&gt;Identificatori: acestia pot fi nume de functii sau variabile; am ales o structura clasica, acestia fiind siruri de caractere ce pot incepe cu litera sau underscore ("_"), continuandu-se apoi cu caractere ce nu sunt folosite ca operatori sau delimitatori. Nu am acordat mare atentie acestui fapt, asa ca, in versiunea actuala, Rascal accepta identificatori continand caractere precum diez, semn de exclamare sau dolar.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Abordarea noastra este, cred, mai clara decat cea clasica (in care fiecare caracter este prelucrat separat, cuvintele cheie si operatorii mai lungi de un caracter fiind formate intr-o faza ulterioara).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://monoport.com/2275"&gt;Iata cum a fost implementat &lt;span style="font-style: italic;"&gt;tokenizer&lt;/span&gt;-ul din Rascal&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;[Imi cer scuze pentru faptul ca am recurs la un site extern si am pus o bucata atat de mare si neatragatoare de cod, dar nu stiu cum a facut Alex codul lui sa arate atat de bine. Poate ca le voi schimba un pic mai tarziu.]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Se pot observa cateva particularitati ale codului pe care il folosim:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Este scris in limbajul C#: am luat aceasta decizie deoarece C# este un limbaj puternic si care se preteaza scrierii rapide de cod. Nu vom folosi prea multe particularitati ale acestuia, exemplul cel mai important ar fi tipul de date string (disponibil in C++ ca std::string, CString, etc.), acesta fiind urmat de colectiile generice de date (un analog ar fi std::vector din STL). Atributul "DebuggerStepThrough" poate fi ignorat, el ajutandu-ne doar la depanarea programului (cred ca numele ii indica destul de clar semnificatia).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Avem cateva functii ajutatoare care compara un string sau caracter cu cateva constante (cuvinte cheie, delimitatori, etc.). O parte din codul acesta ar putea fi "infrumusetat", o recunoastem.&lt;/li&gt;&lt;li&gt;Functia principala este ReadToken(). Aceasta citeste cate un token (unitate careia i se poate atribui un sens) din fisier, face niste verificari pentru a ignora comentariile (momentan doar comentarii ce incep prin "//" si se termina la sfarsitul liniei) si pentru a returna "&lt;=" sau ceva asemanator (si nu "&lt;") atunci cand este cazul.&lt;/li&gt;&lt;li&gt;Rezultatul este memorat in variabila token; sfarsitul fisierului va fi anuntat printr-un sir vid.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Cam la atat se rezuma partea de analiza lexicala. Pentru a testa acest cod, putem scrie o bucla simpla care citeste cate un token si il afiseaza, pana la terminarea fisierului. Avand la intrare un fisier cu continutul:&lt;br /&gt;&lt;pre&gt;func foo(): none&lt;br /&gt;&lt;br /&gt;entry func main(number as int32, count as int32): none&lt;br /&gt;x as int8&lt;br /&gt;a as int8 := 1 shl 2 shl 7 shl 3 shr 2&lt;br /&gt;a := 1*x/2/a/x&lt;br /&gt;foo()&lt;br /&gt;y as bool&lt;/pre&gt;&lt;br /&gt;, programul va afisa:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Token: func&lt;br /&gt;Token: foo&lt;br /&gt;Token: (&lt;br /&gt;Token: )&lt;br /&gt;Token: :&lt;br /&gt;Token: none&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token: entry&lt;br /&gt;Token: func&lt;br /&gt;Token: main&lt;br /&gt;Token: (&lt;br /&gt;Token: number&lt;br /&gt;Token: as&lt;br /&gt;Token: int32&lt;br /&gt;Token: ,&lt;br /&gt;Token: count&lt;br /&gt;Token: as&lt;br /&gt;Token: int32&lt;br /&gt;Token: )&lt;br /&gt;Token: :&lt;br /&gt;Token: none&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;Token: x&lt;br /&gt;Token: as&lt;br /&gt;Token: int8&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;Token: a&lt;br /&gt;Token: as&lt;br /&gt;Token: int8&lt;br /&gt;Token: :=&lt;br /&gt;Token: 1&lt;br /&gt;Token: shl&lt;br /&gt;Token: 2&lt;br /&gt;Token: shl&lt;br /&gt;Token: 7&lt;br /&gt;Token: shl&lt;br /&gt;Token: 3&lt;br /&gt;Token: shr&lt;br /&gt;Token: 2&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;Token: a&lt;br /&gt;Token: :=&lt;br /&gt;Token: 1&lt;br /&gt;Token: *&lt;br /&gt;Token: x&lt;br /&gt;Token: /&lt;br /&gt;Token: 2&lt;br /&gt;Token: /&lt;br /&gt;Token: a&lt;br /&gt;Token: /&lt;br /&gt;Token: x&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;Token: foo&lt;br /&gt;Token: (&lt;br /&gt;Token: )&lt;br /&gt;Token:&lt;br /&gt;&lt;br /&gt;Token:&lt;br /&gt;Token: y&lt;br /&gt;Token: as&lt;br /&gt;Token: bool&lt;br /&gt;Token:&lt;/pre&gt;. Iata cat de usor a fost sa impartim un fisier in token-uri. Continuarea, adica felul in care avem de gand sa le folosim, intr-un articol viitor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS: Daca aveti sugestii sau remarcati un greseli in codul aratat, sunteti rugati sa ne anuntati.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-6700679229648674904?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/6700679229648674904/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=6700679229648674904' title='1 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6700679229648674904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/6700679229648674904'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/cum-se-scrie-in-compilator-2.html' title='Cum se scrie un compilator (2)'/><author><name>GrayShade</name><uri>http://www.blogger.com/profile/08614811410089147863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-694105179530138354</id><published>2007-04-02T21:10:00.000+03:00</published><updated>2007-04-15T23:13:06.370+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilatoare'/><title type='text'>Cum se scrie un compilator (1)</title><content type='html'>&lt;div style="text-align: justify;"&gt;In ultimul timp, programatorii au ajuns sa ia compilatoarele pe care le folosesc "for granted". Nu vom spune daca asta e un lucru bun sau nu, dar trebuie sa amintim vremurile in care programele erau scrise in limbaj de asamblare sau chiar in cod masina.&lt;br /&gt;&lt;br /&gt;Gata, le-am amintit.&lt;br /&gt;&lt;br /&gt;Lasand gluma la o parte, este firesc sa ne intrebam &lt;span style="font-style: italic;"&gt;cum functioneaza un compilator&lt;/span&gt;. Raspunsul? Dupa cum vom vedea, raspunsul este (si trebuie sa fie) "&lt;span style="font-style: italic;"&gt;simplu&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Luati o carte despre compilatoare sau un curs de limbaje formale si veti putea citi despre simnboluri terminale si neterminale, productii, ierarhia Chomsky, gramatici mai mult sau mai putin senzitive la context, automate, parser-e LL, LR sau LALR. Si poate ca dupa ce ati rasfoit respectivele materiale veti pune o singura intrebare: "Si totusi, cum functioneaza un compilator?".&lt;br /&gt;&lt;br /&gt;Seria de articole pe care o incep azi se doreste a fi o incercare de raspuns la aceasta intrebare. Va fi, oare, o reusita? Nu stiu. Dar sper ca va putea fi un punct de plecare pentru cei interesati.&lt;br /&gt;&lt;br /&gt;Sa incepem, asadar, discutia despre compilatoare. Lasand la o parte impartiri mai fine, un compilator are doua parti esentiale:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Parser-ul, care analizeaza codul sursa, il verifica de erori si pastreaza sau deduce unele informatii semantice.&lt;/li&gt;&lt;li&gt;Generatorul de cod, care foloseste informatiile obtinute de parser pentru a genera cod mai mult sau mai putin executabil (cod nativ, cod pentru o masina virtuala). Fireste, in cazul interpretoarelor, aceasta parte se ocupa de executarea instructiunilor.&lt;/li&gt;&lt;/ol&gt;In aceste articole vom analiza o modalitate de implementare a celor doua parti prin prisma experientei obtinute din implementarea unui compilator pentru limbajul Rascal. A se nota ca, in momentul de fata, compilatorul nostru este departe de a fi definitivat. Nu garantam, deci, nimic in privinta corectitudinii sau a functionalitatii codului pe care il vom prezenta, si nici in privinta unei eventuale finalitati.&lt;br /&gt;&lt;br /&gt;In articolul urmator voi vorbi despre analiza lexicala, partea de baza a unui parser.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-694105179530138354?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/694105179530138354/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=694105179530138354' title='4 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/694105179530138354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/694105179530138354'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/04/cum-se-scrie-in-compilator-1.html' title='Cum se scrie un compilator (1)'/><author><name>GrayShade</name><uri>http://www.blogger.com/profile/08614811410089147863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-4539593735770307471</id><published>2007-03-31T00:47:00.000+03:00</published><updated>2007-04-15T23:14:33.818+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Extra, extra, read all about it!</title><content type='html'>Iata o mostra de cod compilabil:&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// Variabila globala.&lt;/span&gt;&lt;br /&gt;foo &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as int&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// Functia principala.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;entry func&lt;/span&gt; main(number &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as int&lt;/span&gt;, count&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; as int&lt;/span&gt;): &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;none&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    k &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as word&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;            l&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; as quad&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;        m &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as word&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;    j &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as bool&lt;/span&gt; := 1 &amp;lt; 2 or 3 &amp;lt; 4;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;func &lt;/span&gt;foo(number&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; as unsigned quad&lt;/span&gt;): &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;none&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    q &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as unsigned quad&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Da, nu e tocmai ce am aratat in primul post, dar nici atat de mult nu mai e. Ce stie compilatorul in momentul asta? Intr-o ordine aleatorie:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Functii.&lt;/li&gt;&lt;li&gt;Parametri de functii.&lt;/li&gt;&lt;li&gt;Variabile.&lt;/li&gt;&lt;li&gt;Tipuri de date.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Blocuri delimitate de taburi ('\t'). Mai exact, un bloc este definit prin nivelul lui de indentare. Iesirea din bloc se face la intalnirea unui nivel de indentare mai mic. In bucata anterioara de cod blocurile sunt dupa cum urmeaza: blocul 1 (care este chiar blocul  principal al functiei) ce contine variabilele &lt;span style="font-weight: bold;"&gt;k&lt;/span&gt; si &lt;span style="font-weight: bold;"&gt;j&lt;/span&gt;, cat si parametrii &lt;span style="font-weight: bold;"&gt;number &lt;/span&gt;si &lt;span style="font-weight: bold;"&gt;count&lt;/span&gt;; blocul 2 ce contine variabila &lt;span style="font-weight: bold;"&gt;l&lt;/span&gt;; blocul 3 ce contine variabila &lt;span style="font-weight: bold;"&gt;m&lt;/span&gt;;&lt;br /&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Scopuri de variabile. Parametrii unei functii nu pot fi "umbriti" in interiorul ei indiferent de blocul in care se face declaratia. Daca in exemplul de cod anterior am declara number in orice bloc am primi eroarea: &lt;span style="font-weight: bold;"&gt;InvalidIdentifier: Identifier "number" redeclared on line &lt;n&gt;[...].&lt;/n&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Comentarii pana la sfarsitul liniei.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Expresii -- inca in lucru.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;Ce o sa modificam in curand:&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Tipurile de date. Deocamdata Rascal are urmatoarele tipuri de date: &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;private readonly string&lt;/span&gt;[] typeList = { &lt;span style="color: rgb(153, 0, 0);"&gt;"bool"&lt;/span&gt;, &lt;span style="color: rgb(153, 0, 0);"&gt;"byte"&lt;/span&gt;, &lt;span style="color: rgb(153, 0, 0);"&gt;"word"&lt;/span&gt;, &lt;span style="color: rgb(153, 0, 0);"&gt;"int"&lt;/span&gt;, &lt;span style="color: rgb(153, 0, 0);"&gt;"quad"&lt;/span&gt; }; Tipurile intregi sunt dupa marime: byte = 1, word = 2, int = 4, quad = 8 octeti. Toate sunt cu semn. Modificatorul &lt;span style="font-weight: bold;"&gt;unsigned&lt;/span&gt; permite folosirea bitului de semn pentru reprezentarea valorii. Dar din alte limbaje utilizatorul este obisnuit cu byte si word ca fiind unsigned in mod implicit. Tipul quad nu este foarte cunoscut. S-ar putea ca pe viitor sa avem nume conventionale cu semnificatii deja cunoscute e.g: byte si word sa fie unsigned, sa intorducem &lt;span style="font-weight: bold;"&gt;long &lt;/span&gt;ca modificator si sa scoatem quad, etc.&lt;/li&gt;&lt;/ul&gt;La ce lucram acum:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Expresii. Tot ce tine de partea de expresii, atribuiri, verificari de tipuri, etc.&lt;/li&gt;&lt;/ul&gt;Si acum un mic bonus: primul screenshot cu Rascal.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.photobucket.com/albums/v667/StreetOfMySoul/a.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://img.photobucket.com/albums/v667/StreetOfMySoul/a.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt; &lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Output cu verbosity de debug (2). Eroarea este cea de redeclarare a lui "number", care este parametru. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-4539593735770307471?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/4539593735770307471/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=4539593735770307471' title='1 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4539593735770307471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/4539593735770307471'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/03/stiri-proaspete-dis-de-dimineata.html' title='Extra, extra, read all about it!'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-7950625504261171441</id><published>2007-03-30T13:08:00.000+03:00</published><updated>2007-04-15T23:15:03.374+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Operatii pe biti fara anestezie</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.photobucket.com/albums/v667/StreetOfMySoul/Untitled-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 270px; height: 200px;" src="http://img.photobucket.com/albums/v667/StreetOfMySoul/Untitled-1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Cum or sa arate operatorii pe biti in Rascal? Am putea sa ii pastram pe cei logici, dar sintaxa ar fi ambigua (atat pentru compilator cat si pentru programator). Inchipuiti-va ca trebuie sa intretineti un program care arata asa:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;if &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;not not&lt;/span&gt; a &gt; 0 &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;and &lt;/span&gt;b &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;and &lt;/span&gt;c &gt; 1 &lt;span style="color: rgb(51, 102, 255);"&gt;or &lt;/span&gt;d &lt;span style="color: rgb(51, 102, 255);"&gt;or &lt;/span&gt;3 = 4&lt;br /&gt;&lt;span&gt;    writeline(&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;"Conditia e indeplinita"&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;In C# secventa de mai sus s-ar scrie:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;if &lt;/span&gt;(!(~a &gt; 0) &amp;&amp;amp; ((b &amp; c) &gt; 1) || ((d | 3) == 4))&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 204, 204);"&gt;    &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;WriteLine(&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;"Conditia e indeplinita"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Asa ca ideea de a folosi un singur set de operatori si pentru operatiile pe biti si pentru cele logice nu este una grozava. In plus ne-ar ajuta si in implementare (am reusi sa evitam ambiguitatile din gramatica).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;EB ::= TB ["or" | "xor" TB]*&lt;br /&gt;TB ::= FB ["and" FB]*&lt;br /&gt;FB ::= R&lt;br /&gt;R ::= E ["&lt;" | "&lt;=" | "&gt;" | "&gt;=" | "=" | "&lt;&gt;" E]&lt;br /&gt;E ::= T ["or" | "xor" | "+" | "-" T]*&lt;br /&gt;T ::= F ["and" | "shr" | "shl" | "*" | "/" F]*&lt;br /&gt;F ::= "true" | "false" | varb | funcb | num | var | func |&lt;br /&gt;"+" F | "-" F | "not" F | (EB)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Asta e gramatica (&lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Backus-Naur_form"&gt;BNF&lt;/a&gt;) pe care o facuse Laur cand ne gandeam sa pastram acelasi set de operatori. La prima vedere pare in regula, dar daca luam in calcul conditia de ambiguitate enuntata de Niklaus Wirth (creatorul &lt;span style="font-weight: bold;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29"&gt;Pascalului&lt;/a&gt; &lt;/span&gt;si al limbajelor ce l-au succedat: &lt;a href="http://en.wikipedia.org/wiki/Modula-3"&gt;&lt;span style="font-weight: bold;"&gt;Modula&lt;/span&gt;&lt;/a&gt; si &lt;a href="http://en.wikipedia.org/wiki/Oberon-2"&gt;&lt;span style="font-weight: bold;"&gt;Oberon&lt;/span&gt;&lt;/a&gt;) in lucrarea sa &lt;a href="http://www.oberon.ethz.ch/WirthPubl/CBEAll.pdf"&gt;&lt;span style="font-weight: bold;"&gt;Compiler Construction&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;"We call a syntactic class ambiguous if it can be attributed several structures. A language is ambiguous if it contains at least one ambiguous syntactic class (construct)."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;observam ca gramatica este ambigua. De ce? Pentru ca odata intalnit simbolul "not" nu o sa stim in ce clasa sintactica sa trecem: Factor (F) sau Factor boolean (FB).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Si ce e atat de rau la o gramatica ambigua?"&lt;/span&gt; va puteti intreba. Ca raspuns o sa dau tot un citat din lucrarea mai sus mentionata:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;"These (ambiguous sentences) may enrich spoken languages; ambiguous programming languages, however, are simply useless."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Daca nu am folosi aceeasi operatori pentru expresiile booleene si cele aritmetice am putea evita problema de mai sus. Insa ne lovim de o alta problema: ce operatori putem folosi ca sa pastram expresivitatea limbajului? Initial am fost tentat de operatorii din C (&amp;,|,^,!), dar, dupa cum spunea si Laur, nu sunt tocmai in spiritul limbajului Rascal. Ce sintaxa putem alege pentru operatori atunci?&lt;br /&gt;&lt;br /&gt;Din toate variantele la care ne-am gandit cred ca cea mai reusita este prefixarea operatorilor logici cu termenul "bit" e.g: bitand, bitor, etc. Dar nu este cea mai fericita alegere pentru estetica limbajului.&lt;br /&gt;&lt;br /&gt;Mai jos sunt cateva variante la care m-am gandit in dimineata asta si pe care le voi discuta cu Laur putin mai tarziu:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;&lt;br /&gt;if not bitInvert 1 &gt; 2 bitXor 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not ~1 &gt; 2 ^ 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not (~)1 &gt; 2 (^) 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not |1 &gt; 2 \/ 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not bitnot 1 &gt; 2 bitxor 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not [bitwise] not 1 &gt; 2 [bitwise] xor 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not [not 1] &gt; [2 xor 3]&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not {not 1} &gt; {2 xor 3}&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not ~iNV 1 &gt; 2 ~XOR 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not &amp;lt;inv&amp;gt; 1 &gt; 2 &amp;lt;xor&amp;gt; 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not /inv/ 1 &gt; 2 /xor/ 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not .inv. 1 &gt; 2 .xor. 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not |inv 1| &gt; |2 xor 3|&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not $inv 1 &gt; 2 $xor 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not inv: 1 &gt; 2 xor: 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not .inv 1 &gt; 2 .xor 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not `inv` 1 &gt; 2 `xor` 3&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;if not _inv_ 1 &gt; 2 _xor_ 3&lt;br /&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Nu cred ca va fi prea incantat de majoritatea (sincer, nici eu nu sunt). Voi ce parere aveti?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-7950625504261171441?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/7950625504261171441/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=7950625504261171441' title='3 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/7950625504261171441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/7950625504261171441'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/03/operatii-pe-biti-fara-anestezie.html' title='Operatii pe biti fara anestezie'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38768718.post-550134291577709386</id><published>2007-03-26T15:14:00.000+03:00</published><updated>2007-04-03T08:47:15.557+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rascal'/><title type='text'>Rascal</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.photobucket.com/albums/v667/StreetOfMySoul/rascal-logo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 479px; height: 199px;" src="http://img.photobucket.com/albums/v667/StreetOfMySoul/rascal-logo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ce este Rascal? Deocamdata este doar o colectie de fisiere C#. Poate ca o intrebare mai buna ar fi: ce o sa fie Rascal? O sa fie un limbaj de programare usor de folosit, dezvoltat pentru .NET.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;De ce Rascal? Initial, proiectul avea ca scop implementarea unui compilator de Pascal pentru platforma .NET. Insa exista proiecte similare si nu e prea distractiv sa reinventezi roata. Asa ca am luat decizia sa dezvoltam un limbaj nou, care sa incorporeze conceptele care ni s-au parut interesante in limbajele de programare pe care le-am intalnit poana acum. Si, totusi, de ce Rascal? Pentru ca R este dupa P in alfabet, iar Qascal nu e tocmai un nume reusit.&lt;br /&gt;&lt;br /&gt;Daca vom integra toate conceptele care ne plac (si pe care stim sa le implementam) in limbaj, nu va iesi un soi de sorcova imposibil de folosit? Speram sa nu se intample asta. Intrebarea pe care ne-am pus-o initial a fost: "Noi am programa in limbajul asta?". O sa incercam ca indiferent de modificarile pe care le aducem raspunsul sa ramana "Da".&lt;br /&gt;&lt;br /&gt;Dar cum arata limbajul? Ce sintaxa are? Inca lucram la ea, adaugam fetureuri si le modificam pe cele existente pe masura ce proiectul se maturizeaza. Exemplul urmator este cel de la care am plecat cand am inceput sa lucram la compilator:&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// Citeste count numere de la tastatura si intoarce o lista&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// formata din ele.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;func &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ReadNumbers &lt;/span&gt;(count &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as byte&lt;/span&gt;): &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;int list&lt;/span&gt;&lt;br /&gt;   numbers &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as int list&lt;/span&gt;;&lt;br /&gt;   number &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as int&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;  for&lt;/span&gt; i := 1 &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;to&lt;/span&gt; count&lt;br /&gt;       write (&lt;span style="color: rgb(204, 0, 0);"&gt;"n = "&lt;/span&gt;);&lt;br /&gt;       readline (number);&lt;br /&gt;&lt;br /&gt;       numbers := list(numbers, number);&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;return &lt;/span&gt;numbers;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// Main function&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// empty(), head() si tail() sunt predicate predefinite&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;// care lucreaza pe liste.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;entry func&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;main &lt;/span&gt;(args &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as string list&lt;/span&gt;): &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;none&lt;/span&gt;&lt;br /&gt;   countNumbers &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as byte&lt;/span&gt;;&lt;br /&gt;   myNumbers &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;as int list&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   write (&lt;span style="color: rgb(204, 0, 0);"&gt;"How many numbers? "&lt;/span&gt;);&lt;br /&gt;   readline (countNumbers);&lt;br /&gt;&lt;br /&gt;   myNumbers := ReadNumbers (count: countNumbers);&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;while not&lt;/span&gt; empty (myNumbers)&lt;br /&gt;       &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;if&lt;/span&gt; hd := head (myNumbers) &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;mod &lt;/span&gt;2 = 0&lt;br /&gt;           writeline (hd);&lt;br /&gt;           myNumbers := tail (myNumbers);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Cateva trasaturi speciale sunt marcarea functiei de intrare in program folosind cuvantul cheie entry, tipul none, care este similar tipului void din C, parametri cu nume si demarcarea blocurilor pe baza indentarii.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In urmatoarele posturi o sa discutam despre decizii de design si despre implementare pe masura ce o sa dezvoltam compilatorul si limbajul. O sa fie un blog viu, o imagine dinamica a proiectului in care speram sa aratam cum ia forma un limbaj de programare.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38768718-550134291577709386?l=codelake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codelake.blogspot.com/feeds/550134291577709386/comments/default' title='Postare comentarii'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38768718&amp;postID=550134291577709386' title='2 comentarii'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/550134291577709386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38768718/posts/default/550134291577709386'/><link rel='alternate' type='text/html' href='http://codelake.blogspot.com/2007/03/rascal.html' title='Rascal'/><author><name>Alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
