Aalborg den 01.04.2003

Kompilerkonstruktion: Mellemkode

Mellemkode bruges til at isolere front-enden af en kompiler fra de arkitektur afhængige detaljer i back-enden. Det vil sige, at i stedet for at generere maskinekode direkte fra de abstrakte syntakstræer (som vi tidligere har set på) introducere endnu et mellemformat. En fordel ved mellemkode er, at skal der genereres kode til en anden arkitektur eller skal bygges en kompiler til et andet sprog kan henholdsvis front-enden eller back-enden af en eksisterende kompiler genbruges. Mellemkode genereres ud fra det abstrakte syntakstræ og information gemt i symboltabellen og er en form for abstrakt maskinekode.

Litteratur

Appel kapitel 7 "Intermediate Code".

Læsevejledning

Der er forskellige former for mellemkode f.eks. three-address code og expression tree. Bogen vælger at bruge den sidste nævnte form, hvor knuderne i træet er objekter af de klasser der er listet i figur 7.2 på side 138. Sektion 7.1 forklarer de forskellige klasser der anvendes i et expression tree for MiniJava. I skal lægge mærke til MEM(e) der både kan anvendes (1) til at gemme data med f.eks. med MOVE(Exp dst, Exp src) og (2) til at hente data med f.eks. med BINOP(int binop, Exp left, Exp right). Dette svare til a en variable kan bruges til assignment f.eks. a = 12 og til sammenligning f.eks. if (a < b).

Sektion 7.2 beskriver i detaljer, hvorledes MiniJava kan transformeres til mellemkode. Her er det væsentligt at forstå afsnit "Structured L-Values" på side 145. I skal give høj prioritet til de følgende afsnit

Afsnit 7.3 omhandler hvordan lokale variable funktioner samt objekter og klasser håndteres i mellemkode. 

Opgaver

A) Lave et Java program der anvender den samme variable som både l-value og r-value. Forklar hvad forskelle på disse to begreber er.

B) Tegn mellemkodetræer (lignende de træer der er på side 143 og 146), hvor der anvendes figur 7.2 på side 138 for følgende kodestykker

Venlig hilsen
Kristian Torp

torp (at) cs (dot) auc (dot) dk