Friday, February 22, 2013

SCC7. SmallC - symbol table

Napísať kompiler nie je jednoduché, pretože je to komplexná úloha. Je treba porozumieť viacerým častiam, ako napr. parser, generátor kódu, vyhodnocovanie výrazov a dátové štruktúry. Keď to zase na druhej strane všetko do seba zapadne, tak to konečne začne dávať zmysel. Ústredná dátová štruktúra každého kompileru je symbol table.
Symbol table je dátová štruktúra, kde kompiler zhromažďuje informácie o premenných (prípadne metódach, triedach..).
struct symbol_table {
  char name[NAMESIZE]; // symbol name
  int identity; // variable, array, pointer, function
  int type; // char, int
  int storage; // public, auto, extern, static
  int offset; // offset
}
Názov premennej je jasný. Identity hovorí, o čo sa jedná. Či o premennú, pole, pointer alebo funkciu. Type je zase jednoduchý, SmallC má len int a char. Hmm ja už som pridal unsigned int, unsigned char a struct :$
Storage súvisí s tým kde deklarujeme premennú, prípadne aky modifier použijeme. V C platí pravidlo, že premenné definované mimo metód sú globálne a statické. Premenné vnútri metód su lokálne a dočasné. Zanikajú po návrate z metódy. Celé to ešte komplikujú slová extern a static. Posledná položka má viac významov. U polí označuje veľkosť. U lokálnych premenných relatívnu pozíciu na stacku.
Je potrebné mať dve takéto tabuľky. Jednu pre globálne informácie. Tá sa plní a používa počas prekladu celého programu. Druhá je pre lokálne premenné. Vyprázdni sa vždy pred spracovaním funkcie.
A ako to funguje ? Pri deklarácii napr. int a; mimo metódy sa uloží do globálnej table patričná informácia. Potom ak v nejakej metóde nájdeme napr. výraz a=3; tak kompiler si nájde "a". Najskôr hľadá v lokálnej symbol table. Ak tam "a" nenájde hľadá v globálnej symbol table. Tým je garantované zakrývanie globálnych premenných lokálnymi s rovnakým názvom. A v našom prípade napr. nájde "a" v global symbol table. Takže vie, že je to int a má svoje miesto v pamäti na labeli a:
A preto vygeneruje inštrukcie: lxi a, 2 shld a

No comments:

Post a Comment