Notes
Slide Show
Outline
1
Luento 10
Käännös, linkitys ja lataus
  • Käännös
  • Linkitys
  • Dynaaminen linkitys
  • Lataus


2
Lausekielestä suoritukseen (3)
3
Käännösyksikkö (4)
  • Jollain ohjelmointikielellä kuvattu eheä kokonaisuus, joka halutaan aina kääntää yhdessä
    • kaikki yhteen liittyvät aliohjelmat
    • olioperustainen luokka
  • Liian suuri kokonaisuus?
    • turhaa aikaa kääntämiseen joka muutoksen jälkeen
  • Liian pieni kokonaisuus?
    • turhaa aikaa liitoksien suunnitteluun ja toteutukseen muiden moduulien kanssa
  • Käännösyksikön ohjelmointikieli ei ole tärkeä
    • niiden sitominen yhteen tapahtuu objektimoduulien tasolla
4
Assembler-kielinen käännösyksikkö (2)
  • Käännösyksikkö voi olla myös suoraan k.o. koneen symbolisella konekielellä kirjoitettu
    • suoraan käsin
    • kääntäjän generoimana korkean
      tason kielestä
  • Käännöksen tekee assembler-kääntäjä tavallisen kääntäjän asemesta
    • yleensä osa tavallista kääntäjää
5
Objektimoduuli (2)
  • Konekielinen koodi
    • moduulin sisäiset viitteet paikallaan
      (lineaarisessa muistiavaruudessa)
    • moduulin ulkopuoliset viitteet merkitty
  • Linkitystä varten:
    • tiedot niiden osoitteiden
      sijainneista, jotka täytyy päivittää, kun moduulin osoiteavaruus yhdistetään jonkin toisen moduulin osoiteavaruuden kanssa linkityksessä
    • tiedot viittauksista moduulin ulkopuolelle
    • tiedot kohdista, joista tähän moduuliin saa viitata ulkopuolelta
    • symbolitaulu


6
Symbolitaulu
  • Kääntäjä generoi
  • Ylläpidetään linkityksen aikana
  • Joskus ylläpidetään myös latauksen jälkeen virheilmoitusten tekemistä varten
    • ohjelmien kehitysympäristöt ylläpitävät symbolitaulua koko ajan
  • Jätetään pois valmiista ohjelmasta
    • vie turhaa tilaa
7
Lähdekieli vs. konekieli (3)
  • Pascal lauseke: N := I+J;
  • C lauseke: N = I+J
  • Java lauseke: N = I+J;
8
(Assembler) kääntäjän ohjauskäskyt (4)
  • Eivät varsinaista koodia
    • niistä ei tule konekäskyjä
  • Ohjaavat käännöstä
9
Makrot (6)
  • Helpottavat ohjelmointia
  • Usein toistuville koodisarjoille annetaan nimi
    Þ makro
  • Makroilla voi olla parametreja
    • useimmiten nimiparametreja (call-by-name)
  • Makrot käsitellään ennen kääntämistä
    • eivät kuulu konekieleen
    • makron ”kutsu” (käyttö) korvataan makron rungolla
  • Esimerkkejä
    • swap
    • aliohjelmien prologi ja epilogi
    • itse tehdyt, kääntäjän käyttämät
  • Erot aliohjelmiin
10
Literaalit (5)
  • Vakioita
  • Niin suuria, että eivät mahdu konekäskyn
    vakio-osaan ...
  • ... tai muuten vain halutaan pitää datan joukossa
    eikä käskyjen
    yhteyteen
    talletettuna
  • Niitä ei saisi
    muuttaa
11
Literaalit (2)
  • Korkean tason kielissä kaikki isot vakiot ovat literaaleja
    • kääntäjän pitäisi estää literaalien muuttamisen
    • literaalia ei saisi välittää viiteparametrina
      • aliohjelma voisi muuttaa sen arvoa?
  • Myös joissakin assemblerkielissä literaalien  implisiittinen (automaattinen) määrittely
    • helpommin
      luettavaa koodia
    • literaalin 234567 tilanvaraus automaattisesti
12
Assembler käännös (4)
  • 1. vaihe:
    • laske käskyjen tilanvaraukset
      • ttk-91 helppoa, koska kaikki käskyt 4 tavua!
    • generoi symbolitaulu
      • arvot, arvon vaatima tavumäärä
      • uudelleensijoitustiedot (omana tauluna?)
    • generoi tai käytä muita tauluja
      • literaalitaulu (tilanvaraus lopuksi)
      • kääntäjän ohjauskäskytaulu
      • operaatiokooditaulu


13
Assembler käännös (8)
  • 2. vaihe
    • generoi lopullinen
      objektimoduuli
    • tulosta symbolinen konekielinen listaus
    • generoi taulut linkitystä varten
      • osana objektimoduulia
    • anna virheilmoitukset
  • 3. vaihe
    • koodin optimointi
    • voi olla oikeasti ennen 2. vaihetta tai sen yhteydessä
