Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

Koko: px
Aloita esitys sivulta:

Download "Ohjelmointikielten periaatteet Syksy 2004. Antti-Juhani Kaijanaho"

Transkriptio

1 Ohjelmointikielten periaatteet Syksy 2004 Antti-Juhani Kaijanaho

2 Copyright c 2002, 2004 Antti-Juhani Kaijanaho Tästä teoksesta saa valmistaa kappaleita ja sen saa saattaa yleisön saataviin, muuttamattomana tai muutettuna, käännöksenä tai muunnelmana, toisessa kirjallisuus- tai taidelajissa taikka toista tekotapaa käyttäen, mikäli kaikki seuraavat ehdot tulevat täytetyksi: (1) Kun teoksesta valmistetaan muutettu kappale tai muutettu teos kokonaan tai osittain saatetaan yleisön saataviin, on teoksen muuttajan nimi, salanimi tai nimimerkki ilmoitettava tekijän nimen rinnalla. (2) Kun teoksesta valmistetaan muutettu kappale tai muutettu teos kokonaan tai osittain saatetaan yleisön saataviin, on pidettävä huoli, ettei muutettua teosta voi hyvällä tahdolla sekoittaa alkuperäiseen. (3) Teoksen tekijän nimeä ei saa ilman hänen eri lupaansa käyttää teoksen markkinoinnissa. Erikseen korostettakoon, että teoksen tekijä ei vaadi maksua teoskappaleiden valmistamisesta tai teoksen saattamisesta yleisön saataviin. Teoskappaleen valmistaja tai teoksen yleisön saataviin saattaja saa periä tästä haluamansa maksun. Tekijänoikeuslaki(404/1961) 3 1 mom: Kun teoksesta valmistetaan kappale tai teos kokonaan tai osittain saatetaan yleisön saataviin, on tekijä ilmoitettava sillä tavoin kuin hyvä tapa vaatii.

3 Sisältö Esipuhe v Luku1. Johdanto 1 1. Kieltenjaotteluja 1 2. Kielenvalinta 6 3. Ohjelmointikieltensuunnitteluperiaatteita 7 4. Kielenmäärittely 8 5. Toteutustekniikoista 10 Osa 1. Imperatiivinen ohjelmointi 11 Luku 2. Konekielinen ohjelmointi Konekielet Symbolisetkonekielet Abstraktitkoneet Neloskielenidea Systeemikutsut Konekielelläohjelmoinnista 24 Luku3. Suoraviivaohjelmat Suoraviivaohjelmanelementit Abstraktisyntaksi Denotationaalinensemantiikka Tyyppijärjestelmä Konkreettikielioppi Toteutuksesta 57 Luku 4. Kontrollivuon ohjaus 61 Luku 5. Epädeterministinen ohjelmointi 63 Luku6. Samanaikaisuus Jaettumuisti Erilliset kommunikoivat prosessit 65 Luku7. Aliohjelma-abstraktio 67 Osa 2. Applikatiivinen ohjelmointi 69 Luku8. Funktioabstraktio 71 iii

4 iv SISÄLTÖ Luku9. Tyypitys 73 Luku 10. Rakenteiset arvot 75 Luku11. Synteesi 77 Osa 3. Laajuuden hallinta 79 Luku 12. Abstraktit tietorakenteet ja modulit 81 Luku13. Olioabstraktio 83 Luku14. Polymorfismi 85 Kirjallisuutta 87 Liite A. Neloskoneen systeemikutsut 89 Liite B. Ohjelmointikielten historia Kaksi ensimmäistä sukupolvea: ennen vuotta Automaattinen ohjelmointi ja ohjelmointikielten synty: Baabelin torni: 1960-luku Modernismi:1970-luku Postmodernismi:1980-luku Internetin nousu: 1990-luku Sukupolvista 100 Liite C. Semanttiset alueet Tuloalueet Summa-alueet Funktioalueet 106 Liite D. ALKEIS-suoran kääntäjä Pääohjelma Selain Apuluokat Lauseet Tyypit Lausekkeenjäsennin Primäärilausekkeet Operaattorilausekkeet Muunnoslausekkeet 147

