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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ohjelman arkkitehtuurista.

ohjelman arkkitehtuurista. 1 Legacy-järjestelmällä tarkoitetaan (mahdollisesti) vanhaa, olemassa olevaa ja käyttökelpoista ohjelmistoa, joka on toteutettu käyttäen vanhoja menetelmiä ja/tai ohjelmointikieliä, joiden tuntemus yrityksessä

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

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

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

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

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

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

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

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

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

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

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

TKT224 KOODIN KOON OPTIMOINTI

TKT224 KOODIN KOON OPTIMOINTI - 1 - Laboratoriotyö TKT224 Oppimäärä: Ammattiaineiden laboraatiot Kurssi: Tietokonetekniikan laboraatiot Laboratoriotyö: TKT224 KOODIN KOON OPTIMOINTI Teoriakurssi, johon työ liittyy: Työn laatijat: T.Laitinen

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

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

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

1. Keskusyksikön rakenne

1. Keskusyksikön rakenne 1. Keskusyksikön rakenne Kuvassa on esitelty TTK-91 esimerkkikoneen keskusyksikkö. Oikeiden tietokoneiden keskusyksiköt ovat luonnollisesti monimutkaisempia, mutta tämä riittää oikein mainiosti asian havainnollistamiseen.

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

Turvakriittisen projektin menetelmät ja työkalut

Turvakriittisen projektin menetelmät ja työkalut Turvakriittisen projektin menetelmät ja työkalut 1. Vaatimushallinta Vaatimushallintaan kohdistuu turvaluokitelluissa projekteissa paljon odotuksia. Etenkin jäljitettävyys vaatimuksiin, testaukseen ja

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

Pikaintro käyttöjärjestelmiin

Pikaintro käyttöjärjestelmiin Tietotekniikan laitos Jyväskylän yliopisto TIES406 Tietotekniikan opintojen aktivointi, luento 17.8.2011 Outline Tietokonelaitteisto 1 Tietokonelaitteisto 2 3 4 Outline Tietokonelaitteisto 1 Tietokonelaitteisto

Lisätiedot

Common Language Runtime

Common Language Runtime hyväksymispäivä arvosana arvostelija Common Language Runtime Jukka Katajisto Helsinki 16.4.2005 Ohjelmointikielten kääntäjät -kurssin seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö

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

TIE448 Kääntäjätekniikka, syksy 2009. Antti-Juhani Kaijanaho. 7. joulukuuta 2009

TIE448 Kääntäjätekniikka, syksy 2009. Antti-Juhani Kaijanaho. 7. joulukuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 7. joulukuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio Arvostelukappale

Lisätiedot

Hieman linkkejä: http://cs.stadia.fi/~kuivanen/linux/kom.php, lyhyt ohje komentoriviohjelmointiin.

Hieman linkkejä: http://cs.stadia.fi/~kuivanen/linux/kom.php, lyhyt ohje komentoriviohjelmointiin. Linux-harjoitus 9 Linuxin mukana tulevat komentotulkit (mm. bash, tcsh, ksh, jne ) sisältävät ohjelmointikielen, joka on varsin tehokas ja ilmaisuvoimainen. Tähän yhdistettynä unix-maailmasta tutut tehokkaat

Lisätiedot

Asiakas ja tavoite. Tekninen toteutus

Asiakas ja tavoite. Tekninen toteutus Asiakas ja tavoite Heikieli on vuonna 2015 perustettu yhden hengen asiantuntijayritys, joka tarjoaa käännös- ja oikolukupalveluita englannista ja saksasta suomeksi. Freelance-kääntäjiä on Suomessa paljon,

Lisätiedot

ASCII-taidetta. Intro: Python

ASCII-taidetta. Intro: Python Python 1 ASCII-taidetta All Code Clubs must be registered. Registered clubs appear on the map at codeclubworld.org - if your club is not on the map then visit jumpto.cc/18cplpy to find out what to do.

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

A274101 TIETORAKENTEET JA ALGORITMIT

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

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

Digikuvan peruskäsittelyn. sittelyn työnkulku. Soukan Kamerat 22.1.2007. Soukan Kamerat/SV

