Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

5.3.3 Koodin generointi Koodin generointi tarkoittaa objektikoodin eli konekielisen ohjelman tuottamista. Generointi jakautuu kolmeen osatehtävään: 1.Muistin.

Samankaltaiset esitykset


Esitys aiheesta: "5.3.3 Koodin generointi Koodin generointi tarkoittaa objektikoodin eli konekielisen ohjelman tuottamista. Generointi jakautuu kolmeen osatehtävään: 1.Muistin."— Esityksen transkriptio:

1 5.3.3 Koodin generointi Koodin generointi tarkoittaa objektikoodin eli konekielisen ohjelman tuottamista. Generointi jakautuu kolmeen osatehtävään: 1.Muistin varaaminen (memory allocation) ohjelman käyttämille tiedoille. 2.Lähdekielistä ohjelmaa vastaavien konekielisten käskyjen muodostaminen. 3.Koodin optimointi.

2 5.3.3 Koodin generointi 1.Muistin varaaminen: symbolitaulun perusteella lasketaan, montako muistipaikkaa ohjelman data-alue (= muuttujat, muut tunnukset ja tietorakenteet) tarvitsee symbolitaulussa ilmoitetaan tunnuksen (ja vastaavien) nimen lisäksi sen tietotyyppi ja muistiosoite

3 5.3.3 Koodin generointi Esimerkki. MODULE Pythagoras (INTEGER x INTEGER y INTEGER z) RETURNS BOOLEAN RETURN x 2 + y 2 = z 2 ENDMODULE SYMBOLITAULU (oletus: INTEGER varaa 32 bittiä eli 4 tavua, BOOLEAN 1 tavun) TunnusTyyppiOsoite PythagorasBOOLEAN9 xINTEGER10 yINTEGER14 zINTEGER18

4 2.Konekielisten käskyjen muodostaminen: ohjelma jäsennetty => sen rakenne on jäsennyspuussa käydään jäsennyspuun alkiot esijärjestyksessä läpi ja tuotetaan konekieltä, joiden käskyt toteuttavat syntaksiluokkien toiminnan yleensä generoidaan symbolista konekieltä muistipaikkoihin viitataan muuttujanimillä, ei todellisilla muistiosoitteilla muuttujanimet korvataan muistiosoitteilla, kun ohjelma käännetään objektikoodiksi MODULE Generoi(jäsennyspuu P) Olkoon P = N(P 1,..., P k ) CASE N OF : generoimoduuli(P 1,..., P k ) : generoiasetuslause(P 1,..., P k ) : generoijoslause(P 1,..., P k ) : generoijosmuutoin(P 1,..., P k ) : generoiwhilelause(P 1,..., P k )... ENDCASE ENDMODULE

5 Esimerkki. Asetuslause x:=y o z, missä o on jokin operaattori (esim. yhteenlaskuoperaattori +). → := → → + | - | * / → | → a | b | c |... Jäsennetään lause → jäsennyspuu ( (x),:=, ( (y), (o), (z))) Esitystä voidaan sieventää: (x,y,o,z)

6 5.3.3 Koodin generointi Esimerkiksi asetuslause x:=y o z puurakenteena: ( (x),:=, ( (y), (o), (z))) x y o z

7 5.3.3 Koodin generointi Esimerkiksi asetuslause x:=y o z sievennettynä puurakenteena (koodingenerointia varten): (x y o z) x z y o

8 Käännösmoduuli: MODULE Generoiasetuslause(x, y, o, z) TulostaLOAD y CASE o OF '+' : Tulosta ADD z '-' : Tulosta SUBTRACT z '*' : Tulosta MULTIPLY z '/' : Tulosta DIVIDE z ENDCASE Tulosta STORE x ENDMODULE Muuttujat x, y ja z korvataan symbolitaulusta saatavilla osoitteilla ennen suoritusta