5 Esipuhe Tämä moniste on toinen yritykseni hahmottaa ohjelmointikielten alaa syventävän yliopistokurssin kokoiseksi suupalaksi. Ensimmäiseni kirjoitin syksyllä 2002 opettaessani Jyväskylän yliopiston ohjelmistotekniikan opiskelijoille Ohjelmointikielten periaatteita. Jotain tuosta monisteesta on jäljellä tässä monisteessa, mutta suurin osa on kokonaan uusiksi kirjoitettu, pääosin siksi, että olen tämän kahden vuoden kuluessa oppinut niin paljon uutta alasta. Toisaalta tuo moniste oli aina tarkoitukseni kirjoittaa uusiksi, tosin kuvittelin pääseväni tästä hommasta helpolla, toimittamalla vanhan tekstini luettavammaksi. Tämä moniste on kirjoitettu Ohjelmointikielten periaatteet-opintojakson tarpeisiin, kun luennoin sen toisen kerran syksyllä Kirjoitan tätä kolmenlaisten opiskelijoiden tarpeisiin: (1) Ohjelmistotekniikan tai yleisemmin tietotekniikan syventäviä opintoja tekevä opiskelija etsinee tästä monisteesta (2) Jokunen opiskelija on varmaankin kiinnostunut oman ohjelmointikielen suunnittelusta. Jokaiselta monisteen lukijalta oletan muutamia taitoja ja tietoja: (1) Ohjelmointitaito ja-kokemus on välttämätön. Tämä moniste ei opeta ohjelmointia! (2) Oletan, että lukijoille on tämän ajan valtaohjelmointikielistä ainakin Java tuttu. Jonkin verran käytän esimerkkeinä myös muita C-sukuisia kieliä(c, C++, C#, Cyclone). (3) Yliopistomatematiikan peruskäsitteitä käytän vapaasti olettaen, että ne eivät tuota lukijoille ongelmia. Tällaisia käsitteitä ovat joukko ja funktio sekä niiden perusoperaatiot. Lisäksi oletan, että lause- ja predikaattilogiikan alkeet ovat lukijoille tuttuja. XXX Christopher Strachey on kirjoittanut(lainaus Hoaren[11]): Ithaslongbeenmypersonalviewthattheseparationof practical and theoretical work is artificial and injurious. Muchofthepracticalworkdoneincomputing,bothin software and in hardware design, is unsound and clumsybecausethepeoplewhodoithavenotanyclearunderstanding of the fundamental design principles of their v

6 vi ESIPUHE work. Most of the abstract mathematical and theoretical workissterilebecauseithasnopointofcontactwithreal computing. Kuten Hoare, myös minä jaan tämän näkemyksen, ja senpä vuoksi tämä moniste käsittelee aihettaan sekä teorian että käytännön näkökulmasta. Pääosa luentomonisteesta jakaantuu lukuihin, joista jokaisessa tarkastellaan yhtä tätä monistetta varten kehitettyä ohjelmointikieltä. Kukin ohjelmointikieli määritellään formaalisti, ja kullekin niistä rakennetaan yksinkertainen kääntäjä. Nämä kielet muodostavat ALKEIS-kielten perheen. Esiversioita ovat lukeneet: Hilkka Heikkilä Markus Inkeroinen Tommi Kärkkäinen Ville Tirronen Antti Vuorenmaa Kiitokset myös kaikille vuoden 2002 kurssin opiskelijoille, erityisesti Joni Töyrylälle, joka antoi kurssin aikana tekemänsä muistiinpanot käyttööni.

7 LUKU 1 Johdanto HowmanytimesdoIhavetotellyou? Therighttoolfortherightjob! Scotty elokuvassa Star Trek V Ohjelmointi on ongelmien ratkaisemista. Asiaa voi katsoa kahdelta kannalta: voi keskittyä ymmärtämään ongelmaa tai ratkaisumalleja. Voidaan ajatella, että maailma jakautuu kahteen osaan, ongelma-avaruuteen ja ratkaisuavaruuteen. Ongelma-avaruus koostuu kaikista mahdollisista ongelmista, ja ratkaisuavaruus koostuu kaikista mahdollisista ratkaisuista. Ohjelmoijan tehtävänä on siirtää ongelma(joka elää ongelma-avaruudessa) ratkaisuavaruuteen, jolloin siitä tulee ratkaisu. Ohjelmointikieli on ohjelmoijan pääasiallisin työkalu, ja kielen toteutus(kääntäjä tai tulkki) auttaa ohjelmoijaa ratkaisun luomisessa: kielen ominaisuudet ratkaisevat, kuinka syvälle ratkaisuavaruuteen ohjelmoijan tulee ongelmaansa viedä suunnitteluvaiheessa ja mistä lähtien kielen toteutus tekee sen ohjelmoijan puolesta. 1. Kielten jaotteluja Ohjelmointikieliä on mielettömän paljon. Jonkinlaista järjestystä tähän suureen joukkoon saadaan erilaisilla jaotteluilla Sukupolvet. Eräs tunnettu mutta nykyisin vähämerkityksinen jaottelu jakaa kielet eri sukupolviin: Ensimmäinen sukupolvi: koostuu konekielistä. Konekielellä tarkoitan tässä nyt ohjelman sitä muotoa, jonka kone pystyy sellaisemaan lukemaan. Seuraavassa on Hello Worldohjelma erään tietokoneen konekiellä(esitettynä 16-lukujärjestelmässä tavujonona): 1

8 2 1. JOHDANTO Käytännössä konekieliset ohjelmat suunniteltiin kirjoittamalla ohjelmat ensin paperilla symbolisesti, käyttämällä konekäskyistä muistikasnimiä. Myös vuokaavioita saatettiin harrastaa monimutkaisten ohjelmien kirjoittamisessa. Konetta varten ohjelma käännettiin käsin konekielelle. Ensimmäinen sukupolvi oli vallalla 1940-luvun lopulta 1950-luvun alkupuolelle. Toinen sukupolvi: syntyi, kun keksittiin, että voidaan kirjoittaa ohjelma suorittamaan yllämainittu käännöstyö muistikkaista konekielelle. Toinen sukupolvi koostuu siis symbolisista konekielistä. Edellä esitetty Hello World-ohjelma käännettiin seuraavasta symbolisella konekielellä kirjoitetusta ohjelmasta:! Toinen sukupolvi oli vallalla 1950-luvun puoleenväliin asti. Kolmas sukupolvi: syntyi vuonna 1955, kun FORTRAN kehitettiin. Lähes kaikki nykyisin ohjelmointikieliksi kutsumamme kielet ovat kolmannen sukupolven kieliä. Neljäs ja viides sukupolvi: esiintyvät puheissa toisinaan, mutta niiden sisältö riippuu täysin puhujasta. Tavallisimmin neljännen tai viidennen sukupolven kielellä tarkoitetaan joko sovelluskehittimiä(delphi ym.) tai ohjelmoitavia sovellusohjelmia(excel ym.) Paradigmat. Edward Sapir ja Benjamin Whorf esittivät viime vuosisadan alkupuolella kielitieteellisen hypoteesin, joka tunnetaan nykyisin nimellä Sapirin Whorfin hypoteesi. Sen heikompi muoto, johon nykyisetkin kielitieteilijät enemmän tai vähemmän uskovat, kuuluu: Kieli vaikuttaa ajatteluun. Myös ohjelmoinnin yhteydessä tämä heikompi muoto on totta: se, mitä ohjelmointikieltä osaa, vaikuttaa siihen, miten ohjelmointiongelmia ryhtyy ratkaisemaan. Kaikki kielet eivät ole tässä suhteessa samanarvoisia: esimerkiksi Pascalin ja C:n tukema ajattelutapa on niin samanlainen, että kummastakin kielestä voi varsin vähällä vaivalla siirtyä toiseen. Vastaavanlainen samankaltaisuus pätee, tosin vähemmässä määrin, myös C++:aan ja Javaan. Jotkin kielet puolestaan suosivat niin erilaisia

9 1. KIELTEN JAOTTELUJA 3 ajattelutapoja, että ne tuntuvat aluksi aivan eri maailmoilta, eikä toisen osaamisesta ole kovin suurta apua toisen osaamisessa. Ajatustavoiltaan läheisten kielten katsotaan yleensä kuuluvan samaan kieliparadigmaan, mutta niiden väliset rajapyykit eivät ole useinkaan kovin selvät. Kieliparadigmoille sukua ovat ohjelmointiparadigmat, tosin aika usein näiden välistä eroa ei nähdä(myös tämän kirjoittaja on ne monesti sekoittanut!). Kukin ohjelmointiparadigma on oikeastaan idealisoitu versio niistä ajattelutavoista, joita vastaava kieliparadigma suosii. Alan Perlis[25] kirjoitti kaksi vuosikymmentä sitten: A language that doesn t affect the way you think about programming, is not worth knowing. Minä kääntäisin tämän väitteen toisin päin: A language that affects the way you think about programming is worth knowing. Itse asiassa väittäisin, että jokaisen ohjelmointiin vakavissaan suhtautuvan tulisi tuntea ainakin pari-kolme eri kieliparadigmoihin kuuluvaa kieltä eli oikeastaan pari-kolme eri ohjelmointiparadigmaa. Ohjelmointiparadigmoiksi lasketaan tavallisimmin ainakin seuraavat(huomaa, että nämä paradigmat eivät ole toisistaan erillisiä, vaan ne menevät osittain päällekkäin): Imperatiivisen ohjelmoinnin:(käskyohjelmoinnin) juuret ovat syvällä ratkaisuavaruudessa, von Neumannin arkkitehtuurin perusrakenteissa. Imperatiivinen ohjelmoija näkee maailman joukkona muistipaikkoja, joita muutellaan yksitellen von Neumannin pullonkaulaa pitkin. Imperatiiviselle ohjelmoinnille tyypillistä on tiedon muuttaminen in place(sitä kopioimatta), silmukoiden runsas käyttö, ohjelmakoodin korostuminen sekä käskymetafora. Deklaratiivisen ohjelmoinnin:(kuvausohjelmoinnin) juuret ovat ongelma-avaruudessa, ongelmien täsmällisessä kuvaamisessa yleensä matematiikan keinoin. Sen taustalla on yleensä vahva matemaattinen teoria, joka on sovitettu ohjelmoinnin tarpeisiin. Deklaratiiviselle ohjelmoinnille tyypillistä on tiedon muuttumattomuus(muutos tehdään tekemällä uusi, erilainen kopio), rekursion runsas käyttö, tietorakenteiden korostuminen sekä laskentametafora. Proseduraalisen ohjelmoinnin:(toiminto-ohjelmoinnin) perusabstraktio on aliohjelma. Proseduraalinen ohjelmoija keskittyy etsimään koodistaan tai suunnitelmastaan toimintoja, jotka toistuvat, ja tekee niistä aliohjelmia. Proseduraalinen ohjelmointi esiintyy yleensä imperatiivisen ohjelmoinnin kanssa yhdessä.

10 4 1. JOHDANTO Olio-ohjelmointi: näkee kaiken olioina ja niiden välisenä kommunikaationa. Olio-ohjelmoija keskittyy hahmottamaan olioita ja niiden välisiä suhteita. Myös olio-ohjelmointi on yleensä imperatiivista ohjelmointia, vaikka deklaratiivinen olioohjelmointi ei olekaan käsitteenä mahdoton ajatus. Funktio-ohjelmointi:(funktionaalinen ohjelmointi) on eräässä mielessä proseduraalisen ohjelmoinnin yleistys. Funktioohjelmoija näkee ohjelman(matemaattisena) funktiona. Funktioohjelmalle tyypillisiä ilmaisukeinoja ovat funktionaalit(funktiot, jotka ottavat toisia funktioita parametrikseen). Funktioohjelmointi lasketaan perinteisesti deklaratiiviseksi ohjelmoinniksi, vaikka oikeastaan deklaratiivinen funktio-ohjelmointi onkin harvinaisempaa kuin imperatiivinen funktio-ohjelmointi, jossa funktiot ovat oikeastaan vain yleistettyjä aliohjelmia. Logiikkaohjelmointi: perustuu ajatukseen, että looginen päättely voidaan mekanisoida(joka pitää paikkansa vain rajoitetusti). Logiikkaohjelmoija näkee ohjelman loogisena väitteenä, joka pitää todistaa. Logiikkaohjelma koostuu kyseisen väitteen muotoilusta sekä niiden oletusten muotoilusta, joita päättelyssä voidaan käyttää. Puhtaimmillaan logiikkaohjelmointi on täysin deklaratiivista, mutta käytännössä logiikkaohjelmointia harrastetaan myös imperatiivisesti, jossa päättelysäännöt vastaavat aliohjelmia. Olio-ohjelmoinnista ja funktio-ohjelmoinnista on kummastakin tiedekunnassamme laudaturkurssi(tjtl33 ja TIE328). Ohjelmointikielet jaotellaan usein myös yllämainitttuihin paradigmalokeroihin. Tämä on kuitenkin varsin ongelmallista. Jokaisella ohjelmointikielellä on omin paradigmansa, jota se tukee parhaiten, mutta hyvin monet kielet ovat aidosti moniparadigmakieliä siinä mielessä, että niitä voidaan käyttää mainiosti useammassakin ohjelmointiparadigmassa. Seuraavassa olen luetellut tyypillisiä ohjelmointikieliparadigmojen tunnusmerkkejä ja tyyppiesimerkkejä; kannattaa kuitenkin muistaa, että minkään paradigman tyyppiesimerkit eivät rajoitu pelkästään sen paradigman sisälle. Imperatiivisen kielen:(käskykielen) merkittävimmät tunnusmerkit ovat sijoituslause(tai-lauseke) ja peräkkäistäminen. Useimmissa kielissä peräkkäistäminen on implisiittistä: peräkkäin kirjoitetut lauseet suoritetaan peräkkäin. Niissäkin kielissä yleensä puolipiste on peräkkäistyksen merkkinä. Lähes kaikki kielet ovat imperatiivisia. Tyyppiesimerkkejä ovat Algol-suvun kielet(pascal, C, C++, Java).

11 1. KIELTEN JAOTTELUJA 5 Deklaratiivisen kielen:(kuvailukielen) tunnusmerkki on se, että siitä puuttuu sijoituslause ja peräkkäistäminen. Deklaratiivisen kielen pääetu on, että siinä pätee viittausläpinäkyvyys(referential transparency), mikä helpottaa huomattavasti ohjelmien formaalia pyörittelyä käsin tai koneellisesti. Aidosti deklaratiiviset kielet ovat harvinaisia, ja niihin pätee Alan Perlisin[25] lausahdus: Purely applicative languages are poorly applicable.(perlis käytti deklaratiivisista kielistä nimeä applikatiivinen kieli.) Esimerkkejä lienevät λ-laskenta ja John Backusin FP-kieli[6]. Viime vuosikymmenellä kehitettiin muutamia tekniikoita, joilla kielestä saatettiin tehdä eräässä mielessä sekä deklaratiivinen että imperatiivinen. Näitä tekniikoita käyttäviä kieliä ovat Clean ja Haskell. Proseduraaliset kielet:(toimintokielen) tukevat aliohjelmarakennetta. Tyyppiesimerkkejä ovat C ja Pascal. Myös C++ ja Java kuuluvat tähän luokkaan, vaikka ne ovatkin ensisijaisesti oliokieliä. Oliokielet: tukevat olioita, joilla on identiteetti ja toiminta(metodit) sekä toimintojen periminen oliolta toiselle(tai luokkapohjaisissa kielissä luokalta toiselle). Tyyppiesimerkkejä ovat Smalltalk, Python, Java ja C++. Funktiokielten:(funktionaalisten kielten) tärkein tunnusmerkki on tuki täysivaltaisille funktioille(funktioille, joita voi palauttaa funktiosta, antaa funktiolle parametriksi ja tallettaa tietorakenteisiin). Muita tyypillisiä mutta ei universaaleja ominaisuuksia ovat tuki halvalle tiedon kopioinnille, algebralliset tietotyypit ja niiden hahmonsovitus ja tehokas rekursio. Tyyppiesimerkkejä ovat Lisp, SML, Haskell ja Clean. Myös useimmat oliokielet voidaan sijoittaa tähän kategoriaan, sillä olioilla ja täysivaltaisilla funktioilla on paljon yhteistä ainakin pellin alla Ousterhoutin jaottelu. John Ousterhout[24] määrittelee järjestelmäohjelmointikielen ja juontokielen eron seuraavasti: järjestelmäohjelmointikieli: Nämä kielet on tarkoitettu tietorakenteiden ja yksittäisten komponenttien toteuttamiseen siirrettävästi ja korkeammalla tasolla kuin symbolisella konekielellä kirjoitettaessa. Ne käyttävät vahvaa staattista tyypitystä. Järjestelmäohjelmointikieliä ovat esimerkiksi PL/I, Pascal,C,C++jaJava.

12 6 1. JOHDANTO juontokieli: Juontokielet olettavat, että on jo olemassa joukko hyödyllisiä komponentteja, jotka on kirjoitettu järjestelmäohjelmointikielillä. Juontokieliä käytetään komponenttien yhdistelemiseen, eräänlaisina liimoina(usein puhutaankin englanniksi glue languageistä). Juontokielet käyttävät tyypillisesti dynaamista tyypitystä- tyypityksen vahvuus vaihtelee.(ousterhout puhui tyypittömyydestä mutta hän tarkoitti dynaamista tyypitystä.) Juontokieliä ovat esimerkiksi Perl, Python, Rexx, Tcl, Visual Basic ja Unixin kuoret. Ousterhoutin jaottelua on kovasti kritisoitu. 2. Kielen valinta Tyypilliset tavat valita toteutuskieli ovat me ollaan aina käytetty tätä kieltä tuo kieli on kaikkien huulilla; käyttäkäämme sitä Kumpaakin tapaa voidaan kenties perustella liiketoiminnallisilla syillä, mutta teknisesti molemmat tavat ovat huonoja. Varsinkin ison projektin suunnittelijoiden kannattaa pohtia kielen valintaa tosissaan, sillä sillä voi olla iso vaikutus projektin tuottavuuteen. Projektiorhanisaatiolle uuden ja oudon kielen valintaa pidetään merkittävänä riskitekijänäprojektinonnistumiselle 1 Kannattaa huomata, että kielen valintaa ei voi tarkastella irrallaan kielen tukityökalujen(kääntäjä, tulkki, debuggeri yms.) tarkastelusta, mutta niitä ei silti pidä sekoittaa toisiinsa. Useimmissa kielisodissa, mitä esimerkiksi netissä käydään, kielet ja niiden tukityökalut sekoitetaan toisiinsa niin autuaasti, että vertailun mielekkyys katoaa kokonaan. Lawlis[19] on esittänyt prosessin, jolla toteutuskielen voi valita(näennäisen?) täsmällisesti vaatimusten mukaan. Burgess[7] on esittänyt kriteereitä, jota hänen mukaansa on syytä tarkastella valittaessa toteutuskieltä korkealaatuisen tuotteen tekemistä varten. Raymond[29] on käsitellyt kielen valintaa Unix-ympäristöön ohjelmaa rakentavan vapaaohjelmaprojektin näkökulmasta, mutta hänen havaintonsa ovat yleisemminkin sovellettavissa. Seuraavassa olen koonnut Lawlisin, Burgessin ja Raymondin pohjalta muutaman kysymyksen, joita voidaan käyttää kielten arvioinnissa(ei missään erityisessä järjestyksessä): (1) Tukeeko kieli hyvää ohjelmointityyliä ja tekeekö se huonon tyylin hankalaksi? 1 Eikösittenolisikinparempi,ettäkaikkiopettelisivatuseitakieliäjokoulussa tai yliopistolla?

13 3. OHJELMOINTIKIELTEN SUUNNITTELUPERIAATTEITA 7 (2) Onko kielestä olemassa standardi? Miten tarkasti ja selkeästi se määrittelee kielen? Tukevatko kielen toteutukset standardia ja tekevätkö ne epästandardin koodin kirjoittamisen hankalaksi? (3) Onko kielestä olemassa laadukkaita toteutuksia? (4) Onko kieli riippumaton yksittäisistä käyttöjärjestelmistä ja laitteistoista? Toisin sanoen, onko se siirrettävä myös käytännössä? (5) Tukeeko kieli sovellusalueita, joilla projekti tai organisaatio toimii? (6) Auttaako vai haittaako se turvallisuuden(safety) ja luotettavuuden tavoittelua? (7) Ovatko sen toteutukset ajanmukaisia? (8) Onko sille olemassa tarvittavat prosessia tukevat työkalut? 3. Ohjelmointikielten suunnitteluperiaatteita Tony Hoare kirjoitti 1970-luvun alussa poleemisen artikkelin[10], jossa hän antoi mielestään objektiiviset kriteerit ohjelmointikielen hyvyydelle. Ne ovat seuraavat. Kielen tulisi auttaa ohjelman suunnittelussa. Kielen tulisi auttaa ohjelman dokumentoinnissa. Kielen tulisi auttaa virheiden jäljittämisessä. Näiden pohjalta Hoare nimeää viisi avainlausahdusta, jotka kuvaavat hyvää ohjelmointikieltä: yksinkertaisuus: Yksinkertaisuus on välttämätöntä, sillä muuten edes kielen kehittäjä ei voi arvioida tekemiensä valintojen seurauksia eikä kielen toteuttaja voi saavuttaa edes luotettavuutta saati sitten tehokkuutta ja nopeutta. Yksinkertaisuudesta hyötyy kuitenkin ensisijaisesti kielen käyttäjä. turvallisuus: Turvallisuudella Hoare tarkoittaa sitä, että kielellä kirjoitettu ohjelma ei saa missään tilanteessa edes ohjelmoijan virheen seurauksena käyttäytyä hallitsemattomasti(esimerkiksi sekoittaa käyttöjärjestelmän tai muistinhallinnan tietorakenteita) tai eri järjestelmissä eri tavoilla. Lisäksi kielen syntaksin tulee olla sellainen, ettei yksinkertainen kirjoitusvirhe muuta ohjelman merkitystä merkittävästi. Nykyisinä Internet-ohjelmoinnin aikoina turvallisuus on entistä merkittävämpi, sillä juuri ohjelmointikielten turvallisuuden puute on ollut merkittävä tietomurtoja edistävä tekijä. lyhyt kääntymisaika: Käännösajan(se aika, joka kestää koodin muuttamisen päättymisestä siihen, kun muutettua ohjelmaa voi ajaa) tulee olla mahdollisimman lyhyt, jotta virheenjäljitys ja-korjaus onnistuisi mahdollisimman hyvin. Tämä

14 8 1. JOHDANTO vaikuttaa myös kielensuunnittelijan työhön, sillä eri ominaisuudet vaativat eri määrän työtä käännösaikana. ajonaikainen tehokkuus: Ohjelmointikieli on työkalu ja siksi sen tulee olla tehokas. Tässä pätee sama kuin edellisessäkin kohdassa: kielensuunnittelija voi vaikuttaa paljon siihen, että onko hänen kielensä toteutettavissa tehokkaasti. Tämä ja edellinen vaatimus ovat osittain keskenään ristiriitaisia, sillä pääsääntöisesti ajonaikainen tehokkuus paranee, kun käännösaikaa kasvatetaan lisäämällä kääntäjään optimointeja. Kuitenkin kielen suunnittelija voi vaikuttaa paljon siihen, että kuinka paljon näitä optimointeja välttämättä tarvitaan. luettavuus: Ohjelman luettavuuden tärkeyden pitäisi olla kaikille selvä. Hoare antaa myös artikkelissaan monia ohjeita siitä, miten hänen mielestään näihin tavoitteisiin voitaisiin päästä, mutta monet niistä ovat jo varsin kyseenalaisia. Silti kielensuunnittelusta kiinnostuneen kannattaa tutustua Hoaren artikkeliin kokonaisuudessaan. Hoaren listaan voimme lisätä vielä yhden avainlausahduksen: stabiilius. Tuotantokäytössä olevan kielen tulee olla saavuttanut tietynasteinen kypsyys. Kielen käyttäjien tulee voida luottaa siihen, ettäjuurisekielenversioonvalidivieläkahden,viidenjaaikausein vielä kymmenenkin vuoden kuluttua sekä ei pelkästään Windowsissa vaan myös Unixissa, Macissa ja vaikkapa GNU:ssa. Tässä auttaa voimakkaasti kielen standardointi, sillä standardi antaa stabiiliutta ja antaa yhteisen pohjan kielen eri toteutuksille. TEHTÄVÄ 1.1. Ovatko nämä kriteerit tarkoituksenmukaisia? Ovatko ne kattavia? Mitä sinä pidät tärkeänä ohjelmointikielessä? TEHTÄVÄ 1.2. Löydätkö vastaavuuksia ohjelmointikielen ja ohjelman hyvyyden arviointiin käytettävien kriteereiden väliltä? 4. Kielen määrittely Kielestä on aina syytä kirjoittaa määrittelydokumentti(specification) samaan aikaan kun sitä ensimmäistä kertaa toteutetaan tai heti sen jälkeen. Määrittelydokumentti kertoo ohjelmoijalle, mitä kieli tarjoaa, ja toteuttajalle, mitä hänen ohjelmansa tulee tehdä. Tämän dokumentin lisäksi on toki hyvä olla ohjelmoijan opas erikseen, koska määrittelydokumentti on ollessaan hyödyllinen tavallisesti suhteellisen vaikealukuinen. Määrittelydokumentissa kuvataan kaikki oleellinen kielestä riittävällä tarkkuudella. Tässä on valittavissa monta tarkkuustasoa: voidaan esittää asia epämuodollisesti tai sitten hieman muodollisemmin. Kielioppi esitetään nykyisin lähes aina täysin muodollisesti käyttäen tiettyjä formalismeja(tavallisimmin Backus-Naur Form(BNF)

15 4. KIELEN MÄÄRITTELY 9 tai sen muunnokset EBNF ja ABNF). Merkitysoppi on tapana ilmaista sanallisesti, koska olemassaolevat merkitysopin muodolliset kuvausmenetelmät(aksiomaattinen, denotationaalinen ja operationaalinen) ovat varsin vaikeita kirjoittaa ja lukea. Myös mahdollinen tyyppijärjestelmä voidaan kuvata muodollisesti esittelemällä se päättelysääntöjoukkona. Palaamme näihin kaikkiin formalismeihin myöhemmin. Uuden ohjelmointikielen määrittelydokumenttia levitetään tavallisimmin kielen alkuperäisen toteutuksen mukana. Toisinaan erityisesti yliopistoissa ja tutkimuslaitoksissa luotujen kielten määrittelydokumentti julkaistaan laitosraporttina tai jopa kansainvälisenä tutkimusartikkelina, ja monien määrittelyjen nimi onkin muotoa Report onthexlanguagey,missäxonjokinkieltäykuvaavalausahdus.tavallista on myös julkaista kielten paranneltuja versioita, jolloin saattaa tulla kyseeseen julkaista myös Revised Report on the X Language Y. Scheme on tästä mainio esimerkki: Scheme-raportista on nyt voimassa viides revisio[15]. Kun kieli on saavuttanut tietyn kypsyystason ja käyttäjäjoukon, aletaan tavallisesti puuhata sen standardointia. Standardointia harrastavat monet järjestöt, tärkeimpinä ISO(kansainvälinen standardointijärjestö, ), usein yhteistyössä IEC:n(kansainvälinensähköteknillinenstandardointijärjestö, )kanssa, ECMA(informaatio- ja kommunikaatojärjestelmiä standardoiva eurooppalainenjärjestö, )sekäieee(instituteof ElectricalandElectronicsEngineers, ).Takavuosina merkittävässä asemassa olivat myös Yhdysvaltain kansallisen standardointijärjestön ANSI:n standardit, mutta nykyisin lähes kaikki ohjelmointikieliin liittyvät ANSI-standardit ovat myös kansainvälisiä ISO/IEC-standardeja. Usein tosin kielten standardointi tehdään näiden virallisten tahojen ulkopuolella(esimerkiksi Haskell-kielen standardointi tehtiin käyttäjä- ja toteuttajayhteisön sisällä, ja kielen määrittely julkaistiin kirjana[26] ja lehtiartikkelina[27]). Seuraavassa on listattu joidenkin tunnettujen kielten standardit: C-kielestä on kolme standardia: ANSI X , ISO/IEC 9899:1990 ja ISO/IEC 9899:1999. Kaksi ensimmäistä ovat oleellisesti sama standardi ja käsittelevät sitä C:n versiota, jota on tapana kutsua ANSI C:ksi, C89:ksi tai C90:ksi. Kolmas standardi käsittelee C:n uutta versiota C99:ää. C++-kielen standardi on ISO/IEC 14882:1998. Scheme-kielen standardi on IEEE Std C#-kielen standardi on ECMA-334. BASIC-kielestä on neljä standardia: ANSI X , ECMA- 116, ANSI X (R1998) ja ISO/IEC 10279:1991(E). Ne kaikki käsittelevät hieman eri versiota kielestä. Java-kielestä ei ole standardia.

16 10 1. JOHDANTO 5. Toteutustekniikoista Ohjelmointikielten toteutukset jaetaan kahteen pääluokkaan: on tulkkeja(interpreter) ja kääntäjiä(compiler). Rajanveto näiden luokkien välillä on hankalaa. Räikeimmissä tapauksissa se on suhteellisen helppoa: tulkki lukee ohjelmatekstiä ja suorittaa sitä lukiessaan, kääntäjä tuottaa ohjelmatekstistä konekielisen version, joka ajetaan erikseen. Käytännössä kuitenkaan puhtaita tulkkejaeiole. Varsin suosittu tapa toteuttaa tulkki on rakentaa se kaksivaiheiseksi. Tulkkiin sisältyy eräänlainen esikääntäjä, joka kääntää ohjelman jonkin kuvitteellisen koneen konekielelle. Tämä kuvitteellinen eli virtuaalinen kone on suunniteltu siten, että sille on kyseinen kieli helppo kääntää ja toisaalta sitä on helppo simuloida ohjelmallisesti. Tulkin toinen osa on sitten tämän virtuaalisen koneen simulaattori, jota usein sanotaan virtuaalikoneeksi, joka sitten tosiasiassa tulkkaa tuon käännetyn tuloksen. Tämän virtuaalisen koneen konekieli on eräänlainen välikieli, jota tulkki käyttää apunaan. Sitä kutsutaan toisinaan tavukoodiksi(bytecode). Ohjelmointikielten kääntäjän(ja virtuaalikoneratkaisua käyttävän tulkin esikääntäjäosan) perusrakenne on kaksijakoinen: sillä on lähdekielestä riippuva etupää ja kohdekielestä(kohdekoneen konekieli) riippuva takapää. Etupää koostuu neljästä vaiheesta: leksikaalinen analyysi, syntaktinen analyysi, semanttinen analyysi ja välikoodin(intermediate code) tuottaminen. Takapää koostuu optimoimesta ja tuloskoodin(object code) tuottimesta. Tavallisesti osa näistä vaiheista tapahtuu limittäin, ei erillisinä vaiheina välituloksineen. Kääntäjätekniikan(jota myös tulkeissa käytetään) perusteos on ns. lohikäärmekirja[4], mutta se on suhteellisen vanha ja keskittyy lähinnä käskykielten kääntämiseen. Uudempi, ihan kohtuullinen kirja on Andrew Appelin Modern compiler implementation in Java[5], josta on olemassa versiot myös C- ja ML-kielille. Funktiokielten toteutusta käsittelee Peyton Jones[28].

17 Osa1 Imperatiivinen ohjelmointi

18

19 LUKU 2 Konekielinen ohjelmointi Tässä luvussa käsitellään konekielistä ohjelmointia ja esitellään kuvitteellinen kone, jonka avulla monisteessa myöhemmin esitellään eri kieliominaisuuksien toiminta. 1. Konekielet Konekielellä tarkoitetaan sitä kieltä, jota tietokone ymmärtää suoraan. Koska kaikki nykytietokoneet perustuvat samaan ideaan siitä, miten tietokone toimii(ns. von Neumannin kone), ovat myös eri koneiden konekielet suurpiirteisesti katsoen samanlaisia. Yhteistä kaikille konekielille on se, että ne eivät ole tekstuaalisia vaan asiat ilmaistaan konekielellä koodaamalla ne jollakin annetulla tavallatavujonoksi 1,jotasittenkoneenprosessoritulkitsee. Yhteistä myös kaikille konekielille on se, että ohjelmat voidaan jäsentää dataksi ja koodiksi, ja koodi voidaan edelleen jäsentää jonoksi käskyjä(engl. instructions), jotka viittaavat dataan ja muualle koodiin. Käskyt puolestaan voidaan luokitella karkeasti seuraavasti: (1) datan siirto (2) kokonaislukuaritmetiikka (3) vertailu (4) ehdolliset hypyt (5) ehdottomat hypyt (6) järjestelmäkutsut (7) sovellusaluekohtaiset käskyt (8) järjestelmäkäskyt Näistä viisi ensimmäistä käskyluokkaa ovat jatkuvassa käytössä kaikissa ohjelmissa. Järjestelmäkutsujakin käytetään kaikissa ohjelmissa, mutta niiden käyttötaajuus vaihtelee. Järjestelmäkäskyjä eivät tavalliset ohjelmat kykene käyttämään, ne ovat olemassa käyttöjärjestelmien tarpeita varten. Useimmat tietokoneet tarjoavat lisäksi koko joukon erilaisia sovellusaluekohtaisia käskyjä; näistä lähes yleiskäyttöisen aseman on saanut liukulukukäskyt, pöytäkoneissa tavallisia 1 Tavu(engl.byte)eivälttämättäolekahdeksanbittinen,vaikkanykykoneissa näin onkin. Huolitellussa kielenkäytössä tavu tarkoittaa koneen pienintä osoitettavissa olevaa tietoyksikköä; jos halutaan puhua nimenomaan kahdeksanbittisestä tietoyksiköstä, korrekti termi on oktetti. 13

20 14 2. KONEKIELINEN OHJELMOINTI ovat erilaiset reaaliaikagrafiikan piirtämisessä tarvittavat laskentamenetelmät(esimerkiksi SIMD ja MMX). Yleensä konekielissä on jokin varsin yksinkertainen mekanismi, jollaerikäskytvoidaanerottaatoisistaan.vanhoissa,ns.cisc-malleissa 2 käskyn aloitti yleensä ns. operaatiokoodi(engl. opcode), joka yleensä vei yhden tavun. Operaatiokoodi ilmaisi, mistä käskystä oli kyse sekä mistä löytynyttä dataa käsky käsitteli. Operaatiokoodia seurasi vaihteleva määrä operandeja, jotka tarkensivat datan sijaintia(antaen esimerkiksi kiinteän osoitteen, mistä data löytyy). UudemmissaRISC-maleissa 3 käskytovatyleensäkiinteämittaisia(esimerkiksi neljän tavun mittaisia riippumatta käskystä) sekä sisältävät operaatiokoodin ja yhden tai useamman operandin. Vaikka konekielet ovatkin suurpiirteisesti katsoen samanlaisia, niiden välillä on huomattavia eroja yksityiskohdissa. Pääsääntöisesti vain samanlaiselle koneelle tarkoitettu konekielinen ohjelma toimii toisessa koneessa. Eri prosessorit jaotellaan sen mukaan, toimivatko toiselle kirjoitetut ohjelmat toisessa prosessorissa. Keskeinen käsite on käskykanta-arkkitehtuuri(engl. instruction set architecture), joka määrää, mitä käskyjä prosessori tukee. Tällä hetkellä merkittävät käskykanta-arkkitehtuurit ovat IA-32: Ehkäpä kaikkien aikojen menestynein käskykanta-arkkitehtuuri: Lähes kaikki nykyiset pöytäkoneet ja kannettavat perustuvat IA-32:lle. Myös monet vähäistä tai keskinkertaista tehoa vaativat palvelimet käyttävät IA-32:a. Ensimmäinen prosessori, joka tuki tätä käskykantaa, oli Intelin vuodelta Myöhemmät prosessorit ovat laajentaneet käskykantaa, mutta sen ydin on edelleen sama, jota tuki. IA-32:ta tukevia prosessoreita valmistavat lähinnä Intel ja AMD, mutta on muitakin valmistajia. Kuten tietokonealalla yleensäkin on tapana, markkinajohtaja IA-32 ei ole teknisesti paras markkinoilla olevista vaihtoehdoista. AMD64: AMD:n suunnittelema uusi(2003) käskykanta-arkkitehtuuri, joka on IA-32:n laajennus samassa mielessä kuin IA-32 itse oli aiempien Intel ja arkkitehtuurien laajennus. Vaikka AMD64 on varsin nuori, sen odotetaan seuraavien vuosien korvaavan IA-32:n. Kuten IA-32:ta, AMD- 64:ää tukevia prosessoreita valmistavat sekä AMD(Athlon64 ja Opteron) että Intel(EM64T). 2 ComplexInstructionSetComputer;valtaossassapöytäkoneitakäytettäväIntelin 32-bittinen prosessoriarkkitehtuuri IA-32(80386, Pentium ym.) kuuluu tähän luokkaan historiansa vuoksi. 3 Reduced/RegularInstructionSetComputer;näitäovatkäytännössäkaikki 1980-luvun loppupuolella tai sitä myöhemmin puhtaalta pöydältä suunnitellut prosessoriarkkitehtuurit; esimerkiksi Sparc, Alpha ja mobiililaitteista usein löytyvä ARM.

21 2. SYMBOLISET KONEKIELET 15 PowerPC: Applen, IBM:n ja Motorolan yhteishankkeena luvun alussa lanseeraama käskykanta-arkkitehtuuri, jota käyttävät nykyisin lähinnä uudehkot Macintosh-koneet. ARM: ARM on suhteellisen suurta laskentatehoa tarvitsevien sulautettujen järjestelmien(esimerkiksi mobiilipäätelaitteet) ja kämmenmikrojen prosessorien käskykanta-arkkitehtuuri. ARM-yhteensopivia prosessoreita valmistaa moni mikroprosessorivalmistaja. MIPS: Merkittävä suurta laskentatehoa vaativien sulautettujen ja mobiilien järjestelmien prosessorien käskykanta-arkkitehtuuri; käytössä myös SGI:n työasemien prosessoreissa. Sparc: Suosittu käskykanta-arkkitehtuuri palvelinkäytössä. Alkuperäinen Sparc on 32-bittinen; sen 64-bittinen laajennus on nimeltään UltraSparc. 2. Symboliset konekielet Konekieltä ei juuri koskaan kirjoiteta käsin. Konekieliset ohjelmat syntyvät yleensä varsinaisten ohjelmointikielten kääntäjien vasteena. Toisinaan kuitenkin ohjelmoija haluaa kirjoittaa samalla abstraktiotasolla, jonka konekieli tarjoaa. Tällaisia tilanteita varten jokaiseen konekieleen liittyy symbolinen konekieli(engl. assembly). Se on konekielisen ohjelman tekstuaalinen esitysmuoto, jossa kukin käsky on omalla rivillään, osoitteiden sijasta käytetään symbolisia nimiä ja jossa käskyn toimittama operaatio ja sen operandit on selvästi erotettu toisistaan. Symbolisella konekielellä kirjoitetun ohjelman kääntämiseen varsinaiselle konekielelle tarvitaan oma ohjelmansa(tosin onnistuusekylläkäsinkin),ns.assembler 4. Lähes kaikilla symbolisilla konekielillä on sama perusrakenne. Kuten edellä jo todettiin, kukin käsky on omalla rivillään. Pystysuunnassa symbolisellä konekielellä kirjoitettu ohjelma jakautuu sarakkeisiin, joiden avulla käskyn eri osat jäsentyvät. Tavallisesti käskyn osoitetta edustava symbolinen nimi, ns. label, on ensimmäisessä sarakkeessa. Jos sellaista ei ole, ensimmäinen sarake on tyhjä. Toinen sarake on varattu käskyn muistikkaalle(engl. mnemonic) yleensä kolmikirjaiminen, joskus kaksi- tai nelikirjaiminen tunnus, joka nimeää käskyn. Kolmas, neljäs ja joskus viideskin sarake on käskyn operandien käytössä. Tämän tarkemmin ei symbolisia konekieliä voi kuvata yleisesti, sillä jokaisella symbolisella konekielellä on omat merkintätapansa. Tavallisesti kullakin käskykanta-arkkitehtuurilla on täsmälleen yksi symbolinen konekieli; IA-32 on tästä poikkeus, sillä on nimittäin niitä kaksi: AT&T:n ja Intelin symbolinen konekieli. 4 Huomaa:assemblyonkieli,assemblerohjelma.

22 16 2. KONEKIELINEN OHJELMOINTI KUVA 1. Yksinkertainen aliohjelma C-kielellä! " ##$ % &! # ' (! ) %! ) # ) * )! # ) %! * + ) %!# ) *,% ) # ) % ) # ) -. +! " ##$./ ( * % ) #) ) ) #) #"# ) "+ ) #) # # ) *,% ) # ) % ) # ) -./. + (!! ) %! * ) # ) KUVA 2. Yksinkertainen aliohjelma IA32-arkkitehtuurin symbolisella konekielellä(at&t) Kuvissa 2, 3 ja 4 on kuvattu yksinkertainen aliohjelma kolmella eri symbolisella konekielellä. Vastaava C-kielinen aliohjelma on kuvassa Abstraktit koneet Abstrakti kone on käskykanta-arkkitehtuuri, jota ei ole tarkoitettu toteutettavaksi suoraan laitteistossa. Jos abstaktilla koneella on ohjelmistototeutus, se on virtuaalikone.

23 3. ABSTRAKTIT KONEET 17 " % &! #! / (.. % ) # ) " ) " # " # ) *! ) # %.. + * # ) * ) # ) "../ ( ) # # ) % ) # ) ) " # " # ) $ ) # " # ) ) # # ) " ) # # ) ) # ) # ) ) # ) # ) ) # ) $ # ) %../ ) # "+ # ).. + ( * ) # ) KUVA 3. Yksinkertainen aliohjelma UltraSparc-arkkitehtuurin symbolisella konekielellä Ohjelmoijan näkemä tietokone on harvoin täsmälleen se, jonka tietokoneen laitteisto toteuttaa. Yleensä ohjelmoija voi luottaa käyttöjärjestelmän palveluihin. Käyttöjärjestelmä siis rakentaa fyysisen tietokoneen päälle eräänlaisen virtuaalisen tietokoneen, siis virtuaalikoneen. Joskus ohjelmoijan kirjoittamaa ohjelmaa suorittaa simulaattori, joka imitoi jotain abstraktia konetta; tällöin ohjelmoijan näkemä kone on tyystin toinen kuin mitä laitteistosta voisi päätellä. Tällainen tilanne on esimerkiksi silloin, kun Java-ohjelmaa ajetaan Java-virtuaalikoneessa. Tämän luvun loppuosa esittelee erään abstraktin koneen, joka on eräänlainen todellisten koneiden idealisaatio, ja se tarjoaa jonkin verran myös käyttöjärjestelmältä odotettavia palveluita. Ideana on, että myöhemmin tässä monisteessa voidaan sitten pohtia kehittyneempien ohjelmointikielten toteutusta tämän abstraktin koneen tarjoamassa viitekehyksessä ilman, että tarvitsee miettiä sellaisia kääntäjätekniikan inhottavuuksia kuten rekisterien valintaa.

