Koodin pienentäminen

Koko: px
Aloita esitys sivulta:

Download "Koodin pienentäminen"

Transkriptio

1 Koodin pienentäminen Timo Lilja 47989S T Ohjelmistotekniikan seminaari 12. helmikuuta 2009 Tiivistelmä Tässä työssä selvitetään erilaisia menetelmiä suoritettavan ohjelman muistijäljen pienentämiseksi eli tiivistämiseksi. Työssä tutustutaan menetelmiin, joilla ohjelman käyttämää koodi- ja datatilaa voidaan vähentää. Erityisesti keskitytään kooditilan minimointia tarjoaviin kääntäjäoptimointeihin ja muistinkulutusta vähentäviin prosessorikäskykantoihin. 1 Johdanto Koodin tiivistäminen tarkoittaa ohjelman lähde- tai kohdekoodin pienentämistä niin, että ohjelman tulos ei muutu. Ohjelmoijalla on käytettävissä monia menetelmiä koodin tiivistämiseksi lähtien erilaisita ohjelmointitekniikoista ja ohjelmointikielten tarjoamiasta rakenteista päätyen aina kääntäjäoptimointeihin ja viime kädessä käskykanta-arkkitehtuureihin. Nykyaikaisissa pyötä- ja palvelinkoneissa keskusmuistia on yleensä merkittävästi enemmän kuin mitä ohjelmien suorittaminen vaatii. Siispä ohjelmakoodia pienentävät muutokset eivät ole enää niin tärkeitä näissä ympäristöissä. Sen sijaan sulauteutuissa järjestelmissä kuten esimerkiksi kännyköissä muistia on vielä vähän saatavilla. Tällöin ohjelman muistijäljen pienentäminen voi olla merkityksellistä tai jopa välttämätöntä - joissain sulautetuissa järjestelmissä ohjelmaa ei voida suorittaa ollenkaan, jos se ei mahdu keskusmuistiin ja virtuaalimuistia ei ole tarjolla. Tässä työssä käydään läpi erilaisia menetelmiä ohjelmakoodin ja datan tiivistämiseksi. Ohjelmakoodin tiivistämisellä ymmärretään tässä yhteydessä ohjelmoijan ohjelmoitaessa valitsemat tiivistysmenetelmät kuten abstraktiot, sovellusaluekohtaiset erityiskielet (Domain Specific Languages), kääntäjäoptimoinnit ja prosessorien käskykannat. Työssä suoritetaan pienimuotoinen koe, jossa tutkitaan GCC-kääntäjän [2] tilaoptimointivipujen vaikutusta kääntämiseen. Datan tiivistäminen tarkoittaa sellaisten menetelmien valitsemista, jotka johtavat pienempään data-osion muistijälkeen. Yleensä nämä valinnat ovat erilaisia 1

2 algoritmisia ratkaisuja, jotka ohjelmoija tekee lähdekooditasolla ohjelmakoodia kirjoittaessaan. Luku kaksi esittelee ohjelmakoodin tiivistämistä sekä esittelee työn kokeellisen osion. Luvussa kolme käsitellään datan tiivistämistä. Yhteenveto ja loppupäätelmät ovat luvussa neljä. 2 Koodin tiivistäminen Ohjelmakoodin tiivistämiseen on käytössä monia menetelmiä: yksinkertaisimpia esimerkkejä lienee yhtenäisten toistuvien osien korvaaminen silmukoilla ja aliohjelmilla. Nykyaikaiset ohjelmointikielet tarjoavat paljon proseduraalista abstraktiota korkeampiakin keinoja koodin tiivistämiseen ja uudelleen käytettävyyteen. Olio-ohjelmoinnissa luokat ja funktionaalisessa ohjelmoinnissa korkeamman kertaluvun funktiot ovat hyviä keinoja vähentää koodin toistuvuutta. Sovellusaluekohtaiset erityiskielet saattavat johtaa myös pienempään koodiin lähdekooditasolla. Nykyään on olemassa myös hyvin kehittyneitä kääntäjäoptimointeja, joilla koodin tiivistämisen ongelmaa voidaan siirtää ohjelmoijalta kääntäjälle. On myös mahdollista, että tietokone pystyy tuottamaan lähdekoodista tiivistetympää kohdekoodia kuin mitä ohjelmoija. Ainakin koodin luettavuus säilyy yleensä parempana kuin ohjelmoijan tiivistäessä koodia. Jonkin verran käytetty tekniikka on koodin pakkaaminen. Koodi pakataan jollain tunnetulla pakkausalgoritmilla ja suorittettavan binäärin alkuun linkitetään ohjelma, joka purkaa koodin ennen suoritusta. Tällä menetelmällä ei niinkään saavuteta pienempää muistijälkeä vaan säästöä massamuistitilan kulutuksessa. 2.1 Abstraktiot Ehdottomasti tärkein tapa tiivistää koodia on luoda abstraktioita. Artikkelissa [7] esitellään mm. aliohjelmien ja tulkkien määrittely keinoina pienentää koodin kokoa. Olkoon annettuna koodi for I := 17 to 43 do Set(I,68) for I := 18 to 42 do Set(I,69) for I := 81 to 91 do Set(30,J) for I := 82 to 92 do Set(31,J) Tässä Set(X,Y) piirtää pikselin kohtaan (X, Y ). Luomalla proseduraalinen abstraktio vaaka- ja pystyviivojen piirtämiseen parannetaan koodin luettavuutta ja tuotetaan tiivimpää lähdekoodia. Hor(17,43,68) Hor(18,42,69) Vert(81,91,30) Vert(82,92,31) 2

3 Ei ole aivan itsestään selvää, että kyseisessä tilanteessa proseduurien käyttäminen johtaisi tiivimpään konekoodiin, koska aliohjelmakutsuista tulee tietty lisä generoituun koodiin, mutta nykyaikaiset kääntäjät ovat varsin tehokkaita suorittamaan ns. inline-optimointeja, joissa aliohjelmakutsu poistetaan ja aliohjelman runko sisällytetään sellaisenaan kutsuttavaan kohtaan. Seuraavana tiivistyskeinona artikkelissa [7] mainitaan sovellusaluekohtaisten erityiskielten käyttö: Tässä tapauksessa voitaisiin rakentaa tulkki, jolle annetaan syötteenä tiedostossa tarvittava data. Esimerkin tapauksessa: H H V V Esimerkin tulkki on huomattavasti monimutkaisempi ohjelma kuin alkuperäiset neljä for-silmukkaa. Jotta tulkkaamiseen perustuvalla lähestymistavalla päästäisiin tiivimpään tulokseen, tulee piirtokomentoja olla merkittävästi enemmän, muuten tilansäästöä ei synny. Sovellusaluekohtaisen erityiskielen suurena hyötynä voitanee pitää tilansäästön sijasta sitä, että se mahdollistaa varsinaisen ongelman kuvaamisen ongelmalle luonnollisilla käsitteillä. Sovellusaluekohtaisten erityiskielten käytön edelläkävijänä lienee Lisp-perheen kielet, joiden syntaksi mahdollistaa datan ja ohjelmakoodin yhdenmukaisen käsittelyn. Lisäksi niissä on yleensä hyvin tehokas makrojärjestelmä, jonka avulla koodin evaluointia voidaan kontrolloida hyvin tarkasti. Hyvä johdatus ohjelmointiin ja sovellusaluekohtaiseen ohjelmointiin löytyy kirjasta [6]. Monia Unix-työkaluja voidaan pitää esimerkkinä sovellusaluekohtaisesta lähestymistavasta. C-ohjelmien kääntämisessä käytettävä make-työkalu, jolla voidaan kuvata ohjelmakoodin kääntämisessä tarvittavia riippuvuussuhteita on hyvä esimerkki. Jos vastaavia riippuvuussuhteita yritettäisiin kuvata C-ohjelmalla tai shell-skripteillä, jouduttaisiin kirjoittamaan huomattavasti suurempi määrän koodia ja luettavuus olisi huonompi. Yleensä sovellusaluekohtainen kieli dokumentoi itsensä paremmin kuin vastaava toteutus yleiskäyttöisellä ohjelmointikielellä. Haittapuolena voitaneen pitää sitä, että uuden ohjelmointikielen opiskeleminen vaatii aikaa ohjelmoijalta. Lisäksi oman erityiskielen kääntäjien, työkalujen ja IDE-ympäristöjen rakentaminen sekä ylläpitäminen vie aikaa ja resursseja. Yleensä ei myöskään ole selvää, mihin raja erityis- ja yleiskäyttöisen kielen välillä tulee vetää. Viimeisenä koodin tiivistämiskeinona artikkelissa [7] mainitaan ohjelman konekielisen koodin optimointi käsin tai jopa että ohjelmoija kirjoittaisi suoraan konekielisen ohjelman käsin. Mielestäni tämä neuvo on täysin vanhentunut. Nykyisin kääntäjien optimoinnit ovat hyvin kehittyneitä ja lisäksi prosessorien käskykannat sekä liukuhinat aiheuttavat sen, että käsin on hyvin vaikea tuottaa parempaa koodia. Joissain erityistapauksissa yksittäisen funktion tai osien assembler-koodin manuaalinen optimointi saattaa olla kuitenkin kannattavaa. 3

