Muistinhallinta ohjelmointikielissä
|
|
- Miina Halonen
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 Muistinhallinta ohjelmointikielissä Antti-Juhani Kaijanaho 5. helmikuuta Olioista ja eliniästä Tässä monisteessa oliolla (engl. object) tarkoitetaan muuttujan abstraktiota: jokaisella oliolla on identiteetti, muistialue, johon sen tila on tallennettu, sekä muutettavissa oleva tila. Tämä ei kuitenkaan ole olio-ohjelmoinnin olio, sillä tämän monisteen oliolla ei ole käyttäytymistä. Toisin kuin arvot, oliot sijaitsevat ajassa. Oliolla on tietty syntyhetki ja tietty kuolinhetki; puhutaan sen elinajasta (engl. lifetime). Olio voi 1. syntyä ohjelman alkaessa ja kuolla sen loppuessa (staattinen olio, engl. static object), 2. syntyä tiettyyn ohjelmalohkoon tultaessa ja kuolla sieltä poistuttaessa (pinodynaaminen olio, engl. stack-dynamic object), 3. syntyä erityisen luontioperaation ja kuolla erityisen tuhoamisoperaation vaikutuksesta (manuaalisesti tuhottava kekodynaaminen olio, engl. manually deallocated heap-dynamic object), 4. syntyä erityisen luontioperaation vaikutuksesta ja kuolla joskus sitten, kun sitä ei enää kaivata (automaattisesti kuoleva kekodynaaminen olio, engl. automatically deallocated heap-dynamic object), tai 5. syntyä jo ennen ohjelman alkamista tai kuolla vasta joskus ohjelman päättymisen jälkeen (säilyvä olio, engl. persistent object). Kaikki ohjelmointikielet eivät tue kaikkia edellä mainittuja elinikätyyppejä. Esimerkiksi alkuperäisessä Fortranissa käytettiin vain staattisia olioita. Useimmat kielet eivät tue säilyviä olioita. Monet laajassa käytössä olevat kielet eivät tue automaattisesti kuolevia kekodynaamisia olioita, mutta lähes kaikki muut kielet puolestaan eivät tue manuaalisesti tuhottavia kekodynaamisia olioita. Osa monisteen tekstistä on peräisin tekijän kandidaatintutkielmasta [9]. 1
2 1.1 Staattiset oliot Staattiset oliot syntyvät ohjelman suorituksen alkaessa ja kuolevat sen päättyessä. Käännettyjen ohjelmien ohjelmatiedostoissa näillä olioilla on oma paikkansa ohjelmakoodin rinnalla, ja näiden olioitten alkuarvo on usein ilmaistu jo ohjelmatiedostossa. Nämä oliot syntyvät ohjelman alkaessa siten, että ohjelmakoodi näine olioineen ladataan muistiin. Ne kuolevat, kun ohjelman ohjelmakoodi näine olioineen poistetaan muistista ohjelman suorituksen päätyttyä. Staattisten olioiden käyttäminen ajon aikana on yleensä tehokasta: niiden muistiosoite voidaan laskea linkitysvaiheessa, jolloin olioon viittaaminen voi usein tapahtua suoralla osoituksella (engl. direct addressing). 1.2 Pinodynaamiset oliot Lähes kaikki ohjelmointikielten toteutukset varaavat ajonaikaisesta muistista alueen käytettäväksi pinona. Lähes kaikki prosessorit tukevat tätä varaamalla erityisen rekisterin (esimerkiksi Nelikoneessa $65535) pino-osoitinkäyttöön (osoittamaan ensimmäistä varaamatonta muistipaikkaa pinossa). Pinodynaamiset oliot ovat sellaisia otuksia, jotka luodaan tarvittaessa (esimerkiksi tiettyyn lohkoon tultaessa) ja jotka tuhotaan käänteisessä luontijärjestyksessä (esimerkiksi kyseisestä lohkosta poistuttaessa). Kielissä, joissa voidaan käsitellä osoittimia olioihin vapaasti, pinodynaamisiin olioihin liittyy ongelma: ne saattavat kuollessaan jättää jälkeensä orpoja osoittimia (engl. dangling pointers). Mikäli tällaisia osoittimia käytetään, astutaan hyvin määritellyn toiminnallisuuden ulkopuolelle. (Aiemmin käsiteltyjen Hoaren kriteereiden mukaan ohjelmointikielen pitäisi suojata tätä vastaan.) Yksi klassinen esimerkki orpojen osoittimien ongelmasta kärsivästä kielestä on C. Esimerkiksi seuraava aliohjelma palauttaa orvon osoittimen: char const * readline(void) { char line[512]; fgets(line, sizeof line / sizeof *line, stdin); return line; } 1.3 Kekodynaamiset oliot Kekomuisti (engl. heap memory) on muistialue, johon voi synnyttää ja tappaa kaikenkokoisia olioita milloin vain. Kekomuistista varattavien olioiden elinaika on periaatteessa rajattu vain ohjelman suorituksen alulla ja lopulla. Tällaisten, kekodynaamisten olioiden merkitys ohjelmoinnissa on yhä suurempi: lähes kaikki vähänkään monimutkaisemmat tietorakenteet vaativat käytännössä kekodynaamisten olioiden käyttöä. Huomaa, ettei kekodynaamisten olioiden käyttämiseen välttämättä tarvita tukea eksplisiittisille osoittimille. Kekodynaamiset oliot jaetaan kahteen alaluokkaan sen perusteella, pitääkö ohjelmoijan huolehtia niiden tuhoamisesta itse vai hoitaako sen kielen toteutuksen suoritusympäristö-osa (engl. runtime environment). Edellisiä voitaneen sanoa manuaalisesti tuhottaviksi, jälkimmäisiä automaattisesti kuoleviksi. 2
3 Manuaalisesti tuhottavissa kekodynaamisissa olioissa on sama ongelma kuin pinodynaamisissa olioissa, mikäli osoittimet sallitaan: orpoja osoittimia syntyy aivan liian helposti. Automaattisesti kuolevat oliot toteutetaan muistinsiivousmenetelmillä (engl. garbage collection methods), joista tarkemmin myöhemmin. 1.4 Säilyvät oliot Jotkin oliot ovat säilyviä (engl. persistent), eli ne ovat syntyneet ennen ohjelman suorituksen alkamista tai kuolevat joskus ohjelman suorituksen päättymisen jälkeen. Tällaiset oliot elävät massamuistissa (esimerkiksi kovalevyllä) ja käyvät työmuistissa lähinnä toimiakseen operaatioiden kohteina. Eräässä mielessä ohjelman konekielinen koodi muodostaa säilyvän olion. Joissakin kielissä (esimerkiksi Smalltalk) kaikki oliot ovat säilyviä. Tällöin tyypillisesti koko käytössä oleva muisti on säilyvää, ja ohjelman suorituksen päättyminen vastaa lähinnä ohjelman suorituksen keskeyttämistä. Useat kielet (esimerkiksi Java) tarjoavat mahdollisuuden olion serialisointiin, jolla jokin ei-säilyvä olio voidaan tallentaa levylle erityisellä operaatiolla niin, että se voidaan taas uudestaan sieltä ladata, taas erityisellä operaatiolla. 2 Kekomuistin hallinta Kekomuistin hallinta rakentuu kahden järjestelmäaliohjelman ympärille: varaa muistia vapauta muistia Ajatus on, että ohjelma voi milloin vain kutsua varaa muistia (engl. allocate) - aliohjelmaa antaen sille tarvittavan muistilohkon koko ja kyseinen aliohjelma löytää nopeasti käyttämättömän muistilohkon ja antaa sen alkuosoitteen ohjelmalle. Lisäksi ohjelma voi halutessaan kutsua vapauta muistia (engl. deallocate) -aliohjelmaa antaen sille jonkin aiemmin varatun muistinlohkon alkuosoitteen, jolloin aliohjelman tehtävänä on palauttaa kyseinen lohko nopeasti muistinvarausaliohjelman käyttöön ikään kuin kierrätettäväksi. Kekomuistin hallintaan liittyy neljä merkittävää ongelmaa (kasvavassa vakavuusjärjestyksessä): Sisäinen pirstoutuminen (engl. internal fragmentation) syntyy, kun muistinvarausaliohjelma varaa pyydettyä isompia lohkoja oman mukavuutensa vuoksi. Tätä hukkatilaa ei voi hyötykäyttää. Ulkoinen pirstoutuminen (engl. external fragmentation) syntyy, kun varattuja lohkoja vapautetaan ja varattujen lohkojen väliin jää lyhyitä vapaita muistialueita. Pahimmassa tapauksessa kaikki vapaa muisti on tällaisina lyhyinä lohkoina eikä muistinvarausaliohjelma kykene käyttämään kaikkea muistia hyväksi, sillä vaikka tilaa sinänsä on, mistään ei enää löydy riittävän isoa yhtenäistä muistialuetta. Muistivuoto (engl. memory leak) syntyy, kun ohjelma unohtaa vapauttaa muistilohkoja, joita se ei enää tarvitse. Pahimmillaan nämä leijuvat roskat (engl. floating garbage) täyttävät koko muistin eikä muistinvarausaliohjelma pysty 3
4 enää toteuttamaan pyyntöjä, vaikka käyttämätöntä muistia olisikin paljon olemassa (leijuvana roskana). Orpo viittaus (engl. dangling reference) syntyy, kun ohjelma vapauttaa muistilohkon, johon on viittauksia ohjelman käytössä vielä olevista muistialueista. Tyypillisesti tämä tapahtuu, kun ohjelma vapauttaa vahingossa lohkon, jota se vielä tarvitsee. Kun ohjelma sitten myöhemmin yrittää käyttää tuota lohkoa kyseisten viittausten kautta, muistinvarausjärjestelmän pasmat sekoavat ja parhaassa tapauksessa ohjelma kaatuu mutta yleensä se vain alkaa käyttäytyä omituisesti tai jopa vaarallisesti. Yksinkertainen algoritmi muistinvarausjärjestelmän toteuttamiseksi on ensimmäinen sopiva -algoritmi (engl. first fit algorithm). Siinä vapaat muistilohkot kootaan linkityksi listaksi, ns. vapaalistaksi (engl. free list). Muistinvarauspyynnön tullessa listasta etsitään ensimmäinen vastaantuleva lohko, joka on riittävän iso; jos se on isompi kuin pyydetään, se jaetaan kahtia niin, että ylijäävä osa jää vapaalistaan. Jos vapaalistasta ei löydy riittävän isoa lohkoa, voidaan joko luopua yrityksestä tai sitten, mikäli mahdollista, kasvattaa keon kokoa. Muistia vapautettaessa vapautettu lohko lisätään vapaalistaan. Ensimmäisen sopivan menetelmässä muistin varaus on suhteellisen yksinkertaista ja nopeaa. Menetelmän toimivuus on enimmäkseen kiinni siitä, missä järjestyksessä vapaalista pidetään: Osoitejärjestys Jos vapaalista pidetään lohkojen alkuosoitteiden mukaisessa järjestyksessä, on vierekkäisten lohkojen yhdistäminen isommaksi lohkoksi helppoa. Tämä pitää ulkoisen pirstoutumisen erittäin vähäisenä. Kasvavan koon järjestys Jos vapaalista pidetään lohkojen koon mukaisessa kasvavassa järjestyksessä, on algoritmi optimaalinen sikäli, että muistinvaraus löytää aina pienimmän lohkon, joka tyydyttää pyynnön. Tämä pitää ulkoisen pirstoutumisen vähäisenä. Pienenevän koon järjestys Jos vapaalista pidetään lohkojen koon mukaisessa pienenevässä järjestyksessä, on algoritmi pessimaalinen: muistinvaraus löytää aina suurimman vapaan lohkon ja joutuu sen todennäköisesti pilkkomaan. Tässä ulkoinen pirstoutuminen on voimakasta. Käänteinen vapautusten järjestys Jos vapaalista järjestetään niin, että viimeksi vapautettu lohko on listan alussa, on muistin vapautus erittäin nopeaa, Ulkoinen pirstoutuminen on voimakasta. Toinen järjestelmä on ns. buddy system, jossa muisti varataan vain tietynkokoisina paloina: muunkokoiset pyynnöt pyöristetään ylöspäin. Jos nämä sallitut koot on valittu sopivasti, isomman koon lohko voidaan aina tarvittaessa jakaa tasan useaan pienemmän koon lohkoon. Tämä johtaa merkittävään sisäiseen pirstoutumiseen. 3 Muistinsiivous Muistivuodosta ja orvoista osoittimista päästään parhaiten eroon siirtämällä muistinvapautuksen vastuu ohjelmalta järjestelmälle (yleensä kääntäjän huoleksi). Tässä käytettyjä tekniikoita sanotaan yleensä yhteisesti muistinsiivouk- 4
5 seksi. Tämä osa perustuu pääosin tekijän kandidaatintutkielmaan [9]. Lukemisen arvoisia ovat myös Mikko Niemisen pro gradu [12] sekä Jonesin ja Linsin muistinsiivouskirja [8]. 3.1 Muistin abstrakti malli Tämä luku esittelee tässä käytettävän muistinhallinnan abstraktin mallin. Mallin tarkoituksena ei ole kuvata sitä, miten käytännön muistinhallinta muistin näkee, vaan sen tarkoituksena on olla mahdollisimman selkeä ja ilmaisuvoimainen väline eri muistinhallintamenetelmien ja -ongelmien esittelemiseen Muutin ja ohjelma Tässä yhteydessä ohjelma koostuu muuttimesta (engl. mutator) ja muistinhallinnasta. Muutin on ohjelman hyötykuorma se osa ohjelmaa, joka tekee, mitä ohjelman odotetaan tekevän. Se käyttää muistinhallinnan palveluita tehtävänsä suorittamiseen. Muistinhallinnan kannalta tuo ohjelman osa vain käy muuttelemassa tietorakenteita, joita muistinhallinta yrittää hallita siitä nimi muutin Muistin rakenne Muistimäärä, jonka ohjelma voi ottaa käyttöön, on aina rajattu. Tämä rajattu muistimäärä jaetaan kahteen osaan: vapaaseen ja varattuun muistiin. Varattu muisti puolestaan jakautuu muuttujiksi, jotka ovat toisistaan riippumattomia vektoreita, jotka sisältävät alkioita. Alkiot voivat joko viitata toisiin muuttujiin, jolloin ne ovat osoittimia tai ne voivat sisältää jotain hyödyllistä dataa, jolloin ne ovat atomaarisia. Muuttuja, jossa on vain atomaarisia alkioita, on itsekin atomaarinen. Osoitinalkio voi myös olla tyhjä (engl. null), jolloin se ei viittaa mihinkään muuttujaan. Tässä oletetaan yksinkertaisuuden vuoksi, että alkiot ovat muistinhallinnan kannalta kaikki saman kokoisia Luonnoskieli Tässä luvussa käytetään erityistä luonnoskieltä esittämään eri algoritmeja. Kielen ohjausrakenteet on kirjoitettu suomen kielellä ja lienevät selviä. Lohkorakenne ilmaistaan sisennyksellä. Aliohjelmien parametrienvälitys tapahtuu viitesemantiikalla (call by reference). Luonnoskielessä käytettävät nimet esittävät muuttujia kuten missä tahansa ohjelmointikielessä. Nimiä ei tarvitse esitellä. Operaattori sitoo vasemmaksi operandiksi kirjoitettuun nimeen oikeanpuolisen operandin arvon. Saman nimen uudelleensitominen on destruktiivinen operaatio. Osoitinta, joka osoittaa muuttujaan, merkitään luonnoskielessä kirjaimella. Jos x on epätyhjä osoitin, niin x[i] on sen päästä löytyvän muuttujan i:s alkio (laskeminen aloitetaan nollasta). Osoittimen x päästä löytyvän muuttujan kaikki epätyhjiä osoittimia sisältävät alkiot muodostavat joukon Osoittimet(x). Tyhjää osoitinta esittää nimi null. Jos muistinhallintamenetelmä tarvitsee omia, 1 Itse asiassa tämä oletus pätee kaikissa yleisissä tietokoneissa, jos alkiot ovat kaikki konesanan pituisia, kuten usein on. 5
6 muuttimelle näkymättömiä kenttiä, ne ovat käytettävissä negatiivisilla indekseillä. Luonnoskielessä on osoitinaritmetiikka sallittua. Tätä käytetään esimerkeissä lähinnä muistinhallinnan sisäisten kenttien piilottamiseen muuttimelta Muistinhallinnan primitiivioperaatiot Osalla tässä esitellyistä muistinhallinntamenetelmistä on käytettävissään kaksi primitiivistä operaatiota: p := Varaa(koko) ja Vapauta(p). Ensiksi mainittu ottaa palan vapaata muistia ja tekee siitä varatun muuttujan, jossa on koko alkiota. Muistialue sidotaan nimeen p. Jos varausoperaatio epäonnistuu, nimeen p sidotaan tyhjä osoitin. Jälkimmäinen operaatio ottaa sille annetun muuttujan ja tekee siitä vapaan muistin osan. Vapautusoperaatio onnistuu aina. Eräs tapa toteuttaa nämä operaatiot on kuvattu edellä. Osa tarkasteltavista algoritmeista ovat kuitenkin sellaisia, ettei näitä operaatioita voi niistä irroittaa; niissä yhteyksissä näitä primitiivioperaatioita ei käytetä. Varattujen muuttujien koon summa ei voi koskaan ylittää ohjelman käytettävissä olevan muistin kokonaismäärää. Varausoperaatio voi kuitenkin epäonnistua, vaikka varattujen muuttujien koon summa ynnä varattavan muuttujan koko olisikin pienempi kuin käytettävissä olevan muistin kokonaismäärä, sillä vapautusoperaatiot aiheuttavat muistin pirstoutumista Nimigraafi Ohjelman muistiavaruus voidaan ajatella suunnatuksi, väritetyksi graafiksi. Graafiin lisätään valkoinen solmu aina kun uusi muuttuja luodaan; kun muuttuja vapautetaan, sitä vastaava solmu värjätään mustaksi. Kaaret esittävät epätyhjiä osoittimia. Syy solmujen väritykseen on se, että oikeassa muistisysteemissä vapautettuun muistialueeseen voi jäädä orpoja osoittimia, ja mallin tulee voida esittää tämä ongelma. Muutin saa koskea vapaasti kaikkiin valkoisiin solmuihin; ne ovat sen omaisuutta. Sen sijaan mustiin solmuihin se ei saa koskea, vaikka se niihin pääsisikin käsiksi. Muistialue, joka joskus edusti kyseistä mustaa solmua voi olla jo uusiokäytössä jonakin toisena muuttujana, ja siihen koskeminen voi muuttaa muuttimen toimintaa ennustamattomasti ja virheitä tuottavasti. Toisaalta kyseinen muistialue voi olla muistinhallinnan tai jopa edellä esiteltyjen primitiivioperaattorien sisäisessä käytössä, ja sen muuttaminen voi sekoittaa näiden toiminnan. Joissakin järjestelmissä osa mustista solmuista on erityisesti suojattu niin, että niiden käyttäminen aiheuttaa virheilmoituksen ja tyypillisesti ohjelman suorituksen päättymisen. Tietty joukko graafin valkoisia solmuja muodostaa juurijoukon 2. Mitä tahansa tietä juurijoukon alkiosta johonkin solmuun sanotaan ko. solmun eli muuttujan nimeksi ja tästä syystä koko graafia sanotaan tässä nimigraafiksi. Erityisesti jokainen triviaali tie juurijoukon alkiosta siihen itseensä on kyseisen alkion nimi. Huomaa, että muuttujalla voi olla useita nimiä, ja joillakin muuttujalla lähinnä syklisen tietorakenteen alkioilla voi olla jopa numeroituvasti ääretön määrä nimiä. 2 Tyypillisesti von Neumannin koneissa tämän joukon muodostavat täsmälleen koneen rekisterit, aktivaatiopino sekä staattisesti varatut muuttujat. 6
7 3.1.6 Muuttimen ja muistinhallinnan rajapinta Muutin käyttää muistia neljän operaation kautta: p Uusi(koko) Luo uusi dynaaminen muuttuja, johon mahtuu koko alkiota. Osoitin tähän muuttujaan sidotaan nimeen p. Poista(p) Poista dynaaminen muuttuja, jonka osoite on sidottu nimeen p, ja sido nimi p uudelleen tyhjään osoittimeen. a Lue(p, i) Lue muuttujan p kentän numero i sisältö ja sido se nimeen a. Päivitä(p, i, a) Päivitä muuttujan osoitinkentän i arvoksi a. Kaksi ensimmäistä operaatiota käsittelevät vain dynaamisia muuttujia mutta kaksi seuraavaa operoivat millä tahansa muuttujalla. Yksinkertaisuuden vuoksi oletetaan, että kaikki näiden operaatioiden kohteena olevat kentät ovat osoitinkenttiä. Esityksen yksinkertaistamiseksi asetetaan muuttimelle seuraavat rajoitukset: Muutin ei koskaan käytä luonnoskielen sijoitusoperaatiota suoraan, vaan kaikki sijoitukset tehdään Päivitä-operaatiolla. Lisäksi muutin sijoittaa aina ennen juurijoukon muuttujan kuolemaa kyseisen muuttujan kaikkiin osoitinkenttiin nollaosoittimen. Nämä rajoitukset eivät ole vakavia, sillä luonnoskieli on tarkoitettu vain muistinhallinnan kuvaamiseen; todellisessa tilanteessa käytetään oikeaa ohjelmointikieltä, jossa Nämä vaatimukset on helppo toteuttaa läpinäkyvästi kääntäjää muuttamalla. 3.2 Siivouksen perusalgoritmit Tämä luku esittelee siivouksen klassiset menetelmät: viitelaskuritekniikan, merkkaustekniikan ja kopioivan tekniikan. Luku perustuu lähinnä Jonesin ja Linsin kirjaan [8] ja Wilsonin laajennettuun katsausartikkeliin [13]. Kaikki käytännössä tavattavat siivousmenetelmät perustuvat näihin perusalgoritmeihin, mutta niissä on eri keinoin pyritty ja osin onnistuttukin ratkaisemaan perusalgoritmien varsin isot ongelmat Viitelaskuri Viitelaskuritekniikassa (engl. reference counting) jokaiseen muuttujaan sijoitetaan ylimääräinen muuttimelle näkymätön kenttä, viitelaskuri (engl. reference count). Sen tehtävänä on ilmaista, kuinka monta osoitinta osoittaa kyseiseen muuttujaan (eli mikä sen tuloaste on nimigraafissa). Tämän tiedon ylläpitämiseksi jokainen osoittimen muutos vaatii viitelaskurikentän muuttamisen: kun osoitinta muutetaan, osoittimen vanhan arvon osoittaman muuttujan viitelaskuria on pienennettävä yhdellä, ja uuden arvon osoittaman muuttujan viitelaskuria on kasvatettava yhdellä. Jos jonkin muuttujan viitelaskuri muuttuu nollaksi, ei muuttujaan ole enää osoittimia, ja se voidaan vapauttaa. Viitelaskuritekniikka voidaan toteuttaa seuraavasti: Uusi(koko): rv Varaa(koko + 1) joss rv = null: 7
8 virhe "Muisti loppui" rv rv + 1 // alussa on yksi kenttä viitelaskurina rv[ 1] 1 palauta rv Poista(p): // ei tehdä mitään Lue(p, i): palauta p[i] Päivitä(p, i, uusi): vanha p[i] p[i] uusi jos uusi osoittaa dynaamiseen muuttujaan: uusi[ 1] uusi[ 1] + 1 jos vanha osoittaa dynaamiseen muuttujaan: VähennäViitelaskuria(vanha) VähennäViitelaskuria(p): p[-1] p[-1] - 1 jos p[ 1] = 0: kaikille q joukossa Osoittimet(p): VähennäViitelaskuria(q) Vapauta(p) p null Tärkeää tässä algoritmissa on huomata, että kun jonkin muuttujan viitelaskuri menee nollaan, käydään vähentämässä sen alkioiden osoittamien muuttujien viitelaskureita, ja tarvittaessa ne tuhotaan. Näin jos jokin poiston kohteeksi joutuva muuttuja on jonkin ison asyklisen rakenteen ainoa (käänteinen) reitti juurijoukkoon, joutuu Päivitä-operaatio poistamaan samalla koko puurakenteen. Viitelaskuritekniikka pitää muistigraafin täysin konsistenttina koko ajan: se estää sekä muistivuodot (yhdellä merkittävällä poikkeuksella) että orvot osoittimet. Sen hyväksi puoleksi on myös laskettava se, että muistinhallinta limittyy yhteen muuttimen toiminnan kanssa, jolloin sen hintakin tulee jaettua tasaisesti muun suorituksen lomaan. Ainoa poikkeus tähän on tilanne, jossa poistettavaksi tulee ison asyklisen rakenteen juuri. Viitelaskuritekniikan pahin ongelma on se, ettei se kykene poistamaan syklisiä rakenteita. Tarkastellaanpa esimerkin vuoksi tilannetta, jossa kaksi yhden osoitinalkion sisältävää muuttujaa viittaavat toisiinsa. Tällöin molempien tuloaste nimigraafissa on aina vähintään 1 (esimerkin toisesta muuttujasta tuleva osoitin on edelleen olemassa), joten molemmat muuttujat jäävät muistiin, vaikka ne eivät kuuluisikaan juurijoukon transitiiviseen sulkeumaan. Esimerkki yleistyy miten suurelle sykliselle rakenteelle tahansa. Sykliongelma voidaan ratkaista yhdistämällä viitelaskuritekniikka johonkin myöhemmin esiteltävään siivousmenetelmään: viitelaskuria käytetään normaaliin tapaan asyklisten rakenteiden poistamiseen, ja toista siivousmenetelmää käytetään silloin tällöin syklisten rakenteiden siivoamiseen. 8
9 3.2.2 Merkkaa ja lakaise Merkkaa ja lakaise -siivoin on siivousalgoritmeista vanhin. Sen kehitti John McCarthy alkuperäistä LISP-systeemiä varten [11, luvun 4 kohta c] Perusmuodossaan se antaa muistivuodon kasvaa johonkin rajaan asti (tyypillisesti kunnes Varaa-operaatio epäonnistuu), minkä jälkeen se selvittää, millä muuttujilla on nimi ja merkitsee muut vapaaksi muistiksi. Siivousprosessi on siis kaksiosainen: ensin etsitään nimelliset ja sitten vapautetaan nimettömät muuttujat. Käytännössä nimelliset merkitään merkkibitillä, joka menetelmän perusalgoritmissa tallennetaan osana itse muuttujaa. Ensimmäinen osa, nimellisten etsiminen, tapahtuu ensin merkitsemällä kaikki juurijoukon alkiot ja sitten joko syvyyshakua tai leveyshakua käyttämällä merkitsemällä kaikki nimelliset muuttujat. Merkkaa ja lakaise -algoritmi voidaan toteuttaa vaikkapa seuraavaan tapaan: merkki tosi Uusi(koko): rv Varaa(koko + 1) jos rv = null: GC() rv Varaa(koko + 1) jos rv = null: virhe "Muisti loppui" rv rv + 1 rv[ 1] ei merkki palauta rv Poista(p): // ei tehdä mitään Lue(p, i): palauta p[i] Päivitä(p, i, uusi): p[i] uusi GC(): kaikille x joukossa juurijoukko: Jäljitä(x) kaikille x joukossa varattujen dynaamisten muuttujien joukko: jos x[ 1] = merkki: Vapauta(x) merkki ei merkki Jäljitä(p): jos p[ 1] = merkki: p[ 1] merkki kaikille q joukossa Osoittimet(p): Jäljitä(q) 9
10 On hyvä huomata, että järjestelmissä, joissa muuttujaan mahtuu yksi yksittäinen bitti niin, ettei kokonaista alkiota tarvitse sitä varten varata eikä se häiritse muutinta, voidaan merkki (dynaamisen muuttujan alkio 1 ylläolevassa algoritmissa) tallettaa tuossa bitissä. Merkkibitti voidaan myös tallettaa muuttujasta erilleen jonkinlaiseen merkkibiteistä koostuvaan bittikarttaan sellaisissa järjestelmissä, joissa bittikartasta voidaan helposti lukea, mitä muuttujaa mikäkin bitti edustaa. Merkkaa ja lakaise -algoritmi on yksinkertaisimmassa muodossaan luonteeltaan stop-and-go-tyyppinen: kun siivous katsotaan aiheelliseksi, muutin pysäytetään siivouksen ajaksi. Isoilla muistimäärillä (suhteessa järjestelmän nopeuteen) tämä voi aiheuttaa havaittavia pysähdyksiä. Vanhat LISP-ohjelmat pysähtyivät kerran runsaassa minuutissa noin viideksi sekunniksi kerrallaan. Muistinsiivouksen huono maine tietotekniikan ammattilaisten keskuudessa johtunee lähinnä tästä. Toisin kuin viitteidenlaskenta, merkkaa ja lakaise -algoritmi kykenee poistamaan myös sykliset rakenteet. Toisaalta haittana on Jäljitä-aliohjelman käyttämä rekursio: merkkaa ja lakaise tarvitseekin yksinkertaisessa muodossaan muistia tallettamaan syvyys- tai leveyshaun väliaikaiset tietorakenteet. Tämä ongelma voidaan kiertää käyttämällä vaikkapa osoittimienkääntöä [8, luku 4.3] Pysäytä ja kopioi Fenichel ja Yochelson [7] kehittivätkin ensimmäisen kopioivan siivoimen ei niinkään etsimään vapaata muistia 3 vaan pakkaamaan käytössä olevan muistin niin, ettei virtuaalimuisti joudu kovasti käyttämään apumuistia, mikä hidastaisi ohjelman suoritusta kovasti. Kopioivat siivoimet jakavat muistin kahtia kahteen alueeseen: lähdeavaruus (engl. fromspace)) ja kohdeavaruus (tospace näitä kutsutaan yhteisesti puoliavaruuksiksi (engl. semispace). Ne ovat samankokoisia, joten perustyyppistä kopioivaa siivointa käyttävä muutin voi käyttää korkeintaan puolet käytössä olevasta muistista. Kaikki muuttujat sijaitsevat siivouksien välisenä aikana kohdeavaruudessa, ja uudet muuttujat luodaan sinne. Siivouksen aluksi tehdään vaihto (engl. flip), jossa lähdeavaruuden ja kohdeavaruuden roolit vaihtuvat. Vaihdon jälkeen kaikki muuttujat sijaitsevat lähdeavaruudessa. Siivouksen aikana tärkeäksi operaatioksi nousee kopiointi (engl. forwarding). Tämä operaatio ottaa lähdeavaruudessa olevan muuttujan, kopioi sen kohdeavaruuteen ja merkitsee lähtöavaruuteen jääneeseen kopioon, että kopiointi on tehty sekä lisää siihen osoittimen, joka osoittaa kohdeavaruuden osoitteeseen. Kuitenkin jos lähtöavaruudessa oleva kopio on jo kopioitu, ei kopiointioperaatio tee mitään (vaan kertoo kutsujalle, että kohdeavaruuden kopio on siinä, mihin viittaava osoitin osoittaa). Lisäksi osoitin, jolla muuttuja löydettiin, päivitetään joka tapauksessa osoittamaan uuteen kopioon. Nykyaikaisen kopioivan siivoimen perusalgoritmi on peräisin Cheneyltä [5]. Algoritmissa ensin kopioidaan koko juurijoukko peräkkäin kohdeavaruuden alkuun (tai siis ne dynaamiset muuttujat, jotka ovat juurijoukon osoittimien päissä). Sitten aletaan käydä kohdeavaruutta järjestyksessä läpi: jokainen kohdalle osuneen muuttujan osoittimen päässä oleva muuttuja kopioidaan koh- 3 He ajattelivat, että virtuaalimuisti on käytännössä loputon ja että siivousta ei siksi oikeastaan tarvittaisi. 10
11 deavaruuteen aiemmin kopioitujen perään. Kun kaikki kohdeavaruudessa olevat muuttujat on käyty läpi, on kaikki juurijoukon transitiiviseen sulkeumaan kuuluvat muuttujat kopioitu, ja lähdeavaruus sisältää pelkkää roskaa. Seuraavan vaihdon jälkeen tapahtuva siivous kirjoittaa niiden yli. Cheneyn algoritmi voidaan toteuttaa seuraavasti: lähdeavaruus muistin alkuosoite kohdeavaruus muistin puolivälin osoite muistinkoko kohdeavaruus lähdeavaruus varausptr kohdeavaruus näkymättömiä 2 koko 2 // indeksi forward 1 // indeksi Uusi(varattavaMäärä): jos varausptr kohdeavaruus + varattavamäärä + näkymättömiä muistinkoko: GC() jos varausptr kohdeavaruus + varattavamäärä + näkymättömiä muistinkoko: virhe "Muisti loppui" rv varausptr varausptr varausptr + varattavamäärä + näkymättömiä rv[koko] varattavamäärä + näkymättömiä rv[forward] null palauta rv Poista(p): // ei tehdä mitään Lue(p, i): palauta p[i] Päivitä(p, i, uusi): p[i] uusi GC(): lähdeavaruus, kohdeavaruus kohdeavaruus, lähdeavaruus scanptr kohdeavaruus varausptr kohdeavaruus kaikille p joukossa juurijoukko: jos p osoittaa dynaamiseen muuttujaan: Kopioi(p) muuten: kaikille q joukossa Osoittimet(p): jos q osoittaa dynaamiseen muuttujaan: Kopioi(q) kunnes scanptr = varausptr: p scanptr + näkymättömiä scanptr p[koko] Kopioi(p) 11
12 Kopioi(p): jos p osoittaa dynaamiseen muuttujaan: jos p[forward] = null: kohde varausptr varausptr varausptr + p[koko] kaikille i joukossa [ näkymättömiä, p[koko] näkymättömiä[ Z: p[i] kohde[i] p[forward] kohde p p[forward] Huomaa, että muuttujan luonti tässä tekniikassa on helppoa, koska vapaa tila on yhtenäinen alue, josta voidaan napsaista sopivankokoinen pala pois melkein kuin pinosta. Jos siivouksen alkamisen käynnistää käyttöjärjestelmän muistinsuojaustekniikoita hyväksikäyttäen (eikä tätä tehdä kovin usein), on muistinvaraus täysin samanlaista kuin pinosta varaaminen siis nopeaa Vertailua Appel [1] on väittänyt, että kopioivaa siivointa käyttävä muistinhallinta on tietyissä tilanteissa jopa pinosta varaamista nopeampaa. Perusajatuksena on, että kopioiva siivoin ei koske siihen muistin osaan, joka ei kuulu juurijoukon transitiiviseen sulkeumaan, joten sen suoritusaika on riippumaton muistin koosta, ja kutakin varattua muuttujaa kohti siivouksen kustannus laskee, kun muistin määrä kasvaa. Appelin analyysi on kuitenkin yksinkertaistus; kuten Jones ja Lins [8] huomauttavat, vakiot merkitsevät paljon. Käytännössä merkkaaminen on lakaisua kalliimpi toimenpide, ja yksittäisen muuttujan merkkaaminen on puolestaan halvempaa kuin kokonaisen muuttujan kopiointi. Näin ollen käytössä olevan muistin määrä joudutaan kasvattamaan todella korkealle, ennen kuin kopioivan keräimen hyöty tulee todella esille. Jo Appelin oma arvio on se, että hyöty saavutetaan vasta, kun muistia on vähintään seitsemän kertaa niin paljon kuin sitä minimissään tarvittaisiin. Myös virtuaalimuistikysymykset tulevat esille. Vaikka kopioiva siivous kehitettiinkin aikoinaan nimenomaan virtuaalimuistin tehokasta käyttöä ajatellen [7], ei siitä saavuteta parasta mahdollista sivutuskäyttäytymistä. Kopiointi kyllä tiivistää käytössä olevan muistin mahdollisimman vähille virtuaalimuistisivuille, mutta toisaalta jokainen siivouspari koskettaa kaikkia sivuja ja pakottaa ne takaisin keskusmuistiin. Tässä suhteessa merkkaavat algoritmit ovat parempia kuin kopioivat, varsinkin jos merkkibitit tallennetaan erillisissä bittivektoreissa; tällöin itse muuttujat sisältäviä sivut voidaan pitää poissivutettuina. Toisaalta kopioivat siivoimet voivat kopioida muuttujat sopivaan järjestykseen niin, että todennäköisesti lähekkäin käytetyt muuttujat ovat samalla sivulla. Tämä onnistuu parhaiten käyttämällä syvyyshakua, joten Cheneyn algoritmi ei tähän sellaisenaan käy. Ongelman ratkaisevat kuitenkin useat Cheneyn algoritmin variaatiot, ks. [8, luku 6.6]. Viitelaskuritekniikan pahin ongelma on sen kykenemättömyys vapauttaa syklisiä tietorakenteita. Toinen iso ongelma on sen tehottomuus: tyypillinen imperatiivinen ohjelma muuttaa muuttujan kenttien arvoja paljon useammin 12
13 kuin varaa tai vapauttaa dynaamisia muuttujia, joten viitelaskureiden jatkuva päivittäminen maksaa. Tämän vuoksi monet kielentoteuttajat ovat vältelleet viitelaskuritekniikkaa. Viitelaskureiden paras puoli, vapautuksen välittömyys, tekee toisaalta tekniikasta houkuttelevan ympäristöihin, joissa halutaan sekä automaattisen että manuaalisen muistinhallinnan edut samassa paketissa. Siivousalgoritmin valinta on varsin paljon kiinni siitä, mitä ohjelmointityyliä sen on tarkoitus tukea. Kopioivat siivoimet sopivat funktionaaliseen tyyliin, jossa luodaan muuttujia hyvin usein mutta jossa suurin osa muuttujista muuttuu roskaksi ennen seuraavaa siivousta. Tällöin nimittäin siivouksesta elossa selviäviä muuttujia on suhteellisen vähän, ja Appelin seitsenkertaisen muistin rajaan päästään helposti. Imperatiivinen tyyli toimii paremmin joko viitelaskuritekniikan tai merkkaavan siivoimen kanssa. 3.3 Siivoimen tarvitsemat ajonaikaiset tietorakenteet Edellä on piilotettu joitakin olennaisia asioita muistinhallintamallin (ks. luku 3.1) abstraktion taakse. Tärkein kysymys on, miten siivoin erottaa atomit ja osoittimet toisistaan: erityisesti kopioiva siivous voi toimia oikein vain, jos se osaa erottaa ne toisistaan Osoittimien laputus LISP ja muut dynaamisesti tyypitetyt kielet käyttävät osoittimien tunnistamiseen tyypillisesti laputusta (engl. pointer tagging). Perusidea on varata konesanasta yksi bitti merkitsemään, onko kyseessä osoitin vai atomi. Vanhoissa järjestelmissä konesanaan mahtui yhden tai kahdenkin osoittimen tai atomin lisäksi yksi tai kaksi ylimääräistä bittiä, joten sekä merkkausalgoritmien merkkibitti että lappubitti oli luontevaa tallentaa näin [10, s. 412]. Uudemmissa järjestelmissä lappubitti joudutaan ottamaan siitä tilasta, johon voitaisiin tallettaa varsinaista dataakin. Osoittimia tämä ei yleensä häiritse, sillä osoittimet ovat tavallisesti kahdella jaollisia, jolloin lappubittinä voidaan käyttää osoittimen vähiten merkitsevää bittiä. On tosin mietittävä, onko osoittimen merkkinä ykkös- vai nollabitti; Appelin [3] mukaan ykkösbitti on parempi, sillä suurin osa osoittimien kautta tähtäämisistä käyttävät jonkinlaista kiinteää siirrosta joka tapauksessa, ja ykkösen lisääminen tai vähentäminen ei tilannetta juuri muuta. Lisäksi nollabitin varaaminen atomaariselle datalle yksinkertaistaa huomattavasti aritmeettisia laskuja. Laputuksen huono puoli nykyaikaisten järjestelmien kanssa on se, että se rajoittaa muuttujan alkioon mahtuvan atomaarisen datan kokoa. Usein joudutaankin iso atomaarinen data laatikoimaan (engl. box): varaamaan sille tilaa jostakin siivoimen ulottumattomista ja tallentamaan siihen alkioon, jossa itse datan kuuluisi olla, osoitin, joka osoittaa tähän tilaan Muuttujankuvaimet Toinen vaihtoehto on käyttää muuttujankuvaimia (object descriptors). Jokaiseen muuttujaan lisätään muuttimelle näkymätön kenttä, joka osoittaa tyyppikohtaiseen tietorakenteeseen, joka kertoo, mitkä muuttujan kentät ovat osoittimia ja mitkä eivät. Tämä tekniikka soveltuu parhaiten staattisesti tyypitetyille kielille, koska silloin kääntäjä kykenee helposti tuottamaan tuollaisen kuvaimen. 13
14 3.3.3 Tyypinkuvaimet Kolmas vaihtoehto, joka soveltuu vain staattisesti tyypitetyille kielille, on tyyppiinformaation koodaaminen ohjelman staattisen datan joukkoon niin, että siivoin tulkitsee tyyppi-informaatiota sitä mukaa kun se seuraa osoitinrakenteita dynaamisessa muistissa. Prosessin alkuunpanemiseksi siivoimen täytyy tietää, mitä tyyppiä juurijoukon muuttujat ovat. Staattisilla muuttujilla se on triviaalia, mutta pinosta varatut muuttujat ovat ongelma. Tätä tarkastellaan luvussa [2] Räätälöidyt siivoimet Neljäs vaihtoehto, joka myös soveltuu lähinnä staattisesti tyypitetyille kielille, on siivoimen räätälöinti (ks. esim. [6]). Tässä tekniikassa kääntäjä generoi esimerkiksi merkkaa ja lakaise -metodia varten jokaiselle tyypille oman merkkausaliohjelman, joka kykenee toimimaan ilman ajonaikaista dataa. Tämä metodi on variaatio tyyppikuvainmetodista, jota kuvattiin luvussa Erityistapaus: Pinossa olevat juurijoukon muuttujat Lähes kaikkia edellämainittuja keinoja voidaan aivan hyvin käyttää myös pinon selaamiseen. Poikkeuksen muodostavat tyyppikuvaintekniikka ja räätälöidyt siivoimet, sillä ne itse tarvitsevat pinomuuttujien tyyppitietoa toimiakseen. Kuitenkaan mitään niistä ei kannata käyttää, sillä tyyppi-informaation tallettaminen pinoon itseensä tuhlaa pinomuistia ja hidastaa pinosta varaamista ja parempiakin tapoja on. Appel kuvaa erästä tällaista tapaa kääntäjätekniikan oppikirjassaan [4, s. 293]: Kääntäjä kokoaa staattiseen muistiin tietorakenteen, joka kuvaa aliohjelmien paluuosoitteet niitä vastaaviin aktivaatiotietueiden 4 kuvauksiin. Siivoin sitten osaa löytää kustakin aktivaatiotietueesta siihen tallennetun paluuosoitteen jollakin tavalla (esimerkiksi paluuosoite voi olla tietueen ensimmäinen alkio), ja hakee tietueen rakenteen kuvauksen yllä mainitusta tietorakenteesta. Viitteet [1] Andrew W. Appel. Garbage collection can be faster than stack allocation. Information Processing Letters, 25(4): , [2] Andrew W. Appel. Runtime tags aren t necessary. Tekninen raportti, Princeton University Computer Science, [3] Andrew W. Appel. A runtime system. Tekninen raportti, Princeton University Computer Science, [4] Andrew W. Appel. Modern Compiler Implementation in C. Cambridge University Press, [5] C. J. Cheney. A nonrecursive list compacting algorithm. Communications of the ACM, 13(11): , Aktivaatiotietue on muuttuja, joka sisältää aliohjelman paluuosoitteen ja aktiiviset paikalliset muuttujat. 14
15 [6] David L. Detlefs. Concurrent, Atomic Garbage Collection. Väitöskirja, Carnegie Mellon University Department of Computer Science, [7] Robert R. Fenichel ja Jerome C. Yochelson. A LISP garbage-collector for virtual-memory computer systems. Communications of the ACM, 12(11): , [8] Richard Jones ja Rafael Lins. Garbage Collection: Algorithms for Automatic Dynamic Memory Management. Wiley, [9] Antti-Juhani Kaijanaho. Muistinhallinta siivousmenetelmien avulla. Kandidaatintutkielma, Jyväskylän yliopisto, Tietotekniikan laitos, [10] Donald E. Knuth. The Art of Computer Programming, Volume 1: Fundamental Algorithms. Addison-Wesley, kolmas laitos, [11] John McCarthy. Recursive functions of symbolic expressions and their computation by machine, part I. Communications of the ACM, 3(4): , [12] Mikko Nieminen. Muistinsiivous reaaliaikajärjestelmissä. Pro gradu -tutkielma, Jyväskylän yliopisto, Tietotekniikan laitos, [13] Paul R. Wilson. Uniprocessor garbage collection techniques. Julkaistaan lehdessä ACM Computing Surveys (67 sivua). 15
Luku 3. Muuttujat, arvot, oliot ja tyypit. 3.1 Arvot
Luku 3 Muuttujat, arvot, oliot ja tyypit Tässä luvussa tarkastellaan ohjelmointikielten perusrakenteita sikäli kun ne koskevat datan säilyttämistä. Tämän luvun peruskäsitteitä ovat muuttujat, arvot, oliot
Muistinsiivous. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2009 TIETOTEKNIIKAN LAITOS. Muistinsiivous.
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2009 Sisällys lmä Sisällys lmä Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman rekisteriallokaatiota)
MUISTINHALLINTA OHJELMOINTIKIELISSÄ
MUISTINHALLINTA OHJELMOINTIKIELISSÄ ANTTI-JUHANI KAIJANAHO 1. OLIOISTA JA ELINIÄSTÄ Tässä monisteessa oliolla (engl. object) tarkoitetaan muuttujan abstraktiota: jokaisella oliolla on identiteetti, muistialue,
Automaattinen muistinhallinta
Automaattinen muistinhallinta Timo Tapanainen (ttapanai@cs.helsinki.fi) Helsinki 12. huhtikuuta 2004 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö 1 Johdanto...1 2 Automaattinen muistinhallinta...1
samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.
3.2. OLIOT 31 Myös tästä menetelmästä on olemassa muunnelmia, jotka pyrkivät vähentämään yksittäisen pysähdyksen pituutta. Nämä ovat niinsanottuja ikäperustaisia (generational) menetelmiä, joissa muisti
Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä
Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.
Muistinhallinta siivousmenetelmien avulla
Antti-Juhani Kaijanaho Muistinhallinta siivousmenetelmien avulla Tietotekniikan (ohjelmistotekniikka) LuK-tutkielma 5.10.2001 Jyväskylän yliopisto Tietotekniikan laitos Tiivistelmä Tämä LuK-tutkielma käsittelee
7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
TIES542 kevät 2009 Suoraviivaohjelmat
TIES542 kevät 2009 Suoraviivaohjelmat Antti-Juhani Kaijanaho 19. tammikuuta 2009 Suoraviivaohjelmilla (engl. straight-line programs) tarkoitetaan ohjelmia, joissa ei ole lainkaan silmukoita tai muunlaisia
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT
11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.
Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan
Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.
C! Dynaaminen muisti 9.2.2017 Agenda Kertausta merkkijonoista Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Seuraava luento to 2.3. Ei harjoituksia arviointiviikolla 13.2. 17.2. 2 Palautetta merkkijonoihin
4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi
4.2. ALIOHJELMAT 71 sisältyä kaikki tarvittavat kontrollia ohjaavat rakenteet. Jos se on lause (yleensä lohko), niin on ratkaistava, miten paluuarvo ilmaistaan. Joissakin kielissä (esimerkiksi Pascal)
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU
Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double
Dynaaminen muisti Rakenteiset tietotyypit
C! Dynaaminen muisti Rakenteiset tietotyypit 1.3.2016 Agenda Kertausta Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Yhteenveto tietorakenteista Vilkaisu 3. kierroksen tehtäviin Esim: miten linkitetty
LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100
Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).
A274101 TIETORAKENTEET JA ALGORITMIT
A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen
etunimi, sukunimi ja opiskelijanumero ja näillä
Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman
1. Algoritmi 1.1 Sisällys Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. Muuttujat ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.2 Algoritmin määritelmä Ohjelmointi
Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Tietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
Sisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
Lyhyt kertaus osoittimista
, syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,
Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle, sovellusohjelmille ja käyttäjille? 2012-2013 Lasse Lensu
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti
Algoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
Osio 2: Luennot 4-7 Muistinhallinta
Käyttöjärjestelmät I Osio 2: Luennot 4-7 Muistinhallinta Tiina Niklander; kalvot Auvo Häkkinen Tietojenkäsittelytieteen laitos Helsingin yliopisto Käyttöjärjestelmät t I YKSINKERTAINEN MUISTINHALLINTA
Luento 4 Aliohjelmien toteutus
Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla
Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan
TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages
Tampere University of Technology Department of Pervasive Computing TIE-20306 Principles of Programming Languages Ruby Ryhmä 8 Juho Rintala Sami Paukku Sisällysluettelo 1 Johdanto... 3 2 Paradigma... 3
Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.
3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen
TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 13. lokakuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 13. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe C tiistai 20.10. klo 10 kielivirheiden diagnoosi, sokerin
2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.
Proseduurit Proseduuri voi olla 1) Funktio, joka palauttaa jonkin arvon: real function sinc(x) real x sinc = sin(x)/x... y = sinc(1.5) 2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma
3. Muuttujat ja operaatiot 3.1
3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Merkintöjen tulkintoja *++Pstack->top = item *Pstack->top++ = item (*Pstack->top)++ *(Pstack++)->top = item *(++Pstack)->top = item Lisää pinon toteutuksia Dynaaminen taulukko
Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python
Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat
ELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
Algoritmit 2. Luento 2 To Timo Männikkö
Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento
Muita rekisteriallokaatiomenetelmiä
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 23. marraskuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman rekisteriallokaatiota)
Rakenteiset tietotyypit Moniulotteiset taulukot
C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen
Rubikin kuutio ja ryhmät. Johanna Rämö Helsingin yliopisto, Matematiikan ja tilastotieteen laitos
Rubikin kuutio ja ryhmät Johanna Rämö Helsingin yliopisto, Matematiikan ja tilastotieteen laitos Kehittäjä unkarilainen Erno Rubik kuvanveistäjä ja arkkitehtuurin professori 1974 Halusi leikkiä geometrisilla
Arto Salminen, arto.salminen@tut.fi
3. Luento: Muistin hallinta Arto Salminen, arto.salminen@tut.fi Agenda Mitä väliä? Erityyppiset muistit Ohjelman sijoittelu muistiin Ohjelman sisäinen muistinhallinta Muistinhallintayksikkö Välimuisti
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
Algoritmit 2. Luento 2 Ke Timo Männikkö
Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento
TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015
TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2015 Sisällys t Väitöstilaisuus 4.12.2015 kello 12 vanhassa juhlasalissa S212 saa tulla 2 demoruksia
Osio 2: Luennot 4-7 Muistinhallinta YKSINKERTAINEN MUISTINHALLINTA. ltöä YLEISTÄ MUISTINHALLINNASTA. Looginen muisti.
Käyttöjärjestelmät t I Osio 2: Luennot 4-7 Muistinhallinta Tiina Niklander; kalvot Auvo Häkkinen YKSINKERTAINEN MUISTINHALLINTA Stallings, Luku 7 Tietojenkäsittelytieteen laitos Helsingin yliopisto KJ-I
Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
Sisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
Luento 4 (verkkoluento 4) Aliohjelmien toteutus
Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivointitietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit
2. Olio-ohjelmoinista lyhyesti 2.1
2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin
2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)
2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi
T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010
12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi
Luento 4 (verkkoluento 4) Aliohjelmien toteutus
Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivaatiotietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit
Luento 5: YKSINKERTAINEN SEGMENTOINTI JA SIVUTUS
Käyttöjärjestelmät t I Luento 5: YKSINKERTAINEN SEGMENTOINTI JA SIVUTUS Stallings, Luku 7 KJ-I S2005 / Tiina Niklander; kalvot Auvo Häkkinen 5-1 Sisält ltöä (Luennot 5&6) Yleistä muistinhallinnasta (luku
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
4. Lausekielinen ohjelmointi 4.1
4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,
Osoittimet ja taulukot
C! ja taulukot 1.2.2018 Tiedotteita Tämän jälkeen taas pari väliviikkoa (tenttiviikko) Seuraava luento 22.2. Laskareita ei tenttiviikolla 12.2. 16.2. 2 ja muisti Muisti Keskusyksikkö Suorittaa muistissa
Ohjelmointi 1 Taulukot ja merkkijonot
Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko
Tietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:
1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef
jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS
TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. marraskuuta 2015 Sisällys Tunnistamis- ja jäsennysongelma Olkoon G = (N, Σ, P, S) kontekstiton kielioppi ja
Algoritmit 1. Luento 4 Ke Timo Männikkö
Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,
Luento 2: Tiedostot ja tiedon varastointi
HELIA 1 (19) Luento 2: Tiedostot ja tiedon varastointi Muistit... 2 Päämuisti (Primary storage)... 2 Apumuisti (Secondary storage)... 2 Tiedon tallennuksen yksiköitä... 3 Looginen taso... 3 Fyysinen taso...
1. Olio-ohjelmointi 1.1
1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja
Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003
Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Matti Nykänen 5. joulukuuta 2003 1 Satelliitit Muunnetaan luennoilla luonnosteltua toteutusta seuraavaksi: Korvataan puusolmun p kentät p. key ja
Aliohjelmat. 1 Kutsusekvenssit. Antti-Juhani Kaijanaho 5. helmikuuta 2007
Aliohjelmat Antti-Juhani Kaijanaho 5. helmikuuta 2007 1 Kutsusekvenssit Aliohjelmaan kontrolli siirtyy sen kutsun (engl. call) kautta. Kun aliohjelman suoritus päättyy, kontrolli siirtyy takaisin sinne,
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta
4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma Every cloud has a silver line. - englantilainen sananlasku Tässä osiossa tärkeää: yksi- ja moniulotteinen taulukko Sisältö Yleistä Yksiulotteinen
TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 17. marraskuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 17. marraskuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman ta) Vaihe
Harjoitus 1 -- Ratkaisut
Kun teet harjoitustyöselostuksia Mathematicalla, voit luoda selkkariin otsikon (ja mahdollisia alaotsikoita...) määräämällä soluille erilaisia tyylejä. Uuden solun tyyli määrätään painamalla ALT ja jokin
TAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
Ohjelmointikielet ja -paradigmat 5op. Markus Norrena
Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja
Datatähti 2009 -alkukilpailu
Datatähti 2009 -alkukilpailu Ohjelmointitehtävä 1/3: Hissimatka HUOM: Tutustuthan huolellisesti tehtävien sääntöihin ja palautusohjeisiin (sivu 7) Joukko ohjelmoijia on talon pohjakerroksessa, ja he haluavat
Käyttöjärjestelmät: prosessit
Käyttöjärjestelmät: prosessit Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet Käyttöjärjestelmä
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
Tieto- ja tallennusrakenteet
Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)
Ohjelmoinnin peruskurssi Y1
Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.
4. Olio-ohjelmoinista lyhyesti 4.1
4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin