Harjoitukset

Tietokoneen toiminta, Kesä 2002, LH 6

Nämä tehtävät tehdään harjoituksissa 3.9.2002.

Tee tehtävät yksi kerrallaan haluamassasi järjestyksessä. Tarvittaessa pyydä apua paikalla olevilta ohjaajilta. Halutessasi voit tehdä tehtäviä pienessä ryhmässä, mutta kaikkien tulee silti kirjoittaa omat vastauksensa ja tehdä omat ohjelmansa omalla koneellaan. Saatuasi valmiiksi jonkun tehtävän (joukon tehtäviä), voit pyytää ohjaajaa tarkistamaan suorituksesi.

Ennen pois lähtöäsi varmista vielä, että ohjaajat ovat kirjanneet kaikki tekemäsi tehtävät. Harjoitustehtäviä voi toki tehdä vielä kotonakin, mutta kurssin läpipääsyyn ja arvosanaan vaikuttavat vain harjoitustilanteessa kirjatut tehtävät. Kurssin suoritus edellyttää aktiivisuutta myös harjoitustehtävien suhteen.

  1. [2 htp] Jump table. Pitkät valintalauseet (switch-lauseet) voivat hidastaa ohjelman suoritusta huomattavasti, jos usein suoritettavassa silmukassa joka kerta valitaan yksi kerrallaan oikea case-tapaus esimerkiksi 60 eri mahdollisuuden joukosta. Tähän menee keskimäärin 30 vertailua ja kuhunkin vertailuun ainakin 2 konekäskyä!

    Jos valinta-arvot ovat kokonaislukuarvoisia, nollasta alkavia ja muodostavat (liki) yhtenäisen arvoalueen, niin usean if-then-else -vertailun asemesta voidaan käyttää hyppytaulua (jump table). Hyppytaulun avulla päästää oikeaan case-tapaukseen aina suoraan muutamalla konekäskyllä. Hyppytaulu sisältää monta hyppykäskyä (yksi per case-tapaus), joista valintamuuttujan perusteella valitaan indeksoitua osoitusmoodia käyttäen oikea hyppykäsky. Esimerkiksi, jos rekisteri R3 sisältää valinta-arvon ja hyppytaulun osoite on JTBL, niin oikeaan case-tapaukseen (siihen liittyvään hyppykäskyyn) päästään konekäskyn "JUMP JTBL(R3)" avulla.

     

    1. Anna (Koksissa suorituskelpoinen) ttk-91 esimerkki hyppytaulun käytöstä, kun case-tapauksia on 10.
    2. Miten em. valintalause toteutetaan, jos hyppytaulussa onkin hyppykäskyjen asemesta ainoastaan case-tapausten osoitteet? Anna toteutus samalle esimerkille kuin kohdassa (a).
    3. Milloin toteutustapa (a) on parempi kuin (b)? Miksi?
    4. Milloin toteutustapa (b) on parempi kuin (a)? Miksi?
    5. Jos kukin case-tapaus vaatii 10 konekäskyä ja case-tapauksia on 60, niin kuinka paljon (%) hyppytaulun käyttö nopettaa valintalauseen suoritusta (verrattuna usean peräkkäisen vertailun toteutukseen)? Eroavatko em. toteutustavat (kohdat a ja b) tässä suhteessa?
  2.  
  3. Java ohjelmia (tavukoodia) voidaan suorittaa (ainakin) neljällä eri tavalla: tulkitsemalla, tavallisella käännöksellä, Just-In-time -käännöksellä tai suoraan Java-suorittimella.
    1. Anna esimerkkejä tilanteesta, jolloin tulkitseminen olisi parempi kuin muut vaihtoehdot. Perustele, miksi muut tavat olisivat huonompia.
    2. Anna vastaavat esimerkit ja perustelut tilanteista, jolloin muut e.m. vaihtoehdoista olisivat parhaita vaihtoehtoja.
    3. Mikä olisi paras vaihtoehto (Java) ohjelmoinnin harjoitustyön suorittamiseen? Miksi?
    4. Mitä prosesseja järjestelmässä tarvitaan ohjelman suoritushetkellä, jos Java ohjelmaasi MyProg suoritetaan 1) tulkitsemalla, 2) tavallisella käännöksellä, 3) Just-In-Time -käännöksellä tai 4) suoraan Java-suorittimella?

     

  4. Java virtuaalikone. Tee seuraavat oletukset. X, Y ja Z ovat paikallisia muuttujia numero 3, 4 ja 5. Tbl osoittaa 20 alkioiseen taulukkoon ja se (Tbl) on talletettu paikalliseen muuttujaan numero 6.
    1. Anna konekäskyt, joilla X:n arvoa kasvatetaan 5:llä.
    2. Anna konekäskyt, joilla X:n arvoksi tulee Y+Z
    3. Anna konekäskyt, joilla Y:n arvoksi tulee Tbl[3]

     

  5. Javan suoritus. Missä olosuhteissa Javalla tehdyn ohjelman suoritus olisi nopeampaa/hitaampaa kuin saman ohjelman C:llä tai C++:lla tehty toteutus? Miksi?

     

  6. Itseään muuttava koodi. Joissakin suorittimissa, ttk-91 mukaanlukien, voidaan muistipaikan arvoa tulkita sekä koodina että datana. Tämä mahdollistaa itseään muuttavien ohjelmien toteuttamisen. Itseään muuttavassa ohjelmassa muutetaan suoritettavia konekäskyjä ennen niiden suoritusta. Joissakin tapauksissa tämä voi johtaa nopeampaan koodiin kuin tavanomaisemmat ratkaisut. Esimerkiksi, jokin usein suoritettu valinta voidaan jättää kokonaan pois, kun käskysarjan valinnan asemesta onkin jo etukäteen muutettu suoritettavaa käskysarjaa halutun mukaiseksi. Yleisesti ottaen itseään muuttava koodi johtaa aina monimutkaisempiin ohjelmiin, joiden suoritusta on vaikea ymmärtää ja joissa olevien virheiden korjaaminen voi olla erittäin vaikeata.

    Tee itseään muuttava ttk-91 ohjelma, jossa on käskysarja, joka

    1. ennen muutosta laskisi yhteen muuttujien X ja Y arvon, mutta
    2. muutoksen jälkeen laskeekin muuttujien X ja Y tulon. ADD käsky on siis muutettu MUL käskyksi.

    Muutos voidaan tehdä esimerkiksi vaihtamalla koko käsky tai editoimalla kyseistä käskyä. Kumpaa tapaa käytit? Osaatko tehdä sen sillä toisella tavalla? 
    Vihje: käsky "A     ADD  R2, R3" voidaan ladata R1:een tavallisella "LOAD   R1, A" käskyllä.

     

  7. [1 htp] Vastaa kurssikyselyyn. Kiinnitä lisähuomiota kohtien 14 ja 19 vastauksiin.

    Vastaa kurssikyselyn kohdassa 14 ("Miten kurssia voisi kehittää?") myös lisäkysymyksiin:  

    1. Montako tuntia olet käyttänyt tähän kurssiin yhteensä tähän asti aikaa?
      Luentojen seuraamiseen? Harjoituksiin? Itseopiskeluun?
    2. Kuinka suureen osaan luennoista osallistuit? (100%, 90%, ...)
    3. Oliko aikataulu nopea/sopiva/hidas?
    4. Käytitkö englanninkielisiä oppikirjoja? Kuinka paljon?

    Vastaa kurssikyselyn kohdassa 19 ("Muita kommentteja ...") myös lisäkysymyksiin:

    1. Mielipiteesi WebCT:n käytöstä yleensä?
    2. Mielipiteesi WebCT:n käytöstä sen eri osioiden osalta: luennot, keskusteluryhmät, chat-keskustelut, kertauskysymykset, ylim. tehtävät?

Teemu Kerola