Skip to content
chicu123 edited this page Sep 13, 2010 · 4 revisions

Momentan proiectul ofera urmatoarele facilitati

  • 2 tipuri primare: int si numeric – numeric e double din c++
  • toate celelalte tipuri sunt de tip CollectorRef adica sunt intretinute de garbage collector. Printre aceste tipuri se numara string, vector. sau obiect definit de program;
  • se pot defini structuri de date, cu posibilitatea de inheritance
  • se pot defini functii globale, care pot avea variabile locale, dar au access si la cele globale
  • garbage collectorul este de tip Mark & Sweep cu marking fix pe obiecte si conservativ pe stackul de lucru. Alocarea obiectelor se face in blocuri de dimensiune fixa.
  • transformarea automata de la un tip de date la altul gen int la string, string la int (atunci cand este posibil).
  • tipul “code”. Se poate converti automat tipul string la tipul code (sau invers, code la string). Toate metodele vor exista ca “pseudo” variabile globale (inclusiv programul principal cu numele $main).
  • posibilitata de a adauga cod la o alta functie (exemplu mai jos cu $main += “cod nou generat”;). Acesta poate folosi variabilele definite in functia la care e adaugat codul
  • instructiuni de read si write ( + debug pentru tipul “code” care tipareste bytecode-ul generat)

In curs de dezvoltare

  • adaugarea proiectului pt windows + rezolvarea problemelor gen alocatorul de blocuri aliniate pt garbage collector (e specific pe fiecare platforma) + schimbarea blocului de goto-uri dinamice cu un switch (sunt suportate doar de gnu, nu si de Visual Studio compiler).
  • suport pt exceptii (momentan exceptiile se tiparesc pe ecran si apeleaza exit())
  • comanda halt pt oprirea programului
  • instructiunea goto + definirea de labeluri
  • metode in obiecte
  • generarea de cod masina folosind LLVM (momentan e bazat pe interpretor)

Proiectul foloseste flex si bison pentru generarea parserului.

Pentru executie se foloseste un vector de “registri” prealocat. Un registru poate fi “int”, “double” sau “referinta”. Apelarea metodelor se face prin adaugarea argumentelor in ordine in registri. Metoda apelata va folosi aceasta lista ca punct de plecare pentru executie (ca si cum argumentele ar fi variabile locale). In cazul in care metoda returneaza o valoarea aceasta va fi adaugata ca primul registru.

Exemple de programe

Rulare
Downloadati arhiva http://cloud.github.com/downloads/chicu123/mycompiler/samples.zip. Dezarhivati si rulati mycompiler.exe numesample.txt

Clone this wiki locally