14
Esimerkki: TTK-91 Assembler käännös,  1. vaihe
    • s      DC      0
    • i       DC      1
    • 0: Taas   LOAD     R1, i
    • 1:            MUL       R1,R1
    • 2:            ADD       R1, s
    • 3:            STORE   R1, s
    • 4:            LOAD     R1, i
    • 5:            ADD       R1, =1
    • 6:            STORE   R1, i
    • 7:            COMP    R1, =21
    • 8:            JLES       Taas
    • 9:            SVC       SP, =HALT
15
 
16
"s"
    • s      DC      0
    • i       DC      1


    • 0: Taas   LOAD     R1, i
    • 1:            MUL       R1, R1
    • 2:            ADD        R1, s
    • 3:            STORE   R1, s
    • 4:            LOAD     R1, i
    • 5:            ADD        R1, =1
    • 6:            STORE   R1, i
    • 7:            COMP    R1, =21
    • 8:            JLES       Taas
    • 9:            SVC        SP, =HALT
    • 10:            0              ; siis s = 10
    • 11:            1              ;       i = 11
17
 
18
TTK-91 objektimoduuli
19
TTK-91 objektimoduuli
  • Moduulin otsakeosa
    • moduulin nimi
    • linkittäjän tarvitsemia tietoja
      • objektimoduulin osien pituudet
      • käännös päivämäärä
      • kääntäjän nimi ja versio
      • ensimmäisen suoritettavan käskyn osoite
        • ellei aina 0

20
TTK-91 objektimoduuli
  • EXPORT-hakemisto
    • tunnukset, jotka näkyvät (eli niihin voi viitata) muille moduuleille
      • rutiinit, aliohjelmat, (oliot, metodit)
      • yhteiskäyttöinen data
    • tunnuksen osoite (= symbolin arvo)
    • mahdollinen käyttöoikeus
      • R/W/E/RW

21
TTK-91 objektimoduuli
  • IMPORT-hakemisto
    • muissa moduuleissa määritellyt  tunnukset, joihin viitataan tässä moduulissa
      • tunnus
      • niiden käskyjen osoitteet, jossa tunnus esiintyy
  • Koodi ja alustettu data
    • alustamattomille muuttujille ei tarvitse varata (vielä) tilaa, mutta ne on otettava huomioon data-alueen koossa
22
TTK-91 objektimoduuli
  • Uudelleensijoitushakemisto
    • niiden käskyjen osoitteet, joiden osoiteosaa on korjattava, kun siirrytään moduulien yhteiseen osoiteavaruuteen
      • esim. kaikki IMPORT hakemiston kautta tehdyt viittaukset?
      • esim. kaikki absoluuttiset muistisoitteet?
      • suoraviivainen lisäys (joka käskyyn) ei toimi, sillä käskyn osoiteosa voi olla vakio, jota ei saa muuttaa
      • erikseen (a) paikalliseen dataan viittaavat ja
        (b) hyppykäskyt,  sillä linkittäessä yhdistetään erikseen data- ja koodialueet

23
Korkean tason kielen käännös (2)
  • Enemmän vaiheita
    • Syntaktisten alkioiden etsintä
      • Syntaksipuun generointi ja jäsennys
    • Lauseiden tunnistaminen syntaksipuun avulla
    • Välikielen (välikoodin) generointi (ei aina)
    • Koodin generointi
      • ei (yleensä) Java-ohjelmille
24
Linkitys
  • Uudelleensijoitusongelma
    • jokaisen objektimoduulin osoitteet alkavat 0:sta
    • tulosmoduulissa kaikki yhdessä lineaarisessa osoiteavaruudessa
    • useimpien moduulien kaikkia osoitteita täytyy muuttaa
      • käskyjen osoitteet
      • datan osoitteet
25
Linkitys esimerkki (4)
  • Neljä moduulia: A, B, C ja D
  • Laske joka moduulille uudelleen-
    sijoitusvakio (moduulin alkuosoite)
  • Lisää k.o. vakio kunkin moduulin sisäisiin viitteisiin
  • Etsi kaikki moduulien
    väliset viitteet,
    ja aseta kyseisten
    viitteiden osoitteet oikein


26
Muuttujan X
viittausten päivitys (3)
  • Miten löytää linkityksen aikana kaikki (moduulin) kohdat, jossa muuttujaan X viitataan?
  • Vastaus 1: taulukko, jossa kaikki kohdat listattu
    • taulukko voi olla hyvin iso
    • kaikille muuttujille tilaa maksimitarpeen verran?
  • Vastaus 2: Muuttujan X viittaukset on linkitetty keskenään linkitetyksi listaksi objektimoduulissa
    • vain linkitetyn listan alkuosoite taulukossa
      (tarvitaan vain yksi osoite per muuttuja)
    • X:n osoitteen paikalla aluksi linkki seuraavaan käskyyn, missä X:ään viitataan
    • listan voi käyttää vain yhden kerran?
