Pensumoversikt - kodegenerering Kodegenerering del 2: tilleggsnott, INF5110 v2006 Arne Mus, Ifi UiO 8.1 Bruk v mellomkode 8.2 Bsle teknikker for kodegenerering 8.3 Kode for refernser til dtstrukturer (ikke 8.3.2) 8.4 Kode for generereing for kontroll-setninger og logiske uttrykk ( 8.5 Kode-generering for prosedyrer og kll ) ---------(resten ikke pensum ) 8.6 Kode produsert v to kommersielle kompiltorer 8.7 TM: En enkel mskin 8.8 Kode-gen for Tiny på TM 8.9 og 8.10 Optimlisering +Pensum: En del fr utdelt kp 9 fr Aho, Sethi og Ullmnn s kompiltorbok ( Drge-bok ) : 9.2, 9.4, 9.5 og 9.6 Mskinen det oversettes til To-dress-intruksjoner: op source dest mnge forskjellige hv ulike former, se neste foil ADD b SUB b MUL b ngir et register eller en lgercelle (med ett unntk) GOTO l + Betingete hopp + Prosedyrekll ++ Mer er en CISC-mskin enn en RISC-mskin Tilleggskost for dressering Instruksjonsformt og dressemodi del 1 source op-code Mode / R Mode / R M or C M or C 4 byte Adresseringsmodi: 1 Absolutt: M 0 Register: Ri R i : 1 Indeksert : C(RI) dest To måter R i R i source 4 byte 4 byte dest Bre om M eller C C: C:
Instruksjonsformt og dressemodi del 2 9.4 Bsle blokker og Flyt-grfer op-code Mode / R Mode / R M or C M or C 4 byte 4 byte 4 byte Adresseringsmodi: 0 Indirekte Register *R Ri 1 Indirekte *C(Ri) R i C: 1 Literl #M bre for source En Flyt-grf er en grf der nodene er sekvenser v tredresse-setninger Nodene i grfen er klt Bsle Blokker En bsl blokk representer en sekvens v tredresse Progrmkontrollen kommer lltid inn i første setning og går sekvensielt gjennom hver setning uten stopp eller sidesprng. Eneste unntk er t siste setning kn være et hopp muligenens betinget. Kntene i grfen representerer de mulige veier progrmflyten-kontrollen kn t Innen en Bsl Blokk er det lett å holde oversikt over hvor ting er etc,. og lett å gjøre bstrkt interpretsjon. Eksempel på oppdeling i bsle blokker Flyt-grf Bsle blokker: Fr og med en leder frm til neste Algoritme: Første setning er leder en goto i, gjør setning i til en leder setninger etter goto.. er ledere If GOTO L5 L1: L2: L5 L3: IF GOTO L1 If GOTO L5 L1: L2: L5 L3: IF GOTO L1 Det er tydligvis ingen som går til L2. Metodekll tenker vi ikke på. Kn behndles litt forskj. vh. v formål. Nodene i flyt-grfen er de bsle blokkene med en initiell node (den første bsle blokken i progrmmet). Det er en rettet knt fr blokk B 1 til B 2 hvis B 2 kn følge direkte etter B 1 i en eller nnen utførelse. Det vil si t det enten er: En betinget eller ubetinget goto fr siste setning i B 1 til første setning i B 2 eller B 2 følger direkte etter B 1 i progrmmet, og B 1 ender ikke i en ubetinget goto. Vi sier t B 1 er en forgjenger til B 2 og B 2 er en etterfølger til B 1
Flytgrf fr Louden 8.9 oftest: En flytgrf for hver metode for hver metode Løkker i flyt-grfer En goto-setning eller if-goto-setning vil lltid være siste setning setning i sin bsle blokk (men ikke lle bsle blokker slutter slik!) -Metodekll kn plsseres litt forskjellig vh. v grfens bruk -Dnne egne bsle blokker -Kn ligge først i en bsl blokk? Bruk, for eksempel : Kn vi flytte beregninger ut v løkk? while (i<n) { i= i + 2*n; A[i] = n/2; } Kn vi holde ofte brukte vrible i registre mens vi er i løkk? Ant følgende grf v Bsle Blokker: B2 B0 B1 B5 B3 B4 En løkke er et utplukk L v noder slik t: 1) Dersom Bx L og By L, så går det en rettet vei fr Bx til By v lengde 1. 2) L hr en inngng : Det finnes bre én B L slik t Bn B og Bn L. {B3,B4} og {B1,B2,B3,B4,B5} er løkker {B1,B2,B5} er ikke løkke (!?) Grunnen for 2): Prktisk: Ett sted å initilisere løkke & Ett sted om vi skl flytte noe ut v løkk Hv er liveness ( i live )? kp 9.5 Neste bruk og i live innen én bsl blokk Er uvhengig v bsle blokker Defineres i 9.4 og brukes i 9.5 Terminologi: := x + y; if (x<) goto L; Intuitiv def defineres, og her brukes x og. En vribel x er levende / i live på et gitt sted i progrmmet dersom den verdien den der hr hr kn bli brukt i en eller nnen utførelse. Def. som kn vgjøre om x er levende u = v+w; = b + c; x = u + v x = w d = x + y Stedet i Er x i live her? Svret er j, om det finnes en TAsetning j slik t det er minst én eksekveringsvei fr i til j uten noen titordning eller definisjon ti x. Før mn gjør kodegenerering for en bsl blokk er det lurt å skffe seg oversikt over bruk v vrible: En vribelforekomst hr en neste-bruk : Den verdien den hr blir brukt senere i den bsle blokk. D kn det være lurt å l den bli værende i et register En vrible-forekomst hr ingen neste-bruk, men er i live : Verdien i vribelen blir verken brukt eller strøket senere i blokken Men den kn bli/blir brukt i senere blokker Vi må psse på å bevre verdien En vribel-forekomst er død Def: En vribel som ikke er i live på et gitt punkt, sies å være død
Eksempel på informsjon om neste bruk og i live : Angir t den hr neste bruk, og hvor. Disse er i live : Angir t den er i live, uten noen neste bruk t1 = b t2 = t1 * = t1 * t2 t1 = t1 - c = t1 * Altså : I live etter blokk:,b,c Dvs., progrmvriblene. er død her siden den får ny verdi innen denne blokk senere : Er død t1 er død, siden den bre brukes innen denne blokk Kommentrer: 1. Temporære brukes også ofte på tvers v bsle blokker (for eksempel flytting) 2. Globl dtflyt-nlyse finner de vrible som fktisk er i live etter en bsl blokk. Algoritme for å finne informsjon om neste bruk og i live Hr en tbell T over lle vrible i blokk, der hver vribel kn merkes som: 1) i live, og hr gitt en neste bruk i blokk 2) i live, men uten neste bruk i blokk 3) død (og dermed ingen neste bruk ) Initilisering: De vriblene som er i live ved slutten v blokk (oftest: brukervrible) merkes med 2 i T, resten merkes 3 1. Merk x i S slik x er merket i T 2. Forndre x sitt merke i T til 3 3. Merk y og z i S slik de er merket i T 4. Forndre i T merkene for y og z til 1, med neste bruk stt til h.h.v y og z i S. Må skille mellom 1. og 3. for t = + b; skl bli riktig (Trykkfeil som er rettet i det utdelte) Algoritme for neste bruk og i live Gå bkfr og hold greie på sttus til lle vrible: (N.B. Trykkfeil i boks lgoritme rettet i det utdelte) t1 = b t2 = t1 * = t1 * t2 t1 = t1 - c = t1 * Sttus på de forskjelliige stdier: b c t1 b c t1 t2 t2 b c t1 t2 b c t1 t2 b c t1 t2 Døde vrible er tegnet uten ring rundt. I siste linje ntr t vi t bre progr. vrible overlever fr en blokk til en nnen. Kodegenererings-lgoritme Enkel lgoritme: Lger mskinkode for én og én Bsl Blokk Algoritmen holder (innefor hver Bsle Blokk) beregnede verdier i registre så lngt det er mulig (Spesielt viktig om de hr neste bruk ) Når progrmkontrollen går mellom de Bsle Blokkene så ligger smtlige vribel-verdier i sine respektive hukommelses-plsser (ntr t temporærer vrible ikke er i live ) Kodegenerering for hver Bsl Blokk blir d: Det genereres kode for én og én tredresse-setning v gngen, i tur og orden fr første til siste setning Etter siste setning legges verdier fr registre tilbke til sine respektive hukommelses-plsser Noen mngler ved lgoritmen Vrible som kun blir lest innenfor en Bsl Blokk blir ikke lgt i registre, selv om det er mnge refernser til vribelen I enkleste utgve sjekker den ikke på komuttivitet
Register- og dresse-deskriptorer Kodegenertor-lgoritmen bruker deskriptorer for å holde greie på hv som er i registre og i dresser for vrible: En Register-deskriptor for hvert register holder greie på hv som for tiden er i et register. Ved strten skl lle register-deskriptorer ngi t registeret er tomt. Generelt ngir register-deskriptoren t registeret inneholder verdien null eller flere vrible (nvn). En Adresse-deskriptor holder greie på hvor verdien v en vribel finnes i øyeblikket. Det kn være i et register, en loksjon på stkken, en hukommelses-dresse eller i en mengde v slike. Disse opprettes etter hvert som det blir snkk om vriblene. At det ikke er noen dresse-deskriptor for x betyr: -x er progrmvribel: Verdien ligger (bre) i vribel-loksjon - x er temporær vribel: Vribelen er ikke i bruk Informsjonen er redundnt dvs. vi hr begge deskriptor-typene (dresse og register) bre for å få rske oppslg. Kunne greid oss med én v dem. Kodegenerering for: X = Y op Z 1. Finn et register for å holde resulttet: 1. L = getreg(x = Y op Z) 2. Sjekk dresse-deskriptor for Y: Y = beste loksjon der Y finnes Hvis Y L: MOV Y, L 3. Sjekk dresse-deskriptoren for Z: Z = beste loksjon der Z finns OP Z, L 4. Y og/eller Z: - hr ingen ny bruk og - er ikke i live - er i et register AltsÅ. er død Oppdter i så fll deskriptoren for registrene: Registrene inneholder nå ikke Y og/eller Z 5. Oppdterer dresse-deskriptor for X: X.loc = {L}. Hvis L er et register så oppdter også register-deskriptorer for L: L.contin = {X} Getreg (X = Y op Z) Eksempel på kode-generering Opprinnelig verdi v X ødelegges 1. Hvis Y ikke er i live etter X = Y op Z og Y er lene i R i : - Oppdter (R i ) else 2. hvis det finnes et tomt register R i : Return (R i ) else 3. hvis X hr en neste bruk eller X er lik Z eller opertoren ellers krever et register: Velg et (okkupert) register R Hvis verdien ikke ligger i hukommelsen: MOV R, MEM Oppdter dresse-deskriptor for MEM return (R) else 4. Return (X), ltså lever hukommelses-plssen til X (må knskje opprettes om X er en temp-vribel NB: For t X = Y + X skl funke, måtte 3 modifiseres, ellers ville vi fått: MOV Y X Add X X Setninger t = - b u = c v = t + u d = v + u Generert kode MOV, R0 SUB b, R0 MOV, R1 SUB c, R1 ADD R1, R0 ADD R1, R0 MOV R0, d Reg. deskriptorer Alle Reg er tomme R0 inneholder t R0 inneholder t R1 inneholder u R0 inneholder v R1 inneholder u R0 inneholder d Adr. deskriptorer t i R0 t i R0 u i R1 v i R0 u i R1 t i R0 d i R0 og hukommelsen
Eksmen INF5110 våren 2004 Oppgve 1 Vi ser på følgende sekvens v tredresse-setninger: (1) := b - c (2) b := d - (3) t1:= - b (4) t2:= - c (5) t3:= t1 + t2 (6) d := t3 - t2 (7) if d > 0 goto 10 (8) := c - d (9) goto 11 (10) := c + b (11) c := - d (12) if c < goto 8 (13) c := + d (14) goto 3 Spørsmål 1. Del opp sekvensen over i bsle blokker. Angi svret ved bre å liste opp linjenumrene på strtlinjen i hver blokk. Spørsmål 1.b Gi de bsle blokkene nedover i progrmbiten nvnene B1, B2, osv.tegn så en frittstående utgve v flyt-grfen til progrmmet, der nodene bre er merket med sitt nvn (uten noe kode inni). Spørsmål 1.c Angi kort krvene som i vårt pensum settes for t noe skl være en ``løkke'' i en flytgrf? Spørsmål 1.d Angi de løkkene som finnes i flytgrfen fr 1.b Spørsmål 1.e Forklr kort hv det vil si t en vribel er ``i live'' (``live'')på et ngitt sted i progrmmet. Spørsmål 1.f Avgjør følgende, og gi korte forklringer: - Er vriblen i live etter linje (4) i progrmbiten over?