24 18 2. KONEKIELINEN OHJELMOINTI % &! #' ( * # %, # # *! # # % #./ ( # # # # # # # #"+ # # %, # *! # # % " # #./ % KUVA 4. Yksinkertainen aliohjelma PowerPC-arkkitehtuurin symbolisella konekielellä 4. Neloskielen idea Neloskieli on erään abstraktin koneen symbolinen konekieli. Ennen kuin voidaan puhua itse kielestä, pitää hahmotella kyseinen abstrakti kone. Olkoon se nimeltään Neloskone. Neloskoneen rakenne on kaksijakoinen: sillä on muisti ja prosessointiyksikkö.neloskoneenmuistion2 32 tavuntaulukko;tavunkoko on tavanomaiset kahdeksan bittiä. Jokaisella muistin tavulla on yksikäsitteinen osoite, joka on 32-bittinen etumerkitön kokonaisluku. Muisti jakautuu neljään osaan: tekstimuistiin, datamuistiin, nollamuistiin, käyttämättömän muistin alueeseen sekä pinomuistiin. Kukin muistin osa on yhtenäinen osa muistia. Tekstimuisti alkaa aina osoitteesta 0, datamuisti heti tekstimuistin jälkeen ja nollamuisti heti datamuistin jälkeen. Nollamuistin jälkeen alkaa käyttämättömänmuistinalue,jotaeisaalukeajajohoneisaakirjoittaa.muistinlopussaonpinomuisti,jokapäättyyosoitteeseen Kunkin