4 2.2 Kääntäjäoptimoinnit Tässä osiossa tarkastellaan kääntäjäoptimointeja ja koodin uudelleenpakkaamista. Osio perustuu Debrayn ja muiden artikkelissa [9] esittämiin ja GCCkääntäjän [2] dokumentaation perusteella suorittamiin tilaoptimointeihin. Artikkelissa [9] käytetään tehokkaita proseduurien välisiä optimoinitimenetelmiä ja automaattista toistuvien koodiosien abstrahointia niin että saavutetaan jopa 30% tilan säästö perinteisillä menetelmillä optimoiduille binääreille. Artikkelissa kuvataan squeeze-niminen työkalu joka uudelleenkirjoittaa suoritettavan binäärin pienemmäksi. Yleisimpiä menetelmiä koodin tiivistämiseksi: Saavuttamattoman koodin eliminointi Koodi on saavuttamaton, jos mikään kontrollivuokaavion kaari ei johda siihen. Saavuttamatonta koodia ei koskaan suoriteta, joten se voidaan poistaa tuotettavasta binääristä. Kuolleen koodin eliminointi Koodi on kuollutta, jos sen laskemaa tulosta ei käytetä. Tällainen koodi voidaan poistaa vaikuttamatta ohjelman lopputulokseen. Käskyjonon korvaaminen (Strength reduction) Käskyjonon korvaaminen tarkoittaa käskyjonon korvaamista ekvivalentilla mutta vähemmän resursseja kuluttavalla käskyjonolla. Tällainen jono ei välttämättä ole alkuperäistä lyhyempi mutta yleensä suoritusajaltaan nopeampi. Tarkastelen tässä GCC [2]-kääntäjän versiota Kääntäjän tilaoptimoinnit käännetään päälle antamalla kääntäjälle vivuksi -Os. Dokumentaation [3] mukaan kyseinen vipu kääntää päälle optimointivivut -O2 ja -O1, mutta kytkee pois joukon asemointi- (align) ja uudelleenjärjestelyoptimointeja. Asemointioptimoinnit sijoittavat koodin niin että funktio- ja muut osoitteet ovat asemoitu prosessorin osoituksen kannalta tehokkaammin. Tämä suurentaa jonkin verran lopputuloksena tuotettavan binäärin kokoa. Uudelleenjärjestelyoptimoinnit järjestävät ohjelman peruslohkoja uusiksi niin, että ehdollisten hyppyjen märää vähenee. Yleensä tämäkin johtaa hieman suurempiin binääreihin 1. Vivuilla -O1 ja -O2 GCC tekee optimointeja jotka eivät merkittävästi hidasta käännöstä ja eivät suorita silmukoiden aukikäärimistä. Tämän työn kokeellisessa osiossa tutkittiin GNU Coreutils paketin kääntämistä eri GCC-optimointivivuilla ja vertailin tuotettujen binäärien kokoja. Coreutils on paketti joka GNU/Linux-järjestelmissä sisältää monia shell- -ympäristön perustyökaluja kuten ls, tar, head ja [. Paketissa on paljon suhteellisen pieniä binäärejä. Tässä kokeessa ohjelmat käännettin vivuilla -O0 (ei optimointeja), -O2 (perusoptimoinnit, oletusarvo) ja -Os (koko-optimoinnit). Kokeet suoritettiin seuraavilla alustoilla ja kääntäjän versioilla: Intel Pentium IV, GCC 4.3.2, Debian GNU/Linux Tarkkaan ottaen -Os-vipu kytkee pois optimoinnit: -falign-functions -falign-jumps - falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version 4

5 Intel Xeon E5335, GCC 4.1.2, Ubuntu 7.04 Sun SPARCv9, GCC 3.4.6, Solaris 5.10 Binäärien kokoja vertailtiin arkkitehtuureittain oletusarvo-optimoinnilla -O2 käännettyyn versioon ja ja laskettiin prosentuaalinen muutos: Liput x86 x86 64 Sparc -O0 +23,8% +28,4% +39,9% -O2 0% 0% 0% -Os -12,1% -7,1% -2,1% Normaalisti Coreutils-paketti käännetään -O2-vivulla. Tilaoptimoinneilla saavutettiin oletusarvoon verrattuna 2,1 % 12,1 % parannus. Muutokset ovat suuruudeltaan samaa luokkaa ja kääntäjien eri versioiden vaikutusta on vaikea eliminoida pois, joten kovinkaan merkittäviä johtopäätöksiä ei tämän kokeen perusteella pystytä tekemään. Intelin x86-arkkitehtuurissa eniten pieneni tsort-ohjelma, jonka koko laski 25% -O2-optioilla käännettynä. Vähiten tiivistyi groups-komento, jonka koko ei muuttunut ollenkaan. (groups-komento oli vain 2254 tavun kokoinen ja mitkään optimoinnit eivät vaikuttaneet sen kokoon.) Coreutils-paketin ohjelmat ovat varsin pieniä (keskimääräinen koko 46 kilotavua), joten tilaoptimoinneilla ei ole suuremmin merkitystä. Nykyaikaisissa pyötä- ja palvelinkoneissa, joissa keskusmuistia ja prosessorivälimuistia on riittävästi, ei koodin tilaoptimoinneilla ole enää niin suurta merkitystä. Mikäli tilaoptimoinneista aiheutuu suorituksen hidastumista, voi sillä olla käyttäjälle huomattavasti suurempi merkitys kuin saavutetuilla muutamien prosenttien tiivistyksillä. Viimeisenä kokeena tutkittiin x86-arkkitehtuurissa lähdekoodirivien lukumäärän vaikutusta objektikooditiedoston (.o) kokoon. Lähdekoodirivien määrä laskettiin sloccount-ohjelmalla [5], joka poistaa kommenttirivit. Tuloksena saatiin kuva 2.2. Kuvasta nähdään, että ohjelmakoodin koko riippuu suhteellisen lineaarisesti lähdekoodirivien määrästä. Optimointien vaikutus näyttää suhteellisen vakiolta eli ei suuremmin varioi ohjelmakoodin koon perusteella. 2.3 Prosessorien käskykannat Aikaisemmin kun keskusmuistia ei ollut paljon saatavilla oli suoritettavan konekoodin tiheydellä paljon merkitystä. Käskykannat pyrittiin suunnitelemaan mahdollisiman tiiviiksi. Nykyään muistia on työpöytä- ja palvelinkoneissa saatavilla niin paljon, että näitä perusteluja ei enää tarvita. Sen sijaan sulautetuissa järjestelmissä, joissa saatavilla olevaa muistia voi olla niukasti, on vieläkin olennaista pyrkiä tiiviiseen konekoodiin. Prosessorien käskykannat jaetaan yleensä RISC- ja CISC-luokkiin. RISC eli Reduced instruction-set computer koostuu käskykannasta, jossa jokainen käsky toteuttaa hyvin yksinkertaisen ja pienen operaation kuten esimerkiksi kahden luvun välisen kertolaskun. CISC eli Complex instruction-set computer tyyppisissä 5

6 Objektikoodin koko (tavuina) L hdekoodirivien ja objektikoodin koon suhde -O0 -O2 -Os L hdekoodirivien lkm Kuva 1: Ohjelmakoodirivien (kommentit poistettu) vaikutus tuotettuun lähdekoodiin eri optimointilipuilla. prosessoreissa lähestymistapa on täysin päinvastainen; yksittäinen käsky voi toteuttaa monta operaatiota kerrallaan. CISC-prosessoreissa on yleensä omat käskyt proseduurin kutsuun liittyvän pinon käsittelyyn kun taas RISC-prosessorissa kääntäjän tai ohjelmoijan on tuotettava ekspilisiittinen koodi funktiokutsupinon käsittelyyn. Yleensä CISC-arkkitehtuuri johtaa tiiviimpään koodiin, koska käskyt on pakattu jo käskyjen valintavaiheeessa. Mikäli käskykannan tiivistäminen viedään äärimilleen puhutaan MISC eli Minimal instruction set computer -arkkitehtuurista. MISC-arkkitehtuuria käytetään tyypillisesti virtuaalisissa pinokoneissa. MISC-arkkitehtuuri mahdollistaa hyvin yksinkertaiset käskykannan,, koska käskyjen oletetaan operoivan pinon päällä olevilla alkioilla. RISC- ja MISC-arkitehtuureissa yksittäiset käskyt ovat yksinkertaisia mutta niitä tarvitaan vastaavasti enemmän kuin CISC-koneissa. RISC/MISC johtaakin yleensä suurempaan muistiväylän käyttöön ja välimuistin huonompaan osumistarkkuuteen. Moderneissa moniydinprosessoreissa on useita ytimiä, jotka pystyvät operoimaan rinnakkain. Tällöin voi olla taloudellisempaa lähettää prosessorille yksi monimutkainen käsky, joka aiheuttaa rinnakaisen suorituksen useammassa ytimessä, kuin lähettää useampi yksinkertainen käsky. Ns. VLIW eli Very-long instruction word -käskyt ja vektorilaskenta ovat esimerkkejä tällaisesta yleistymässä olevasta lähestymistavasta. Seuraavaksi esitellään konkreettinen esimerkki tiivistetystä käskykannasta: sulautetuissa järjestelmissä käytettävän ARM-prosessorin [1] Thumb-käskykannasta [10]. ARM on 32-bittinen RISC-prosessori joka sisältää 16-bittisen Thumb-käsky- 6

7 kannan. Sulautetuissa järjestelmissä muisti on vielä tänäkin päivänä suhteellisen vähäistä, joten on selkeä tarve tiivimälle käskykannalle. Thumb-tilassa toimiessaan ohjelmoijalla on käytössä vain osa varsinaisesta käskykannasta ja kaikkiin ARM-prosessorin rekistereihin ei ole pääsyä. Thumb-käskyt on toteutettu niin, että prosessori laventaa ne varsinaisiksi käskyiksi käskyn dekoodaus -yksikössä. Ohjelmoija voi vaihtaa Thumbin ja normaalin käskykannan välillä dynaamisesti suorituksen aikana. Käskykannassa on useampi käsky, jolla tämä on mahdollista. Yleisin tapa on käyttää Branch and Exchange -käskyä (BX), Alla esimerkki koodista, joka vaihtaa Thumb-moodiin ja suorittaa Thumb-käskyistä koostuvan aliohjelman ja palaa takaisin varsinaiseen 32-bittiseen käskytilaan: mov R0,#5 ;Argument to function is in R0 add add R1,PC,#1 ;Load address of SUB_BRANCH, ;Set for THUMB by adding 1 BX R1 ;R1 contains address of SUB_BRANCH+1 ;Assembler-specific instruction to switch to Thumb SUB_BRANCH: BL thumb_sub ;Must be in a space of +/- 4 MB add R1,#7 ;Point to SUB_RETURN with bit 0 clear BX R1 ;Assembler-specific instruction to switch to ARM SUB_RETURN: Thumb-käskykannalla saadaan koodista tiivimpää. Käskykanta mahdollistaa myös dataväylän pienentämisen 16-bittiseksi. Tällöin 32-bittisen operaation hakeminen vaatii kaksi kellosykliä, mutta jos suurin osa koodista pystytään toteuttamaan 16-bittisenä, niin tämä hidastus ei ole merkittävä. Arm väittää että koodin koko pienenee noin 30% Thumb-käskyjä käytettäessä [4]. Muistiväylän pienentäminen saattaa mahdollistaa laitteiston toteuttamisen laajempaa muistiväylää halvemmalla. 3 Datan tiivistäminen Datan tiivistämisellä tarkoitetaan sen muistijäljen pienentämistä, jonka ohjelma käyttää sekä ajo- että käännösaikaisen dataan. Erotuksena koodin tiivistämiseen on se, että dataa ei (yleensä) suoriteta. Bentley [7] mainitsee useita tiivistämismenetelmiä. Älä tallenna vaan laske uudestaan. Datan vaatimaa tilaa voidaan pienentää merkittävästi, jos se voidaan laskea uudestaan aina tarvittaessa. Esimerkkinä Bentley [7] mainitsee trigonometriset funktiot, jotka aikaisemmin laskettiin taulukoista, mutta nykyään lähes poikkeuksetta kutsumalla alirutiinia, joka suorittaa varsinaisen laskun reaaliaikaisesti. 7

8 Toisena tiivästämiskeinona mainitaan harvat tietorakenteet. Klassinen esimerkki tästä on matriisien esitysmuodot: seuraajamatriisi ja seuraajalista. Jos matriisi on tiheä eli lähes jokaisessa elementissä on alkio, niin matriisi kannattaa järjestää seuraajamatriisimuotoon, jossa muistissa on varattu matriisien ulottuvuuksien kokoinen alue. Harvassa matriisissa lähes jokainen alkio on vakio tai 0. Tällöin on taloudellisempaa käyttää seuraajalistaesitystä, jossa matriisista tallennetaan vain vakioarvosta poikkeavat kohdat muistiin. Ks. tarkemmin esimerkiksi [8]. Datan pakkaaminen on myös tärkeä menetelmä ohjelmien muistijäljen pienentämiseen. Keinoja on useita riippuen sovellusalueesta. Otetaan esimerkiksi tilanne jossa data voidaan pakata yhteen prosessorin sanaan. Olkoon annettuna C-kielessä struct-rakenne: struct foo { uint_32t A; uint_16t B; } Oletetaan, että ensimmäinen luvun esittämiseen tarvitaan 20 bittiä ja toisen luvun esittämiseen 12 bittiä, jolloin ne mahtuvat yhteen 32-bittiseen sanaan. Yllä oleva esitysmuoto käyttää = 48 bittiä eli hukkaan menee 18 bittiä/invokaatio. Jos sen sijaan määritellään kentille eksplisiittinen bittileveys: struct foo { uint_32t A : 20; uint_16t B : 10; } ei ylimääräisiä bittejä mene hukkaan 2 Jos dataa on enemmän kuin keskusmuistia, voi olla hyödyllistä pakata data levylle ja purkaa siitä sopivia osia sitä mukaan kun sitä tarvitaan. Tämä asettaa vaatimuksia pakkausalgoritmeille ja monet nykyään helposti saatavat pakkausalgoritmikirjastot eivät suoraan tue satunnaishakuja ja -päivityksiä pakattuun dataan. Mikäli data on sopivasti klusteroituvaa, voidaan data pakata normaalilla pakkausalgoritmilla klustereittain, jolloin voidaan saavuttaa tietyntasoinen satunnaisluku/kirjoitustuki suhteellisen helposti. 4 Yhteenveto Perinteiset abstrahointimentelmät ovat hyvin tunnettuja keinoja ohjelman lähdekoodin koon pienentämiseksi. Ohjelmointikielten rakenteita tutkitaan edelleenkin aktiivisesti, mutta vaikka uusia menetelmiä muodostaa abstraktioita 3 2 Käytännössä bittikenttien käyttö C-kielessä on hankalaa, koska kääntäjät laventavat struct-määrittelyjen dataa niin, että muistioperaatiot ovat tehokkaampia. Ts. lopputuloksena näin määritelty struct-rakenne vie täsmälleen yhtä paljon tilaa kuin alkuperäinenkin. 3 Ks. esim. Haskell ja monadit 8

9 ja tiivimpää koodia onkin kehitetty viime aikoina, niin fokus näissä tutkimuksissa ei varsinaisesti ole ollut ohjelmakoodin tiivistäminen. Kääntäjätekniikan ja käskykantojen optimointi ohjelmakoodin pienentämiseksi on vieläkin aktiivinen tutkimusala, jolla on sovelluskohteita erityisesti sulautetuissa järjestelmissä, joissa muistiresurssit ovat niukat. Työpöytä- ja palvelinkäytössä ei nykyisillä tilaoptimoinneilla liene enää niin suurta merkitystä vaan tärkeämpää on ohjelmien tehokas suorittaminen. Siispä suoritusajan minimointi on nykyään merkittävästi tärkeämpää kuin tilankulutuksen. Sulautetuissa järjestelmissä lyhyempi koodi voi johtaa tehonkulutksen kannalta parempaan suoritukseen. Uskon, että tilaoptimoinnit tulevat olemaan erityisen tärkeitä lähinnä tällaisissa ympäristöissä niin kauan kuin akkuteknologia rajoittaa laitteiden käyttöaikaa merkittävästi. 9

10 Viitteet [1] [2] Gnu compiler collection. [3] The gnu compiler collection (documentation). onlinedocs/gcc-4.3.2/gcc/. [4] Improving arm code density and performance. pdfs/thumb-2coretechnologywhitepaper-final4.pdf. [5] Sloccount. [6] Harold Abelson and Gerald J. Sussman. Structure and Interpretation of Computer Programs. MIT Electrical Engineering and Computer Science. The MIT Press, second edition, July [7] Jon Bentley. Programming pearls: squeezing space. Commun. ACM, 27(5):416, [8] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. The MIT Press, September [9] Saumya K. Debray, William Evans, Robert Muth, and Bjorn De Sutter. Compiler techniques for code compaction. ACM Trans. Program. Lang. Syst., 22(2): , [10] Joe Lemieux. Introduction to arm thumb. shared/printablearticle.jhtml?articleid=

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 Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Luento

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

Lisätiedot

TIES325 Tietokonejärjestelmä. Jani Kurhinen Jyväskylän yliopisto Tietotekniikan laitos

TIES325 Tietokonejärjestelmä. Jani Kurhinen Jyväskylän yliopisto Tietotekniikan laitos TIES325 Tietokonejärjestelmä Jani Kurhinen Jyväskylän yliopisto Tietotekniikan laitos Kevät 2008 Luku 1 Tietokone abstraktina yksikkönä Tietokoneen asbtratiotasoa sen muotoisena kuin me sen tällä hetkellä

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

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

Lisätiedot

2 Konekieli, aliohjelmat, keskeytykset

2 Konekieli, aliohjelmat, keskeytykset ITK145 Käyttöjärjestelmät, kesä 2005 Tenttitärppejä Tässä on lueteltu suurin piirtein kaikki vuosina 2003-2005 kurssin tenteissä kysytyt kysymykset, ja mukana on myös muutama uusi. Jokaisessa kysymyksessä

Lisätiedot

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän e eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokone- järjestelmäj ä Käyttäjä Tietokonelaitteisto Oheislaitteet

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

11/20: Konepelti auki

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

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

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ä

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

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:

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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,

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

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

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

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,

Lisätiedot

Laiteläheinen C-kieli, yleistä

Laiteläheinen C-kieli, yleistä Laiteläheinen C-kieli, yleistä PUNOMO NETWORKS OY 23.8.2016 pva Johdanto Mikroprosessori, CPU, Central Prosessing Unit on komponentti, jonka toiminta on ohjattavissa muistiin tallennetuilla käskyillä.

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

Lisätiedot

.NET ajoympäristö. Juha Järvensivu 2007

.NET ajoympäristö. Juha Järvensivu 2007 .NET ajoympäristö Juha Järvensivu juha.jarvensivu@tut.fi 2007 Käännösprosessi C# lähdekoodi C# kääntäjä CILtavukoodi JITkäännös Ajettava natiivikoodi Kehitysympäristössä ohjelmoijan toimesta Ajonaikana.NET

Lisätiedot

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä olevilla komponenteilla? Voisiko jollakin ohjelmointikielellä

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Moderneissa grafiikkakorteissa hyödynnetään myös samanlaista toimintamallia

Moderneissa grafiikkakorteissa hyödynnetään myös samanlaista toimintamallia 1 Datan rinnakkaistamisessa siis eri prosessointiyksiköt suorittavat saman operaation annetulle datalle, joka pilkotaan prosessointiyksikköjen kesken. Pointti on siis se, että kyseessä ei ole tehtävien

Lisätiedot

Ohjelmointi 1. Kumppanit

Ohjelmointi 1. Kumppanit Ohjelmointi 1 Kumppanit November 20, 2012 2 Contents 1 Mitä ohjelmointi on 7 2 Ensimmäinen C#-ohjelma 9 2.1 Ohjelman kirjoittaminen......................... 9 A Liite 11 3 4 CONTENTS Esipuhe Esipuhe 5

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

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

Lisätiedot

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017

Lisätiedot

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000 Jakso 12 Yhteenveto Keskeiset asiat 1 Tavoitteet (4) Ymmärtää tietokonejärjestelmän keskeiset piirteet sillä suoritettavan ohjelman näkökulmasta Miten tietokonejärjestelmä suorittaa sille annettua ohjelmaa?

Lisätiedot

Tietokoneen rakenne: Harjoitustyö. Motorola MC68030 -prosessori

Tietokoneen rakenne: Harjoitustyö. Motorola MC68030 -prosessori kevät 2004 TP02S-D Tietokoneen rakenne: Harjoitustyö Motorola MC68030 -prosessori Työn valvojat: Seppo Haltsonen Pasi Lankinen RAPORTTI 13.5.2004 Sisällysluettelo sivu Tiivistelmä... 1 Lohkokaavio... 2

Lisätiedot

Käyttöjärjestelmät: prosessit

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ä

Lisätiedot

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. On arvioitu, että maailmassa on tällä hetkellä enemmän sulautettuja

Lisätiedot

Ohjelmistojen mallintaminen

Ohjelmistojen mallintaminen Ohjelmistojen mallintaminen - Mallit - Ohjelmiston kuvaaminen malleilla 31.10.2008 Harri Laine 1 Malli: abstraktio jostain kohteesta Abstrahointi: asian ilmaiseminen tavalla, joka tuo esiin tietystä näkökulmasta

Lisätiedot

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Tietokoneen muisti nyt ja tulevaisuudessa Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Yleisesti Muisti on yksi keskeisimmistä tietokoneen komponenteista Random Access Memory on yleistynyt

Lisätiedot

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden

Lisätiedot

Tietueet. Tietueiden määrittely

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

Lisätiedot

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi

Lisätiedot

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

C-ohjelmoinnin peruskurssi. Pasi Sarolahti C! C-ohjelmoinnin peruskurssi Pasi Sarolahti Mitä haluan oppia C-kurssilla? ja miksi? Tutustu lähimpään naapuriin Keskustelkaa miksi halusitte / jouduitte tulemaan kurssille 3 minuuttia è kootaan vastauksia

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset 815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

3. C-kieli sulautetun järjestelmän ohjelmointikielenä 07.01.2008, pva

3. C-kieli sulautetun järjestelmän ohjelmointikielenä 07.01.2008, pva 3. C-kieli sulautetun järjestelmän ohjelmointikielenä 07.01.2008, pva "Ohjelmointi ei ole mitään massojen huvia, vaikka sitä joskus helpoksi luullaankin. Joiltakin se sujuu luonnostaan, jotkut voivat jopa

Lisätiedot

Ongelma 1: Onko datassa tai informaatiossa päällekkäisyyttä?

Ongelma 1: Onko datassa tai informaatiossa päällekkäisyyttä? Ongelma 1: Onko datassa tai informaatiossa päällekkäisyyttä? 2012-2013 Lasse Lensu 2 Ongelma 2: Voidaanko dataa tai informaatiota tallettaa tiiviimpään tilaan koodaamalla se uudelleen? 2012-2013 Lasse

Lisätiedot

1. Olio-ohjelmointi 1.1

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

Lisätiedot

Laitteistonläheinen ohjelmointi

Laitteistonläheinen ohjelmointi Laitteistonläheinen ohjelmointi 4 op Luennoija: Pertti Lehtinen Luennot: Perjantai 12-14 TB104 Esitiedot: Mikroprosessorit Perusohjelmointikurssi Kurssin osat: luennot, harjoitustyö, tentti Materiaali:

Lisätiedot

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?

Lisätiedot

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö Algoritmit 1 Luento 2 Ke 11.1.2017 Timo Männikkö Luento 2 Algoritmin esitys Algoritmien analysointi Suoritusaika Asymptoottinen kertaluokka Peruskertaluokkia NP-täydelliset ongelmat Algoritmit 1 Kevät

Lisätiedot

Aktivaatiotietue. Yleiskäsite funktio (aliohjelma) -mekanismin tarvitsemille tiedoille. Kehysosoitin (%fp) missä tiedot ovat

Aktivaatiotietue. Yleiskäsite funktio (aliohjelma) -mekanismin tarvitsemille tiedoille. Kehysosoitin (%fp) missä tiedot ovat Aktivaatiotietue Yleiskäsite funktio (aliohjelma) -mekanismin tarvitsemille tiedoille Parametrit ja paluuarvo Paluuosoite Linkkitiedot Kehysosoitin (%fp) missä tiedot ovat Missä edellisen tiedot ovat (palattaessa

Lisätiedot

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

Lisätiedot

KYMENLAAKSON AMMATTIKORKEAKOULU

KYMENLAAKSON AMMATTIKORKEAKOULU 1 KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka Ole Halonen GNU-ohjelmointityökalut Linux-järjestelmät 206101310 Seminaarityö 22.11.2012 2 Sisällysluettelo 2 1 Johdanto

Lisätiedot

Osoitin ja viittaus C++:ssa

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

Lisätiedot

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9. Python linkit: Python tutoriaali: http://docs.python.org/2/tutorial/ Numpy&Scipy ohjeet: http://docs.scipy.org/doc/ Matlabin alkeet (Pääasiassa Deni Seitzin tekstiä) Matriisit ovat matlabin perustietotyyppejä.

Lisätiedot

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen ohjelmointiin Jukka Talvitie Valvoja: Professori Jorma Jormakka Paikka: TietoEnator oyj Ongelma Ideologia Lifebelt

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 2. Lukujen esittäminen ja aritmetiikka 2.1 Kantajärjestelmät ja lukujen esittäminen Käytettävät lukujoukot: Luonnolliset luvut IN = {0,1,2,3,... } Positiiviset kokonaisluvut

Lisätiedot

Dynaaminen kääntäminen ja Java HotSpot

Dynaaminen kääntäminen ja Java HotSpot Dynaaminen kääntäminen ja Java HotSpot Jukka Eskola Kimmo Kulovesi Tatu Säily Helsinki 11.4.2005 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö 1. Johdanto...1 1.1 JIT-kääntäjän ongelmat...2

Lisätiedot

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

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

Lisätiedot

Harjoitus 4 -- Ratkaisut

Harjoitus 4 -- Ratkaisut Harjoitus -- Ratkaisut 1 Ei kommenttia. Tutkittava funktio: In[15]:= f x : x 1 x Sin x ; Plot f x, x, 0, 3 Π, PlotRange All Out[159]= Luodaan tasavälinen pisteistö välille 0 x 3 Π. Tehdään se ensin kiinnitetyllä

Lisätiedot

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmointi 1 / 2009 syksy Tentti / 18.12 Tentti / 18.12 Vastaa yhteensä neljään tehtävään (huomaa että tehtävissä voi olla useita alakohtia), joista yksi on tehtävä 5. Voit siis valita kolme tehtävistä 1 4 ja tehtävä 5 on pakollinen. Vastaa JOKAISEN

Lisätiedot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

BL40A1810 Mikroprosessorit, harjoitus 1

BL40A1810 Mikroprosessorit, harjoitus 1 BL40A1810 Mikroprosessorit, harjoitus 1 Käytettävä laitteisto Kurssin opetuslaitteistona käytetään Legon MINDSTORMS laitteita, jonka pääosia ovat ohjelmoitava NXT-yksikkö (Atmel ARM7, 64k RAM, 256k Flash),

Lisätiedot

Teemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä?

Teemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä? Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi 27.1.2011 Tietokone suoritin (CPU) väylä tai väylät laiteohjaimet muiden koneiden kanssa Ethernet, modeemi,... laitteiden kanssa Levy, DVD, CD,

Lisätiedot

Rinnakkaistietokoneet luento S

Rinnakkaistietokoneet luento S Rinnakkaistietokoneet luento 5 521475S Silmukalliset ohjelmat Silmukat joissa ei ole riippuvuussyklejä voidaan vektoroida eli suorittaa silmukan vektorointi Jokainen yksittäinen käsky silmukan rungossa

Lisätiedot

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

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

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

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

Lisätiedot

7.4 Sormenjälkitekniikka

7.4 Sormenjälkitekniikka 7.4 Sormenjälkitekniikka Tarkastellaan ensimmäisenä esimerkkinä pitkien merkkijonojen vertailua. Ongelma: Ajatellaan, että kaksi n-bittistä (n 1) tiedostoa x ja y sijaitsee eri tietokoneilla. Halutaan

Lisätiedot

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017

Lisätiedot

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki PERL TIE-20306 Principles of Programming Languages Ryhmä 4: Joonas Lång & Jasmin Laitamäki 1. Johdanto Perl on ohjelmointikielten perhe, johon kuuluu Perl 5 ja Perl 6. Kielet ovat kuitenkin erilliset ohjelmointikielet

Lisätiedot

Tutoriaaliläsnäoloista

Tutoriaaliläsnäoloista Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus

Lisätiedot

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

1. Johdanto. 1.1. Algoritmeista ja tietorakenteista

1. Johdanto. 1.1. Algoritmeista ja tietorakenteista 1. Johdanto Tietojenkäsittelytieteen olennaisimpia osia on abstraktio: Käsiteltävään ongelmaan on löydettävä sopiva malli, jota voidaan käsitellä tietokoneella. Malliin liittyvät ongelmaan sopivat tietorakenteet

Lisätiedot

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms. Kokeellinen algoritmiikka (3 ov) syventäviä opintoja edeltävät opinnot: ainakin Tietorakenteet hyödyllisiä opintoja: ASA, Algoritmiohjelmointi suoritus harjoitustyöllä (ei tenttiä) Kirjallisuutta: Johnson,

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

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

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CS-A1111 14.9.2016 CS-A1111 Ohjelmoinnin peruskurssi Y1 14.9.2016 1 / 19 Oppimistavoitteet: tämän luennon jälkeen osaat kirjoittaa Python-ohjelman, joka pyytää käyttäjältä lukuja,

Lisätiedot

Luento 2: Tiedostot ja tiedon varastointi

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...

Lisätiedot

Digitaalitekniikan matematiikka Luku 13 Sivu 1 (10) Virheen havaitseminen ja korjaus

Digitaalitekniikan matematiikka Luku 13 Sivu 1 (10) Virheen havaitseminen ja korjaus Digitaalitekniikan matematiikka Luku 13 Sivu 1 (10) Digitaalitekniikan matematiikka Luku 13 Sivu 2 (10) Johdanto Tässä luvussa esitetään virheen havaitsevien ja korjaavien koodaustapojen perusteet ja käyttösovelluksia

Lisätiedot

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA: REFAKTOROINTI 2 (9) SEPA: REFAKTOROINTI 3 (9) VERSIOHISTORIA Version Date Author Description 0.1 2.12.2005 Erik Hakala Ensimmäinen

Lisätiedot

52480S TIETOKEARKKITEHTUURIT Tentti 6.2.1998

52480S TIETOKEARKKITEHTUURIT Tentti 6.2.1998 S Ä H K Ö T E K N I I K A N O S A S T O 548S TIETOKEARKKITEHTUURIT Tentti 6..998 Oulu 8..999. Selosta lyhyesti käsitteet: a. set associative memory b. conflict miss c. consistency of cached data d. access

Lisätiedot

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! eli... Hyvä kaava sanoo enemmän kuin,... tuhat riviä koodia!... sata riviä tekstiä!... kymmenen diagrammia! Sopimusohjelmointi

Lisätiedot

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1 Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,

Lisätiedot

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja

Lisätiedot

Kemian tekniikan kandidaattiohjelman ohjelmointikurssi (5 op)

Kemian tekniikan kandidaattiohjelman ohjelmointikurssi (5 op) Kemian tekniikan kandidaattiohjelman ohjelmointikurssi (5 op) Antti Karttunen ja Juhani Teeriniemi Osa 1 Ohjelmoinnin peruskäsitteitä, Python, Spyder-kehitysympäristö, tulostaminen, syötteen lukeminen,

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Hyvä ohjelmointitapa. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen

Lisätiedot

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? 2013-2014 Lasse Lensu 2 Systeemiohjelmat ovat tietokoneen laitteistoa lähellä olevia ohjelmia,

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto 811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien

Lisätiedot

Tietorakenteet ja algoritmit

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

Lisätiedot

Ohjelmistojen mallintaminen, mallintaminen ja UML

Ohjelmistojen mallintaminen, mallintaminen ja UML 582104 Ohjelmistojen mallintaminen, mallintaminen ja UML 1 Mallintaminen ja UML Ohjelmistojen mallintamisesta ja kuvaamisesta Oliomallinnus ja UML Käyttötapauskaaviot Luokkakaaviot Sekvenssikaaviot 2 Yleisesti

Lisätiedot

Muuttujien roolit Kiintoarvo cin >> r;

Muuttujien roolit Kiintoarvo cin >> r; Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,

Lisätiedot

Tietokone. Tietokone ja ylläpito. Tietokone. Tietokone. Tietokone. Tietokone

Tietokone. Tietokone ja ylläpito. Tietokone. Tietokone. Tietokone. Tietokone ja ylläpito computer = laskija koostuu osista tulostuslaite näyttö, tulostin syöttölaite hiiri, näppäimistö tallennuslaite levy (keskusyksikössä) Keskusyksikkö suoritin prosessori emolevy muisti levy Suoritin

Lisätiedot

Äärellisten automaattien ja säännöllisten kielten ekvivalenssi

Äärellisten automaattien ja säännöllisten kielten ekvivalenssi Äärellisten automaattien ja säännöllisten kielten ekvivalenssi Osoitamme seuraavan keskeisen tuloksen: Lause 1.8: [Sipser Thm. 1.54] Kieli on säännöllinen, jos ja vain jos jokin säännöllinen lauseke esittää

Lisätiedot

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu

Lisätiedot

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23 Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23 1 Sisällys 1. Johdanto...3 2. Testiohjelma...3 2.1. Testi 1: Raaka funktiokutsu...3 2.2. Testi 2: Yhteenlaskutesti...3 2.3. Testi

Lisätiedot

13/20: Kierrätys kannattaa koodaamisessakin

13/20: Kierrätys kannattaa koodaamisessakin Ohjelmointi 1 / syksy 2007 13/20: Kierrätys kannattaa koodaamisessakin Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy

Lisätiedot

Tietorakenteet ja algoritmit

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

Lisätiedot

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa Tietojen tallennusrakenteet Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa tiedot tiedostoon kuuluvista lohkoista esim. taulukkona, joka voi muodostua ketjutetuista

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot