5 3 3 Koodin generointi tarkoittaa objektikoodin eli
5. 3. 3 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.
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
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) Tunnus Tyyppi Osoite Pythagoras BOOLEAN 9 x INTEGER 10 y INTEGER 14 z INTEGER 18
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, . . . , Pk) CASE N OF <moduuli>: generoimoduuli(P 1, . . . , Pk) <asetuslause>: generoiasetuslause(P 1, . . . , Pk) <joslause>: generoijoslause(P 1, . . . , Pk) <josmuutoin>: generoijosmuutoin(P 1, . . . , Pk) <whilelause>: generoiwhilelause(P 1, . . . , Pk). . . ENDCASE ENDMODULE
Esimerkki. Asetuslause x: =y o z, missä o on jokin operaattori (esim. yhteenlaskuoperaattori +). <asetuslause> <lauseke> <operaattori> <tunnus> <kirjain> → → → <tunnus>: =<lauseke> <tunnus> <operaattori> <tunnus> + | - | * / <kirjain> | <kirjain> <tunnus> a | b | c |. . . Jäsennetään lause → jäsennyspuu <asetuslause> (<tunnus>(x), : =, <lauseke> (<tunnus>(y), <operaattori>(o), <tunnus>(z))) Esitystä voidaan sieventää: <asetuslause>(x, y, o, z)
5. 3. 3 Koodin generointi Esimerkiksi asetuslause x: =y o z puurakenteena: <asetuslause> (<tunnus>(x), : =, <lauseke> (<tunnus>(y), <operaattori>(o), <tunnus>(z))) <asetuslause> <tunnus> x <: => <lauseke> <tunnus> y <operaattori> o <tunnus> z
5. 3. 3 Koodin generointi Esimerkiksi asetuslause x: =y o z sievennettynä puurakenteena (koodingenerointia varten): <asetuslause>(x y o z) <asetuslause> x y o z
Käännösmoduuli: MODULE Generoiasetuslause(x, y, o, z) Tulosta LOAD 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
5. 3. 3 Koodin generointi Esimerkki ehtolauseesta: <oper> → <ehto> → > | < | = | ≠ <tunnus> <oper> <tunnus> IF-THEN-ELSE -rakenteen jäsennyspuu: <josmuutoin>(IF, <ehto>(. . . ), ELSE, <lause>(. . . )) THEN, <lause>(. . . ),
Käännösmoduuli IF-lauseelle: MODULE Generoijosmuutoin(ehto-osa E, niin-osa P, muutoin-osa Q) Olkoon E = <ehto>(<tunnus>(x), <oper>(o), <tunnus>(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*) tulosta JUMP b (* ohita muutoin-osa*) tulosta a: NOP (* tyhjä käsky-jatketaan seuraavasta*) generoi(Q) (*generoi muutoin-osa*) tulosta b: NOP (* tyhjä käsky-jatketaan seuraavasta*) ENDMODULE muuttujat x, y ja z korvataan symbolitaulusta saatavilla osoitteilla
MODULE generoiehto(x, o, y, a) (* hypätään aina nimiöön a (muutoin-osaan), jos ehto ei toteudu *) CASE o OF '>', ’>=’: tulosta LOAD x SUBTRACT y (*jos y>x: *) JUMPNEG a IF o = ’>' THEN tulosta(*jos y=x: *) JUMPZERO a ENDIF ’<', ’<=': tulosta IF o =’<’ THEN LOAD SUBTRACT (*jos x>y: *) JUMPNEG tulosta(*jos x=y: *) JUMPZERO y x a a ENDIF '=': tulosta (*jos x>y: *) LOAD SUBTRACT JUMPNEG x y a y x a (*jos y=x: *) LOAD SUBTRACT JUMPZERO x y a (*jos y>x: *) ‘<>’: ENDCASE ENDMODULE tulosta
3. Koodin optimointi mekaanisesti generoitua koodia voidaan yleensä parantaa poistetaan ne konekielen pätkät, jotka eivät vaikuta senhetkiseen ohjelman tilaan LOAD x esim. IF x>y THEN x: = x-y ELSE x: =0 ENDIF SUBTRACT (y>x) JUMPNEG (y=x) JUMPZERO (niin) LOAD SUBTRACT (x: =x-y) STORE (ulos) JUMP a: NOP (muutoin) LOADI STORE b: NOP y a a x y x b 0 x turhia!
5. 3. 4 Symbolinen konekieli jos ohjelmoi konekielellä • on helpompaa käyttää nimiöitä hyppyosoitteina kuin muistipaikkojen numero-osoitteita • esim. LOAD b 2, ei LOAD 15 • helpompaa käyttää käskysanoja kuin käskykoodeja LOAD b 2: 0001 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
- Slides: 13