25 4. NELOSKIELEN IDEA 19 muistialueen eli segmentin koko voi vaihdella käynnistyskerrasta toiseen; nollamuistin ja pinomuistin koko voi vaihdella myös suorituksen aikana. Tekstimuistiin kirjoittaminen on kiellettyä; muistipaikan, jonkaosoiteon0,lukeminenonmyöskiellettyä. 5 Vaikka muisti onkin tavutaulukko, sitä tavallisesti käsitellään neljäntavunelisanan(engl.word)yksiköissä 6.Sanavoidaantilanteesta riippuen tulkita etumerkittömäksi 32-bittiseksi kokonaisluvuksi, etumerkilliseksi 32-bittiseksi kokonaisluvuksi tai yksinkertaisen tarkkuudenliukuluvuksi.jossanantavutovatx 0,...,x 3,missäx 0 onse tavu,jonkaosoiteonpienin,jax 3 onsetavu,jonkaosoiteonsuurin, sana tulkitaan seuraavasti etumerkittömäksi kokonaisluvuksi: Sanan lukuarvo etumerkittömänä kokonaislukuna on 3 i=0 256 i x i, toisin sanoen vähiten merkitsevä tavu on sanassa ensimmäisenä. Neloskone on siis little-endian; jos vähiten merkitsevä tavu olisi ensimmäisenä, se olisi big-endian. etumerkilliseksi kokonaisluvuksi: Kun sana tulkitaan etumerkilliseksi kokonaisluvuksi, on sen etumerkki negatiivinen, jos sanan eniten merkitsevä bitti on 1 ja positiivinen, jos sanan eniten merkitsevä bitti on 0. Jos sanan etumerkki on negatiivinen, sanan itseisarvo saadaan, kun siihen sovelletaan ensin biteittäistä negaatiota, minkä jälkeen se tulkitaan yllä esitetysti etumerkittömäksi kokonaisluvuksi ja tulokseen lisätään 1. Positiivisen luvun arvon saamiseksi riittää soveltaa sanaan suoraan yllä esitettyä etumerkittömän luvun menetelmää. Toisin sanoen Neloskone käyttää kahden komplementti-esitystä(engl. two s complement). yksinkertaisen tarkkuuden liukuluvuksi: IEEE 754-standardin[1] mukaisesti. Sanasta voidaan käsitellä myös vähemmän merkitsevää puolikasta, siis sitä 16-bittistä kokonaisuutta, joka koostuu sanan kahdesta ensimmäisestä tavusta. Tällainen puolisana(engl. half-word) voidaan tulkita etumerkittömäksi kokonaisluvuksi tai etumerkilliseksi 5 TämämuistinjakosegmentteihinonitseasiassamatkittuUNIX-käyttöjärjestelmien käyttämästä kullekin ohjelmalle erikseen annetun muistiavaruuden rakenteesta. Unixissa nollamuistin nimi on bss. 6 Sananpituusvaihteleekäskykanta-arkkitehtuuristariippuen;yleensäseon kaksi, neljä tai kahdeksan tavua pitkä. Sitä sanotaan myös konesanaksi(engl. machine word).

26 20 2. KONEKIELINEN OHJELMOINTI kokonaisluvuksi yllä esitettyä vastaavalla tavalla. Tietyissä tilanteissa kaksi peräkkäistä sanaa muodostavat kaksoissanan(engl. doubleword), joka tulkitaan kaksinkertaisen tarkkuuden liukuluvuksi IEEE 754 -standardin mukaisesti. Kaksoissana, sana tai puolisana voidaan lukea vain alkaen neljällä jaollisista osoitteista. Ajatus on, että tekstimuisti sisältää suoritettavan ohjelman konekielisen koodin. Kukin käsky vie 16 tavua; käskyjen koodaus jätetään tarkoituksella määrittelemättä. Datamuisti sisältää kaiken ohjelman alussa varattavan ja alustettavan datan, nollamuisti sisältää kaiken ohjelman alussa varattavan ja nollaksi alustettavan datan. Koneessa pyörivä ohjelma voi lisäksi kasvattaa nollamuistin kokoa ja näin mahdollistaa dynaamisen muistinvarauksen(tosin ohjelma joutuu itse pitämään kirjaa yksittäisten dynaamisten muuttujien varauksista ja vapauttamisista). Pinomuistia ohjelma voi käyttää esimerkiksi aliohjelmien hallintaan. Koneessa on viisi 32-bittistä rekisteriä: SP:(Stack Pointer) Suurin osoite, joka ei kuulu pinomuistiin. FP:(Frame Pointer) On aina suurempi tai yhtäsuuri kuin SP. IP:(Instruction Pointer) Sisältää sen tekstimuistin tavun osoitteen, josta seuraavaksi suoritettava käsky alkaa. ZL:(Zero Limit) Pienin osoite, joka ei kuulu tekstimuistiin, datamuistiin eikä nollamuistiin. AR:(Address Register) Käytetään epäsuorien osoitusten osoitelähteenä. Kun Nelikone käynnistyy, se lataa ajettavan ohjelman jostakin tarkemmin määrittelemättömästä lähteestä. Ohjelma määrää tekstija datamuistin koon sekä nollamuistin ja pinomuistin lähtökoon sekä sen, mitä tekstimuistiin sisältyy ja mitkä ovat datamuistin tavujen alkuarvot. Ennen suorituksen alkamista se nollaa kaikki nollamuistin tavut. Nelikoneen käskyt on lueteltu taulukossa 1. Kukin operandi(opr1, opr2taiopr3)voiolla [nimi], jolloin operandin sisältö luetaan alkaen muistipaikasta, jonka osoite on vakion nimi arvo; [R + n], jolloin operandin sisältö luetaan alkaen muistipaikasta, joka saadaan, kun R-rekisterin(FP tai AR) sisältämään osoitteeseenlisätäänvakion(0 n<2 3 2);sekä [R n], jolloin operandin sisältö luetaan alkaen muistipaikasta, joka saadaan, kun R-rekisterin(FP tai AR) sisältämästäosoitteestavähennetäänvakion(0 n<2 3 2). Operandi voi myös olla jotain seuraavista, jos se ei esiinny nuolen ( ) vasemmalla puolella: n,jolloinoperandinsisältöonkyseinenvakion(0 n<2 3 2); tai