27
Muuttujan X viittaukset linkitettynä listana (1)
28
Staattinen linkitys (5)
  • Tavallinen (staattinen) linkitys vaatii, että kaikki ohjelmakoodissa viitatut moduulit ja kirjastorutiinit on linkitetty ennen suoritusta
  • Ajomoduulista tulee hyvin iso
    • mukana myös paljon moduuleja, joihin ei yhdellä suorituskerralla tule lainkaan viittauksia
      • esim: kääntäjässä koodin optimointikoodi, vaikka koodin optimointia ei suoriteta joka kerta
      • esim: pelissä tasojen 8-22 moduulit, kun aloittelija ei pääse tasoa 3 ylemmäksi vielä kuukausiin
29
Dynaaminen linkitys (3)
  • Jätetään linkityksessä kutsukohdat muihin moduuleihin auki
  • Pienempi ajomoduuli, mutta hitaampi suorittaa
  • Viittaus ”ratkaisemattomaan”
    (eli ei-linkitettyyn) moduuliin ratkotaan suoritusaikana
    • suoritus keskeytyy ja puuttuva moduuli linkitetään paikalleen (kaikki viittaukset siihen korjataan kuntoon)
30
Windows DLL (4)
  • DLL - Dynamically Linked Library
    • koodia, dataa tai molempia
  • Säästää tilaa myös
    yhteiskäytön vuoksi
  • Helpompi korjata virheitä
    • ei tarvita uutta käännöstä eikä lähdekielistä koodia!
    • riittää kun DLL vaihdetaan uuteen
    • seuraavassa suorituksessa uusi versio käyttöön
  • Ajomoduuli kootaan kuten tavallinen objektimoduuli
    • DLL moduulit ja DLL viittaukset merkitty erikoislipukkeella (huomioidaan linkityksen yhteydessä)
31
Windows DLL:n linkityksen kaksi tapaa
  • Epäsuora dynaaminen linkitys
  • Suora dynaaminen linkitys
  • DLL:ssä oleva koodi suoritetaan osana kutsuvaa prosessia käyttäen sen omaa aktivointitietuepinoa


32
DLL:n epäsuora dynaaminen linkitys
  • Kaikki viitatut moduulit ladataan (lataus aloitetaan) virtuaalimuistiin ja niihin viitataan staattisesti linkitetyn pienemmän liitospalikan (import library) avulla
33
DLL:n suora dynaaminen linkitys
  • Koodiin generoidaan suoraan viitepaikalle käskyt, joiden avulla linkitys tapahtuu tarvittaessa
  • DLL ladataan vain jos
    siihen tulee viittaus
    • hidas, koska lataaminen
      alkaa vasta ensimmäisen
      viittauksen yhteydessä

34
Nimien sidonta (2)
  • Milloin symbolin L suoritusaikainen muistiosoite tai muu lopullinen arvo sidotaan (lasketaan valmiiksi)?
    • ohjelman kirjoitusaikana?
    • käännösaikana?
    • linkityksessä?
    • latauksessa?
    • kantarekisterin asetuksen aikana?
    • osoitteen sisältämän konekäskyn suoritusaikana?
  • Jos muuttujan sijaintipaikkaa siirretään sitomisen jälkeen, mennään metsään …
35
Sijainnista riippumaton koodi (3)
  • Jos koodi siirretään toiseen paikkaan, niin mitään osoitetta ei tarvitse päivittää
  • Kaikki muistiviittaukset ovat
    • absoluuttisia (esim. keskeytys käsittelijän osoite),
    • suhteessa PC:hen, tai
    • pinossa
  • Siellä ei ole viittauksia mihinkään koodiin tai tietorakenteeseen suorien (fyysisten) muistiosoitteiden avulla (tähän koodisegmenttiin)
36
Lataus (4)
  • Ajomoduulista luodaan suorituskelpoinen prosessi
    (rakennetaan PCB ja sen viitteet kuntoon)
  • Prosessin koodialueet (tai ainakin sen pääohjelma) ja tarvittava data-alue ladataan muistiin, prosessi siirretään ready (Ready-to-Run) jonoon
  • Sitten kun prosessi saa suoritusvuoron suorittimella, MMU ja laiterekisterit ladataan PCB:n avulla tämän prosessin tiedoilla
    • virtuaalimuistia käytettäessä joidenkin nimien sidonta tehdään viime hetkellä (konekäskyn suoritusaikana) MMU:n avulla
37
-- Luennon 10 loppu --