Saturday, February 23, 2013

SCC6. SmallC - pohľad do kódu

Videli sme aký jednoduchý je kód pre príkazy. Ich implementácia v kompileri tiež patrí medzi jednoduchšie časti. Toto je zjednodušený listing. Ukazuje akým spôsobom kompiler vygeneroval postupnosť inštrukcií z predchádzajúceho článku.
flab1 = getlabel ();
test (flab1, FALSE);
statement (NO);
if (!amatch ("else", 4)) {
  generate_label (flab1);
  return;
}
gen_jump (flab2 = getlabel ());
generate_label (flab1);
statement (NO);
generate_label (flab2);
Na prvom riadku sa inkrementne počítadlo labelov. Potom funkcia test vyhodnotí výraz a vygeneruje trojicu inštrukcií mov a,h a ora l a jz flab1. Nasleduje volanie statement, čo je spracovanie nula alebo viacerých príkazov, ktoré sa majú vykonať ak je podmienka splnená. Kompiler hneď generuje zodpovedajúce inštrukcie ak nájde príkazy. Potom sa testuje, či je prítomná else vetva. Ak nie (podmienka je vtedy splnená) tak sa vygeneruje sa flab1 pre funkciu test, ktorá už generovala jump na tento label. Return už len skončí. Ak ale máme aj vetvu if, tak sa generuje jump flab2, ktorý obskakuje vetvu if. Za týmto jumpom sa až vygenruje flab1 pre test zo začiatku metódy. A logicky sa volá statement, aby sa vygeneroval kód pre všetky príkazy v else vetve. Potom už konečne ide label2 pre obskakovací jump. Jednoduché že ?

No comments:

Post a Comment