Digikuvan peruskäsittelyn. sittelyn työnkulku. Soukan Kamerat 22.1.2007. Soukan Kamerat/SV Digikuvan peruskäsittelyn sittelyn työnkulku Soukan Kamerat 22.1.2007 Sisält ltö Digikuvan siirtäminen kamerasta tietokoneelle Skannaus Kuvan kääntäminen Värien säätö Sävyjen säätö Kuvan koko ja resoluutio

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op FT Ari Viinikainen Tietokoneen rakenne Keskusyksikkö, CPU Keskusmuisti Aritmeettislooginen yksikkö I/O-laitteet Kontrolliyksikkö Tyypillinen Von Neumann

Lisätiedot

Luento 7. T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Luento 7. T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä Luento 7 T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1 Luennoitsija: Otto Seppälä Kurssin WWW: http://www.cs.hut.fi/opinnot/t-106.1240/s2007 Suunnitelmista Yleistaso oli

Lisätiedot

Intel Threading Building Blocks

Intel Threading Building Blocks Intel Threading Building Blocks Markku Vajaranta Esko Pekkarinen TBB Pähkinänkuoressa C++ luokkamallinen rinnakkaisuus Abstrahoi rinnakkaisuutta korkean tason tehtävät (tasks) ja niiden skedulointi suuri

Lisätiedot

WINE API ja Virtualisointiohjelmistot

WINE API ja Virtualisointiohjelmistot WINE API ja Virtualisointiohjelmistot Yleistä Winestä Ohjelmisto, joka mahdollistaa Windows -pohjaisten ohjelmien käytön kuissa käyttöjärjestelmissä Toimii yhteensopivuuskerroksena ohjelman ja käyttöjärjestelmän

Lisätiedot

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++ JAVA alkeet JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++ ja Javascriptin kanssa. Huom! JAVA ja JavaScript eivät silti ole sama asia, eivätkä edes sukulaiskieliä.