27 4. NELOSKIELEN IDEA 21 Käsky Kuvaus opr1 opr2 Kopioi opr2:n sisältö opr1:een. opr1 opr2 + opr3 Laita opr2:n ja opr3:n summa opr1:een. opr1 opr2 opr3 Laita opr2:n ja opr3:n erotus opr1:een. opr1 opr2 opr3 Laita opr2:n ja opr3:n tulo opr1:een. opr1 opr2 / opr3 Jaa opr2 opr3:lla ja laita osamäärä opr1:een. opr1 opr2 mod opr3 Jaa opr2 opr3:lla ja laita jakojäännös opr1:een. opr1 opr2 and opr3 Suorita biteittäinen ja-operaatio opr2:n ja opr3:n välillä ja tallenna tulos opr1:een. opr1 opr2 or opr3 Suorita biteittäinen tai-operaatio opr2:n ja opr3:n välillä ja tallenna tulos opr1:een. opr1 opr2 xor opr3 Suorita biteittäinen poissulkeva tai -operaatio opr2:n ja opr3:n välillä ja tallenna tulos opr1:een. opr1 not opr2 Suorita biteittäinen negaatio opr2:lle ja tallenna tulos opr1:een. opr1 reg Kopioi rekisterin reg (AR, SP, FP tai ZL) sisältö opr1:een. reg opr1 Kopioi rekisterin opr1:n sisältö reg:iin(ar, SP, FP taizl). reg1 reg2 Kopioi rekisterin reg:n(ar, SP, FP tai ZL) sisältö reg2:een(ar,sp,fptaizl). SP SP +n LisääSP:henvakion. SP SP n Vähennä SP:stä vakio n. ifopr1 =opr2gotoopr3 Josopr1:njaopr2:nsisällötovatsamat,laitaopr3:n sisältö IP:hen. if opr1 < opr2 goto opr3 Jos opr1:n sisältö on pienempi kuin opr2:n sisältö, laita opr3:n sisältö IP:hen. if opr1 opr2 goto opr3 Jos opr1:n sisältö on pienempi tai yhtäsuuri kuin opr2:n sisältö, laita opr3:n sisältö IP:hen. if opr1 > opr2 goto opr3 Jos opr1:n sisältö on pienempi kuin opr2:n sisältö, laita opr3:n sisältö IP:hen. if opr1 opr2 goto opr3 Jos opr1:n sisältö on suurempi tai yhtäsuuri kuin opr2:n sisältö, laita opr3:n sisältö IP:hen. if opr1 opr2 goto opr3 Jos opr1:n ja opr2:n sisällöt ovat erisuuret, laita opr3:n sisältö IP:hen. goto opr1 Laita opr1:n sisältö IP:hen. syscall n Tee systeemikutsu, jonka tunnus on vakio n(ks. liitea). TAULUKKO 1. Nelikoneen käskykanta nimi,jolloinoperandinsisältöonseluku,jotako.nimiedustaa. Operandi, joka on muotoa[jotain+0] tai[jotain-0] voidaan lyhentää [jotain]. Operandien koko ja tulkinta määräytyy käskyn mukaan. Pääsääntöisesti operandien on neljä tavua ja ne tulkitaan etumerkittömiksi kokonaisluvuiksi. Tämä voidaan muuttaa kirjoittamalla käskyrivin loppuun jokin seuraavista merkinnöistä:

28 22 2. KONEKIELINEN OHJELMOINTI (FS): Operandit ovat nelitavuisia sanoja, jotka tulkitaan yksinkertaisen tarkkuuden liukuluvuiksi. (FD): Kukin operandi koostuu kahdesta perättäisestä nelitavuisesta sanasta, joka tulkitaan kaksinkertaisen tarkkuuden liukuluvuiksi. (S): Operandit ovat nelitavuisia sanoja, jotka tulkitaan etumerkillisiksi kokonaisluvuiksi. (H): Operandit ovat kaksitavuisia puolisanoja, jotka tulkitaan etumerkittömiksi kokonaisluvuiksi. (HS): Operandit ovat kaksitavuisia puolisanoja, jotka tulkitaan etumerkillisiksi kokonaisluvuiksi. (B): Operandit ovat tavuja, jotka tulkitaan etumerkittömiksi kokonaisluvuiksi. (BS): Operandit ovat tavuja, jotka tulkitaan etumerkittömiksi kokonaisluvuiksi. Kertolaskun tulosoperandi ja jakolaskun jaettavan sisältävä operandi on kokonaislukulaskennassa aina kaksi kertaa niin pitkä kuin muut operandit. Vertailukäskyjen kolmas operandi sekä goton ainoa operandi on kuitenkin tällaisista merkinnöistä huolimatta aina nelitavuinen sana, joka tulkitaan etumerkittömäksi kokonaisluvuksi, joka on tekstimuistiin kuuluva osoite. Bitittäisten operaatioiden(and, or, xor, not) kanssa merkinnät(fs) ja(fd) ovat kiellettyjä, sillä liukuluvun bitittäinen käsittely ei ole mielekästä. Esimerkiksi käsky [tmp] [rv] 10(B) kertoo rv:n edustaman muistipaikan sisällön kymmenellä ja sijoittaa tuloksen puolisanaan, joka alkaa tmp:n sisältämästä osoitteesta. Symbolisessa konekielessä tulee olla myös tapa määritellä symbolisia nimiä osoitteille ja vakioille. Sovitaan niin, että rivin alussa oleva sana, jonka perässä on kaksoispiste, määrittelee kyseisen sanan symboliseksi vakioksi, jonka arvona on seuraavan käskyn osoite. Sovitaan myös, että pseudokäsky data, jonka perään kirjoitetaan yksi luku, lisää datamuistiin uuden nelitavuisen muuttujan, jonka alkuarvo on kyseinen luku. Lisäksi sovitaan, että pseudokäsky zero lisää nollamuistin kokoa neljällä tavulla(varaten näin tilaa yhdelle nolla-alusteiselle muuttujalle). Sovittakoon vielä, että pseudokäsky string, jonka perään kirjoitetaan C-tyylinen merkkijono, lisää datamuistiin tavujonon, jonka sisältö on tuo merkkijono. Pseudokäskyn osoite olkoon sen määrittelemän uuden muuttujan osoite(zeron tapauksessa nollamuistin ylärajan vanha arvo). Kuvassa5onesitettykuvien1,2,3ja4aliohjelmanelikielellä.

29 str2ulong:sp SP 4 [SP] FP FP SP [s] [FP +8] [rv] 0 loop: AR [s] [tmp] 0 [tmp] [AR](B) if[tmp] =0gotofinish [tmp] [tmp] 48 [rv] [rv] 10 [rv] [rv] +[tmp] [s] [s] +1 goto loop finish: [FP +8] [rv] FP [FP] AR [SP +4] SP SP +8 goto AR tmp: zero s: zero rv: zero 5. SYSTEEMIKUTSUT 23 KUVA 5. Yksinkertainen aliohjelma Nelikielellä 5. Systeemikutsut Ollakseen hyödyllinen ohjelman tulee voida vaikuttaa ympäristöönsä sekä ottaa ympäristöstään vaikutteita. Tämä tapahtuu ohjaamalla erilaisia oheislaitteita kuten näyttöä, printteriä ja hiirtä. Yleensä tavallisen ohjelman ei anneta kuitenkaan vapaasti keskustella oheislaitteiden avulla; syyt lienevät kaikille tutut. Sen sijaan käyttöjärjestelmä keskustelee laitteiden kanssa ja välittää ohjelmien pyynnöt eteenpäin huolehtien siitä, että samaan aikaan käynnissä olevat ohjelmat eivät tallo toisiaan varpaille. Käytännössä ohjelman tulee voidakseen keskustella ympäristönsä kanssa siis keskustella käyttöjärjestelmän kanssa. Tavallisesti tämä tapahtuu systeemikutsujen(engl. system calls) avulla: kun ohjelma haluaa käyttää käyttöjärjestelmän palveluita, se käyttää jotain erityistämekanismiakutsuakseenkäyttöjärjestelmää 7 Neloskoneen tapauksessa koneeseen on sisäänrakennettu jokunen systeemikutsu. Systeemikutsu etenee siten, että ohjelma laittaa 7 Toinenvaihtoehtoolisiantaakäyttöjärjestelmänkutsuaohjelmaatarvittaessa. Tätä sanottaisiin tapahtumapohjaiseksi(engl. event-based) systeemiksi. Tavallisesti todellisissa järjestelmissä käytetään tarpeen mukaan molempia järjestelyitä.

30 24 2. KONEKIELINEN OHJELMOINTI 0 Avaa olemassaoleva tiedosto 1 Luouusitiedostojaavaase 2 Sulje avattu tiedosto 3 Luetiedostosta 4 Kirjoitatiedostoon 5 Muuta luku/kirjoituskohdan sijaintia(seek) 6 Kerro luku/kirjoituskohdan sijainti(tell) 7 Jakaudu(fork) 8 Kloonaudu(clone) 9 Lähetä viesti toiselle rinnalla suoritettavalle koneelle 10 Vastaanotaviesti 11 Sammutakone 12 Odota rinnakkaisen koneen sammumista 13 Aika TAULUKKO 2. Neloskoneen systeemikutsut systeemikutsun argumentit pinoon ja käyttää sitten syscall n-käskyä, missä n on halutun systeemikutsun tunnus. Neloskoneen käyttöjärjestelmä poistaa argumentit pinosta ja laittaa tilalle paluutiedon, sekä suorittaa halutun toiminnon, mikäli se on mahdollista. Neloskoneen tapauksessa kolme parametria ottava ja yhden paluutiedon antava systeemikutsu etenee siis suunnilleen näin: SP SP 12 [SP + 8] parametri3 [SP + 4] parametri2 [SP + 0] parametri1 syscall n [paluutiedon paikka] [SP + 0] SP SP +4 Tässä n on halutun systeemikutsun tunnusnumero. Taulukossa 2 on lyhyesti esitetty Neloskoneen systeemikutsut. Tarkemmin ne esitellään liitteessä A. Tässä vaiheessa systeemikutsujen tarkka toiminta ei ole oleellista; niihin palataan myöhemmin. 6. Konekielellä ohjelmoinnista Symbolisella konekielellä ohjelmointi voi olla tottumattomalle outoa, joten sanotaan sananen siitä. Symbolisella konekielellä ohjelmoinnin kaksi tärkeintä eroa korkean tason kielillä ohjelmointiin nähden on, että konekielellä joudutaan kaikki kontrollirakenteet kirjoittaa gotoa tai muuta vastaavaa menetelmää käyttäen ja että lausekkeet joudutaan käsin purkamaan osaoperaatioihinsa(päättäen samalla, minne välitulokset tallennetaan). Näinpä konekieliohjelmointi on hyvinkin matalan tason näperöintiä ja se kannattaa pääosin jättää kääntäjän huoleksi.

