käännösprosessi Kääntäjä Konekielikääntäjä (Assembler) Yhdistelijä (linker) Lataaja (loader)
Kääntäjä Kääntäjän rakenne Perinteinen yksivaiheinen Kääntää suoraan konekoodiksi Käännöksen jälkeen peephole-optimointi Moderni monivaiheinen Front end kääntää lähdekoodin jäsennyspuuksi Jäsennyspuu optimoidaan Back end- kääntää jäsennyspuun konekoodiksi
Yksivaiheinen kääntäjä Ei omaa kokonaisnäkemystä koodista Optimointi paikallista Peephole-optimointi Etsitään muutaman käskyn sekvenssejä, jotka voidaan korvata tehokkaammalla sekvenssillä Koska yksivaiheisella kääntäjällä hyvin paikallinen näkemys lähdekoodista, sopivia sekvenssejä syntyy helposti
Monivaiheinen kääntäjä Front-end tuottaa jäsennyspuun Tätä voidaan optimoida Lausekkeiden laskentajärjestyksen optimointi Vakiolausekkeiden evaluointi Silmukoiden optimointi Toistuvan laskennan siirto Yhteisten alilausekkeiden tunnistus (common subexpression elimination) Vakioiden siirto (constant propagation)
Jäsennyspuun purkaminen Jäsennyspuu puretaan virtuaalikonekieleksi Muuttujien elinaika-analyysi Silmukoiden purku (loop unrolling)
Back-end Rinnakkaistaminen Käskyjen skedulointi (viivästetyt käskyt) Lomituksen valinta (rinnakkaiset suoritusyksiköt) Rekisterien varaus Muuttaa virtuaalikonekielen todelliseksi konekieleksi (symboliseksi) Arkkitehtuuri kohtainen
assembler Mitä assembler tekee Muuttaa symboliset käskyt bittiyhdistelmiksi Yleensä yksi yhteen relaatio Joskus suorittaa yksinkertaisia optimointeja käskyn valinnassa Toteuttaa synteettiset käskyt Toteuttaa pseudokäskyt Sektiojako Tilavaraukset Alignointi Tuloksena objektitiedosto
Objektitiedosto Yksinkertaisimmillaan muistikuva (absolute image) Yleensä ns. Uudelleen sijoitettava objekti Relocatable object file Nykyään käytössä COFF (common object file format) ELF (executable and Linking Format) PE (portable executable) (windows) OMF (Objevct Module Format) (intel)
objektitiedosto Sisältää Koodin Alustetun datan Tiedot muun datan määrästä Symbolitaulun Uudelleensijoitus tiedot
symbolitaulu Sisältää tiedot Julkisista määritellyistä symboleista Funktion alkuosoite Globaalin muuttujan osoite Tuntemattomista symboleista Viittauskohdat ja nimi
Uudelleensijoitus tiedot Absoluuttisista viittauksista kirjataan Mihin kohdistuu, missä tehdään Viittaus ulkoiseen symboliin Viittaus omaan koodiin Viittaus omaan dataan
yhdistelijä Syötteenä objektitiedostoja, tuloksena objektitiedosto (joskus jopa suoritettavissa oleva) absoluuttinen image Uudelleensijoitettava image
yhdistely Poimi tekstisegmentit objekteista.text (runkokoodi),.init (globaalit rakentajat),.fini (globaalit tuhoajat) Yhdistä yhdeksi segmentiksi Uudelleen sijoitus (korjaa osoitteet) Symbolien ratkaisu (korjaa määrittelemättömät) Sama data segmenteille Alustetut ja alustamattomat
lataaja Lataa ohjelmakoodin suoritukseen Absoluuttinen Vain kopiointi muistiin Yhdistelevä (linking loader) Liittää ajoajan kirjastot Läsnäolevat kirjastot (resident libraries) Uudelleen sijoittava (relocating) Lyö lukkoon ohjelman sijainnin muistissa
tekniikoita Perustekniikat Aluksi kaikki koodi ladattiin sovelluksen mukana Hidasta, jos isoja muistiavaruuksia Miten nopeuttaa?
tekniikoita Läsnäolevat kirjastot Resident library vakiokoodi pidetään aina muistissa (kiinteä osoite) Jaettu koodi Samaa sovellusta suoritetaan yhteisestä koodialueesta Kirjoitus suojattu koodi Koodi ja data-alueet erotellaan
tekniikoita Entä jos ohjelma ei mahdu muistiavaruuteen Muistiin kerrostus (memory-resident overlay) Fyysistä muistia enemmän kuin muistiavaruutta Levylle kerrostus (disk-resident overlay) Jos muistiavaruus riittää, mutta fyysinen muisti loppuu --> virtuaalimuisti
lataaja Nykyaikaisissa järjestelmissä Suoritettava koodi kirjoitussuojattua Sivutettua (virtuaalimuisti) Dynaaminen lataus käytössä Shared objects (tai dll)
Sivutuksen vaikutus Koodi (ja data) varataan sivuittain (4 16 kb) Koodi sivutetaan suoritettavasta tiedostosta Data ladataan suoritettavasta tiedostosta, sivutetaan swap-tiedostoon
Dynaaminen lataus Miksi dynaaminen lataus Säästää muistia (levytilaa) Helpottaa ylläpitoa Mahdollistaa kolmannen osapuolen sovelluksissa
Dynaaminen lataus Viittaus tuntemattomaan symboliin ratkaistaan Yhdistelyssä (staattinen lataus) Ladattaessa Latauksen yhteydessä etsitään tarvittavat symbolit Kutsuttaessa (ensimmäisen) viittauksen yhteydessä etsitään tarvittavat symbolit
Dynaaminen lataus Ongelmat Ladattaessa, minne kirjastokoodi sijoitetaan? Koodi on jaettua, jaettu koodi on kirjoitussuojattua Yhdistely vaatii uudelleensijoittelua, joka vaatii viittausten korjailua Miten korjata kirjoitussuojattua koodia?
Dynaaminen lataus Kirjastot paikasta riippumatonta koodia Yhdistely linkkisegmentin kautta Linkkisegmentti sisältää tiedot viittauksista Kullekin koodisegmentille on oma linkkisegmentti