9 5.3.3 Koodin generointi Esimerkki ehtolauseesta: → > | < | = | ≠ → IF-THEN-ELSE -rakenteen jäsennyspuu: (IF, (...), THEN, (...), ELSE, (...))

10 Käännösmoduuli IF-lauseelle: MODULE Generoijosmuutoin(ehto-osa E, niin-osa P,muutoin-osa Q) Olkoon E = ( (x), (o), (y)) määrää nimiöt(tunnukset) a ja b (*jos ehto x o y on epätosi, ehto-koodista hypätään nimiöön a, muuten jatketaan seuraavasta:*) generoiehto(x,o,y,a) generoi(P) (*generoi niin-osa*) tulostaJUMP b (* ohita muutoin-osa*) tulostaa: NOP (* tyhjä käsky-jatketaan seuraavasta*) generoi(Q) (*generoi muutoin-osa*) tulostab: NOP (* tyhjä käsky-jatketaan seuraavasta*) ENDMODULE muuttujat x, y ja z korvataan symbolitaulusta saatavilla osoitteilla

11 MODULE generoiehto(x, o, y, a) (* hypätään aina nimiöön a (muutoin-osaan), jos ehto ei toteudu *) CASE o OF '>',’>=’:tulostaLOADx SUBTRACT y (*jos y>x:*)JUMPNEG a IF o = ’>' THEN tulosta(*jos y=x:*)JUMPZERO a ENDIF ’ y:*)JUMPNEG a IF o =’<’ THENtulosta(*jos x=y:*)JUMPZERO a ENDIF '=':tulostaLOADx SUBTRACTy (*jos y>x:*)JUMPNEG a LOAD y SUBTRACT x (*jos x>y:*) JUMPNEG a ‘<>’: tulosta LOADx SUBTRACTy (*jos y=x:*)JUMPZERO a ENDCASE ENDMODULE

12 3. Koodin optimointi mekaanisesti generoitua koodia voidaan yleensä parantaa poistetaan ne konekielen pätkät, jotka eivät vaikuta senhetkiseen ohjelman tilaan esim. IF x>y THEN x:= x-y ELSE x:=0 ENDIF LOAD x SUBTRACT y (y>x)JUMPNEG a (y=x)JUMPZERO a (niin)LOAD x SUBTRACTy (x:=x-y)STOREx (ulos)JUMPb a: NOP (muutoin)LOADI0 STOREx b:NOP turhia!

13 5.3.4 Symbolinen konekieli jos ohjelmoi konekielellä on helpompaa käyttää nimiöitä hyppyosoitteina kuin muistipaikkojen numero-osoitteita esim. LOAD b2, ei LOAD 15 helpompaa käyttää käskysanoja kuin käskykoodeja LOAD b2: 0001 0000 0000 1111 (0001=LOAD:in käskykoodi, loput-operandi) nimiöt (tunnukset) kerätään symbolitauluun assembleri (eng. to assemble = koota, kerätä): helpottaa konekielellä ohjelmointia kääntää symbolisen konekielen oikeaksi konekieleksi sijoittaa nimiöiden tilalle oikeat numeeriset osoitteet korvaa käskysanat käskykoodeilla käännösprosessi on suoraviivainen: jokainen symb.konekielen rivi vastaa oikean konekielen riviä tuotetussa objektikoodissa osoitteet suhteellisia kuvitellaan, että ohjelma datoineen alkaa osoitteesta 0 kaikki osoitteet lasketaan siitä osoitteesta lataaja: korvaa suhteelliset osoitteet todellisilla osoitteilla: esim. ohejlmalle varataan muistialue 2000-2050 suht. osoitteet muutetaan todellisiksi lisäämäällä niihin arvo 2000 => muistinhallinta lataaja on käyttöjärjestelmän osa


Lataa ppt "5.3.3 Koodin generointi Koodin generointi tarkoittaa objektikoodin eli konekielisen ohjelman tuottamista. Generointi jakautuu kolmeen osatehtävään: 1.Muistin."

Samankaltaiset esitykset


Iklan oleh Google