Konekielinen ohjelmointi

Konekielinen ohjelmointi Konekielinen ohjelmointi Antti-Juhani Kaijanaho 9. tammikuuta 2007 1 Konekielet Konekielellä tarkoitetaan sitä kieltä, jota tietokone ymmärtää suoraan. Koska kaikki nykytietokoneet perustuvat samaan ideaan

Lisätiedot

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho Aloitusluento TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 8. tammikuuta 2007 Luennoija Antti-Juhani Kaijanaho

Lisätiedot

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Syksy 2004 Antti-Juhani Kaijanaho Copyright c 2002, 2004 Antti-Juhani Kaijanaho Tästä teoksesta saa valmistaa kappaleita ja sen saa saattaa yleisön saataviin, muuttamattomana

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

Koodi. Antti-Juhani Kaijanaho. 11. marraskuuta 2003. Sisältö

Koodi. Antti-Juhani Kaijanaho. 11. marraskuuta 2003. Sisältö Koodi Antti-Juhani Kaijanaho 11. marraskuuta 2003 Tiivistelmä Tämän luennon tarkoitus on käsitellä ohjelmistoprojektin toteutusvaiheeseen ja projektin tuloksena syntyvään ohjelmakoodiin liittyviä kysymyksiä.

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

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Syksy 2004 Antti-Juhani Kaijanaho Copyright c 2002, 2004 Antti-Juhani Kaijanaho Tästä teoksesta saa valmistaa kappaleita ja sen saa saattaa yleisön saataviin, muuttamattomana

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

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

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

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

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 I Johdanto Sisältö 1. Ohjelmointikielen määritelmä 2. Syitä tutkia ohjelmointikieliä 3. Ohjelmointiparadigmat 4. Suunnittelu- ja arviointikriteerit 5. Suunnitteluun

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

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

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 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. Järjestelmän eri tasot Laitteiston nopeus

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus 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

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

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

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015 TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2015 Sisällys t Väitöstilaisuus 4.12.2015 kello 12 vanhassa juhlasalissa S212 saa tulla 2 demoruksia

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011 TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 16. helmikuuta 2011 Sisällys Sisällys Ohjelmointikieli? programming language n. a

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

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

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Ohjelmointi 1 / syksy /20: IDE

Ohjelmointi 1 / syksy /20: IDE Ohjelmointi 1 / syksy 2007 10/20: IDE Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/8 Tämän luennon rakenne

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

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

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

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto Luento 6 (verkkoluento 6) Tiedon esitysmuodot Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto Ohjelman esitysmuoto Rakenteellinen tieto 1 Tiedon tyypit Kommunikointi

Lisätiedot

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010 kielenä 9. joulukuuta 2010 Historia kielenä Historia Sovelluksia kehitettiin vuonna 1972 Kehittäjinä ranskalaiset Pääkehittäjä Alain Colmerauer Philippe Roussel programmation en logique Robert Kowalski

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus 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

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

Python-ohjelmointi Harjoitus 2

Python-ohjelmointi Harjoitus 2 Python-ohjelmointi Harjoitus 2 TAVOITTEET Kerrataan tulostuskomento ja lukumuotoisen muuttujan muuttaminen merkkijonoksi. Opitaan jakojäännös eli modulus, vertailuoperaattorit, ehtorakenne jos, input-komento

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

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

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

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen. historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen historia

Imperatiivisten ohjelmien organisointiparadigmojen historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Ohjelmoijan binaarialgebra ja heksaluvut

Ohjelmoijan binaarialgebra ja heksaluvut Paavo Räisänen Ohjelmoijan binaarialgebra ja heksaluvut www.ohjelmoinaan.net Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei kaupallisissa tarkoituksissa. Kuitenkaan omille nettisivuille opasta

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

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

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

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

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

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

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages Tampere University of Technology Department of Pervasive Computing TIE-20306 Principles of Programming Languages Ruby Ryhmä 8 Juho Rintala Sami Paukku Sisällysluettelo 1 Johdanto... 3 2 Paradigma... 3

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

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

ITKP102 Ohjelmointi 1 (6 op)

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

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

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

Kertausluento luennoista 1-3 1

Kertausluento luennoista 1-3 1 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

11.4. Context-free kielet 1 / 17

11.4. Context-free kielet 1 / 17 11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä

Lisätiedot

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus 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

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

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2

Lisätiedot

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014 Yhtälönratkaisusta Johanna Rämö, Helsingin yliopisto 22. syyskuuta 2014 Yhtälönratkaisu on koulusta tuttua, mutta usein sitä tehdään mekaanisesti sen kummempia ajattelematta. Jotta pystytään ratkaisemaan

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

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

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2 TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa

Lisätiedot

kertaa samat järjestykseen lukkarissa.

kertaa samat järjestykseen lukkarissa. Opetuksen toistuva varaus ryhmällee TY10S11 - Tästä tulee pitkä esimerkki, sillä pyrin nyt melko yksityiskohtaisesti kuvaamaan sen osion mikä syntyy tiedon hakemisesta vuosisuunnittelusta, sen tiedon kirjaamiseen

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

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

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 perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

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

Ohjelmointikielten periaatteiden taustaa

Ohjelmointikielten periaatteiden taustaa Ohjelmointikielten periaatteiden taustaa Antti-Juhani Kaijanaho 8. tammikuuta 2007 How many times do I have to tell you? The right tool for the right job! Scotty elokuvassa Star Trek V Ohjelmointi on ongelmien

Lisätiedot

1. Algoritmi 1.1 Sisällys Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. Muuttujat ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

etunimi, sukunimi ja opiskelijanumero ja näillä

etunimi, sukunimi ja opiskelijanumero ja näillä Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti

Lisätiedot

Paavo Räisänen. Ohjelmoijan binaarialgebra ja heksaluvut. www.ohjelmoimaan.net

Paavo Räisänen. Ohjelmoijan binaarialgebra ja heksaluvut. www.ohjelmoimaan.net Paavo Räisänen Ohjelmoijan binaarialgebra ja heksaluvut www.ohjelmoimaan.net Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei kaupallisissa tarkoituksissa. Kuitenkaan omille nettisivuille opasta

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015 TIEA24 Automaatit ja kieliopit, syksy 205 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 5. marraskuuta 205 Sisällys Käsiteanalyysiä Tarkastellaan koodilukkoa äärellisenä automaattina. Deterministinen äärellinen

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

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

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

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Luento 1 (verkkoluento 1) Tietokonejärjestelmä Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä This image cannot currently be displayed.

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 8. syyskuuta 2016 Sisällys a https://tim.jyu.fi/view/kurssit/tie/ tiea241/2016/videoiden%20hakemisto Matemaattisen

Lisätiedot

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14 Arkkitehtuurikuvaus Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy Ryhmä 14 Muutoshistoria Versio Pvm Päivittäjä Muutos 0.4 1.11.2007 Matti Eerola 0.3 18.10.2007 Matti Eerola 0.2

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

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

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

Lisätiedot

Matematiikan peruskurssi 2

Matematiikan peruskurssi 2 Matematiikan peruskurssi Tentti, 9..06 Tentin kesto: h. Sallitut apuvälineet: kaavakokoelma ja laskin, joka ei kykene graaseen/symboliseen laskentaan Vastaa seuraavista viidestä tehtävästä neljään. Saat

Lisätiedot

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER Group 16 Ville Laatu Henri Myllyoja - i SISÄLLYSLUETTELO 1. DEBUGGERI YLEISESTI... II 1.1 Debuggerin käyttämien... ii 1.2 Debuggerin käynnistäminen... ii

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 4 Jatkuvuus Jatkuvan funktion määritelmä Tarkastellaan funktiota f x) jossakin tietyssä pisteessä x 0. Tämä funktio on tässä pisteessä joko jatkuva tai epäjatkuva. Jatkuvuuden

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

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

Ohjelmoinnin perusteet, syksy 2006

Ohjelmoinnin perusteet, syksy 2006 Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen

Lisätiedot

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät ongelmat suoraan Jormalle sähköpostitse (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja

Lisätiedot

Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)

Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer) Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer) 1 Suorituksenaikainen suorittimen ja muistin sisältö muisti suoritin

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. lokakuuta 2016 Sisällys n tunnistin Jay : An Efficient Context-Free Parsing Algorithm. Communications of the

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

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Ohjelmointitehtävien osalta palautetaan

Lisätiedot

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen 2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio

Lisätiedot