Lisätiedot

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include 15: 16: int main() 17: {

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: { Osa I 2. oppitunti C++-ohjelman osat Ennen kuin menemme yksityiskohtaisemmin sisälle C++-luokkiin, -muuttujiin jne, katsokaamme ensin, millaisista osista C++-ohjelma koostuu. Tämän tunnin aikana opit seuraavat

Lisätiedot

14/20: Keittokirja I

14/20: Keittokirja I Ohjelmointi 1 / syksy 2007 14/20: Keittokirja I Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/13 Tämän luennon

Lisätiedot

SISÄLLYS sisällys 1 Tietokoneen toimintaperiaate ja käyttö 2 Tietokoneen historia 3 Tietokoneen rakenteen ja toiminnan perusteet

SISÄLLYS sisällys 1 Tietokoneen toimintaperiaate ja käyttö 2 Tietokoneen historia 3 Tietokoneen rakenteen ja toiminnan perusteet SISÄLLYS 1 2 3 4 Tietokoneen toimintaperiaate ja käyttö 14 1.1 Mikä tietokone on? 14 1.2 Tieteen ja toimiston koneista yleistietokoneeseen 15 1.3 Mekaanisista ja sähköisistä laitteista sulautettuihin tietokoneisiin

Lisätiedot

Intel Pentium Pro -prosessori. tietokonearkkitehtuurit, syksy -96 Ari Rantanen

Intel Pentium Pro -prosessori. tietokonearkkitehtuurit, syksy -96 Ari Rantanen Intel Pentium Pro -prosessori tietokonearkkitehtuurit, syksy -96 Ari Rantanen Tarkasteltavat aiheet Katsaus Pentium Pro:n ominaisuuksiin Käskyn suoritus Pentium Pro:n liukuhihnalla Pentium Pro:n suorituskyky

Lisätiedot

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään Ohjelmointi Ohjelmoinnissa koneelle annetaan tarkkoja käskyjä siitä, mitä koneen tulisi tehdä. Ohjelmointikieliä on olemassa useita satoja. Ohjelmoinnissa on oleellista asioiden hyvä suunnittelu etukäteen.

Lisätiedot

Matematiikka ja teknologia, kevät 2011

Matematiikka ja teknologia, kevät 2011 Matematiikka ja teknologia, kevät 2011 Peter Hästö 3. helmikuuta 2011 Matemaattisten tieteiden laitos Sisältö Kurssi koostuu kuudesta (seitsemästä) toisistaan riippumattomasta luennosta. Aihepiirit ovat:

Lisätiedot

Tekstieditorin käyttö ja kuvien käsittely

Tekstieditorin käyttö ja kuvien käsittely Tekstieditorin käyttö ja kuvien käsittely Teksti- ja kuvaeditori Useassa Kotisivukoneen työkalussa on käytössä monipuolinen tekstieditori, johon voidaan tekstin lisäksi liittää myös kuvia, linkkejä ja

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 3 Tietokoneen ohjaaminen Tietokone kehitettiin mekaanisista laskukoneista suorittamaan erilaisia toimintoja

Lisätiedot

Käyttöjärjestelmät: poissulkeminen ja synkronointi

Käyttöjärjestelmät: poissulkeminen ja synkronointi Käyttöjärjestelmät: poissulkeminen ja synkronointi 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

Lisätiedot

IR-lämpömittarityypit

IR-lämpömittarityypit IR-lämpömittarityypit Kokonaissäteilypyrometrit Laaja aallonpituusalue (esim. 1-100 µm) häiriöaltis Hidas (vaste 1-3 s) Osittaissäteilypyrometrit Kapea aallonpituusalue (esim. 0,5-1,1 µm) vähemmän häiriöaltis

Lisätiedot

Tietojenkäsittelyn perusteet 2. Lisää käyttöjärjestelmistä

Tietojenkäsittelyn perusteet 2. Lisää käyttöjärjestelmistä Tietojenkäsittelyn perusteet 2 Lisää käyttöjärjestelmistä 2011-02-09 Leena Ikonen 1 Systeemiohjelmat Systeemiohjelmiin kuuluvat Kääntäjät ja tulkit (+debuggerit) Käyttöjärjestelmä Linkittäjät Lataajat

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

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

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja.

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja. IsoInt Tietokoneiden muisti koostuu yksittäisistä muistisanoista, jotka nykyaikaisissa koneissa ovat 64 bitin pituisia. Muistisanan koko asettaa teknisen rajoituksen sille, kuinka suuria lukuja tietokone

Lisätiedot

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b Pythonin Kertaus Cse-a1130 Tietotekniikka Sovelluksissa Versio 0.01b Listat 1/2 esimerkkejä listan peruskäytöstä. > lista=['kala','kukko','kissa','koira'] ['kala','kukko','kissa','koira'] >lista.append('kana')

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015

815338A Ohjelmointikielten periaatteet 2014-2015 815338A Ohjelmointikielten periaatteet 2014-2015 X Skriptiohjelmointi Sisältö 1. Johdanto 2. Skriptikielten yleispiirteitä 3. Python 815338A Ohjelmointikielten periaatteet, Skriptiohjelmointi 2 X.1 Johdanto

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

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

Lisätiedot

Palvelut. Sulautetut järjestelmät Luku 2 Sivu 1 (??) Sulautetut käyttöjärjestelmät

Palvelut. Sulautetut järjestelmät Luku 2 Sivu 1 (??) Sulautetut käyttöjärjestelmät Sulautetut järjestelmät Luku 2 Sivu 1 (??) Palvelut Käyttöjärjestelmän tehtävänä on tarjota ohjelmoijalla erilaisia palveluita Tyypillisin palvelu, jota sulautetut käyttöjärjestelmät tarjoavat on prosessien

Lisätiedot

JOHDATUS TIETOKONETEKNIIKKAAN. Tietokoneiden loogisten toimintaperiaatteiden kuvaus kuvitteellisen tietokoneen avulla

JOHDATUS TIETOKONETEKNIIKKAAN. Tietokoneiden loogisten toimintaperiaatteiden kuvaus kuvitteellisen tietokoneen avulla JOHDATUS TIETOKONETEKNIIKKAAN Tietokoneiden loogisten toimintaperiaatteiden kuvaus kuvitteellisen tietokoneen avulla (Evoluutio 0.9) www.naturalprogramming.com Kari Laitinen SISÄLTÖ: Johdanto... 3 Kuvitteellisen

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

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

Lisätiedot

Ohjelmien analysointi. ER-kaaviot

Ohjelmien analysointi. ER-kaaviot Ohjelmien analysointi Ohjelmien kuvaaminen kaavioilla ohjelmien ymmärtäminen kaavioiden avulla kaavioiden tuottaminen ohjelmasta Erilaisia kaaviotyyppejä: ER-kaaviot, tilakaaviot, UML-kaaviot tietohakemisto

Lisätiedot

Käyttöjärjestelmät. Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi

Käyttöjärjestelmät. Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Käyttöjärjestelmät 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 Kurssin sisältö Johdanto, historiaa

Lisätiedot

Ohjelmointi Linuxissa. Sisällysluettelo. 1. Mitä tarvitaan sovellusten tuottamiseen? Tehnyt: Antti Martikainen (1300698)

Ohjelmointi Linuxissa. Sisällysluettelo. 1. Mitä tarvitaan sovellusten tuottamiseen? Tehnyt: Antti Martikainen (1300698) Ohjelmointi Linuxissa Tehnyt: Antti Martikainen (1300698) Sisällysluettelo 1. Mitä tarvitaan sovellusten tuottamiseen?...1 2. GNU Toolchain...2 3. Tekstieditorit...2 4. Hello world-sovelluksen luominen

Lisätiedot

LAS-TIEDOSTON SISÄLTÖ LIITE 2/1

LAS-TIEDOSTON SISÄLTÖ LIITE 2/1 LAS-TIEDOSTON SISÄLTÖ LIITE 2/1 LAS-TIEDOSTON SISÄLTÖ Las-tiedoston version 1.4 mukainen runko koostuu neljästä eri lohkosta, ja jokaiseen lohkoon voidaan tallentaa vain standardissa sovittua tietoa ja

Lisätiedot

17/20: Keittokirja IV

17/20: Keittokirja IV Ohjelmointi 1 / syksy 2007 17/20: Keittokirja IV Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/10 Tavoitteita

Lisätiedot

Uudelleenkäytön jako kahteen

Uudelleenkäytön jako kahteen Uudelleenkäyttö Yleistä On pyritty pääsemään vakiokomponenttien käyttöön Kuitenkin vakiokomponentit yleistyneet vain rajallisilla osa-alueilla (esim. windows-käyttöliittymä) On arvioitu, että 60-80% ohjelmistosta

Lisätiedot

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Kieliversiointityökalu Java-ohjelmistoon. Ohje Kieliversiointityökalu Java-ohjelmistoon Ohje 2/6 SISÄLLYSLUETTELO 1 YLEISTÄ OHJELMASTA... 3 2 PÄÄ-IKKUNA...4 3 YLÄVALIKKO... 4 3.1 TIEDOSTO... 4 3.2 TOIMINTO... 4 3.3 ASETUKSET... 5 3.4 OHJE... 5 4 VÄLILEHDET...5

Lisätiedot

Suomalaiset ohjelmointikielet

Suomalaiset ohjelmointikielet Suomalaiset ohjelmointikielet Timo Lilja TKK 6. 10. 2009 Timo Lilja (TKK) Suomalaiset ohjelmointikielet 6. 10. 2009 1 / 24 Sisältö 1 Kieli Rakenteet Makrot Yhteenveto Lähteet 2 Shines Kieli Esimerkki 3

Lisätiedot

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. TIETOKONEOHJELMIEN RAKENNE Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. Teollisuusautomaation ohjelmiin on lainattu runsaasti perinteisen

Lisätiedot

Software product lines

Software product lines Thomas Gustafsson, Henrik Heikkilä Software product lines Metropolia Ammattikorkeakoulu Insinööri (AMK) Tietotekniikan koulutusohjelma Asiantuntijateksti 17.11.2013 Sisällys 1 Johdanto 1 2 Software product

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu 832A Tietorakenteet ja algoritmit, 204-205, Harjoitus 7, ratkaisu Hajota ja hallitse-menetelmä: Tehtävä 7.. Muodosta hajota ja hallitse-menetelmää käyttäen algoritmi TULOSTA_PUU_LASKEVA, joka tulostaa

Lisätiedot

Datatähti 2009 -alkukilpailu

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

Lisätiedot

OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012

OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012 OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012 Luento 6: Tiedon esittäminen tietokoneessa, osa 1 Tekijät: Antti Virtanen, Timo Lehtonen, Matti Kujala, Kirsti Ala-Mutka, Petri M. Gerdt et al. Luennon

Lisätiedot

Kontrollilaitteet. Arsenaali

Kontrollilaitteet. Arsenaali Arsenaali Kontrollilaitteet Tietokonepeleissä käytettäviä kontrollilaitteita on valtava määrä Kaikilla alustoilla, joilla pelejä pelataan on jokin vakio kontrolleri PC: Hiiri ja näppäimistö Konsolit: Controller

Lisätiedot