Johdanto. 1. Mikä on ohjelmointikieli?

Koko: px
Aloita esitys sivulta:

Download "Johdanto. 1. Mikä on ohjelmointikieli?"

Transkriptio

1 Johdanto Ohjelmoinnin opetteluun ei välttämättä tarvitse opiskella lainkaan ohjelmointikieliä: algoritmeja voidaan suunnitella ja analysoida käyttäen matemaattista tai muuta formaalia merkintätapaa. Käytännössä ohjelmoinnin harrastaminen edellyttää ainakin yhden ohjelmointikielen tuntemista. Tällä kurssilla perehdytään ohjelmointikielten arviointi- ja suunnitteluperiaatteisiin sekä kielten ominaispiirteisiin siinä toivossa, että opiskelija oppisi paremmin ymmärtämään käyttämiänsä ohjelmointikieliä ja omaksuisi helpommin uusia kieliä. 1. Mikä on ohjelmointikieli? Ohjelmointikielelle ei ole helppoa antaa tyhjentävää määritelmää. Loudenin ([Lou], s. 3) mukaan ohjelmointikieli on Merkintäjärjestelmä, joka kuvaa laskentaa sellaisessa muodossa, että se on koneen ja ihmisen luettavissa. Tämä määritelmä sisältää termejä, jotka kaipaavat hieman selventämistä: Usein laskenta määritellään formaalisti Turingin koneen avulla; tässä yhteydessä laskennalla kuitenkin tarkoitetaan (väljähkösti) mitä tahansa tietokoneen suorittamaa toimintoa. Se, että ohjelmointikieli on koneen luettavissa tarkoittaa mahdollisuutta kääntää sitä automaattisesti konekielelle. Näin ollen kielen rakenteen on oltava riittävän selkeä ja yksinkertainen. Vaatimus, jonka mukaan kielen on oltava ihmisen luettavissa, on luonnollisesti edellistä vaatimusta epätarkempi. Tämä voidaan tulkita niin, että kielen on sisällettävä joitakin sellaisia abstraktioita, jotka kuvaavat koneen toimintaa niin, että koneen toimintaa ei tarvitse syvällisesti ymmärtää käyttääkseen kieltä. Yleensä ohjelmointikieli muistuttaa myös jossain määrin luonnollista kieltä; on kuitenkin olemassa kieliä, jotka eivät ilmaise ohjelmia merkkijonoina. Nämä kielet ovat tämän kurssin tarkastelujen ulkopuolella. Lopulta voidaan kysyä, miten taataan ohjelman luettavuus kokonaisuutena. Viimeinen vaatimus asettaa kyseenalaiseksi ainakin konekielen ohjelmointikielenä; myös symbolinen konekieli (assembly) on varsin huonosti lukukelpoista ihmiselle, joka

2 ei tunne tietokoneen sisäistä toimintaa. Yleisesti ottaen yllä oleva määritelmä riittää tämän kurssin tarpeisiin. 2. Miksi tutkia ohjelmointikieliä? Vaikka ohjelmointi onkin monelta osin ongelmien abstrahointia ja ratkaisua, vaikuttaa valittu ohjelmointikieli ja ohjelmoijan käsitys kielestä ongelman ratkaisuun ja ennen kaikkea ratkaisuyritysten implementointitapaan. Sebesta mainitsee kuusi syytä ohjelmointikielten tutkimiseen ([Seb] kappale 1.1). 1. Valmius ilmaista ohjelmointi-ideoita kehittyy ("Increased capacity to express ideas"). o Yleisesti ollaan sitä mieltä, että luonnollisen kielen hallinta vaikuttaa ihmisen ajatteluun. Rajoittunut näkemys käytettävästä kielestä voi vastaavasti rajoittaa ohjelmoinnissa käytettävien kontrollirakenteiden, tietorakenteiden ja abstraktioiden hyödyntämistä. Tyypillinen esimerkki on rekursio, jonka käyttö on mahdollista useissa kielissä; ohjelmoijan on rekursiota käyttäessään tunnettava sen käyttö ja rajoitukset. 2. Tehtävään soveltuvan kielen valinta tehostuu ("Improved background for choosing appropriate languages"). o Kun tunnetaan useita ohjelmointikieliä ja osataan arvioida niitä, voidaan myös paremmin päättää, mikä kieli on asianmukaista valita kulloiseenkin ohjelmointitehtävään. 3. Uusien kielien oppiminen helpottuu ("Increased ability to learn new languages"). o Ainakaan toistaiseksi ohjelmointikielet eivät ole vakiintuneet, vaan koko ajan kehitetään uusia kieliä tehostamaan ohjelmointityötä uudentyyppisten sovellusten rakentamisessa. Uusi kieli on tehokkaampi kuitenkin vain, jos ohjelmoijat oppivat sen nopeasti ja osaavat käyttää kieltä tehokkaasti. Yleisten periaatteiden tuntemus auttaa uuden kielen opiskelussa. 4. Ohjelmointikielen implementoinnin merkitys ymmärretään paremmin ("Better understanding of the significance of implementation"). o Ohjelmointikielten periaatteiden tutkimukseen liittyy myös kielen ominaisuuksien implementointi. Tämän ymmärtäminen auttaa paitsi kielen käyttämisessä, myös virhetilanteiden selvittelyssä. Samoin ohjelman

3 suorituskyvyn arvioiminen saattaa helpottua, mikäli ohjelmoija ymmärtää käytettävien kirjastofunktioiden sisäistä toimintaa. 5. Tuttujen kielten tehokkaampi käyttö ("Better use of languages that are already known"). o Monet olemassa olevat kielet ovat laajoja ja monimutkaisia eivätkä ohjelmoijat aina tunne käyttämänsä kielen kaikkia ominaisuuksia. Yleisten periaatteiden tuntemus auttaa opettelemaan ja käyttämään tutun kielen ennestään tuntemattomia piirteitä. 6. Tietojenkäsittelyn yleinen edistyminen ("Overall advancement of computing"). o Sebestan mukaan ohjelmointikielten arviointiperiaatteiden tuntemus voi edistää tietojenkäsittelyä yleisestikin. Esimerkiksi nykyisin monet uskovat, että ohjelmoinnissa olisi saavutettu parempia tuloksia, jos ALGOL60 olisi aikoinaan (60 -luvun alkupuolella) syrjäyttänyt FORTRANin. Näin ei kuitenkaan tapahtunut, koska ohjelmistoammattilaiset eivät nähneet ALGOLin etuja FORTRANiin verrattuna. Pratt ([Pra] ss. 4-5) luettelee puolestaan viisi syytä: 1. Käytettävän kielen syvempi ymmärtäminen ("To improve your understanding of the language you are using"). o Vertaa Sebestan listan ensimmäiseen ja neljänteen kohtaan. 2. Tietämys käyttökelpoisista ohjelmointikonstruktioista kasvaa ("To increase your vocabulary of useful programming constructs"). o Tämä liittyy myös Sebestan listan ensimmäiseen kohtaan. 3. Tehtävään soveltuvan kielen valinta tehostuu ("To allow better choice of programming language"). o Sebestan lista kohta Uusien kielien oppiminen helpottuu ("To make it easier to learn a new language"). o Sebestan lista kohta Uusien kielten suunnittelu helpottuu ("To make it easier to design a new language"). Scottin ([Sco], kappale 1.3) mukaan ainakin seuraavista syistä kannattaa perehtyä ohjelmointikielten periaatteisiin:

4 1. Kielen harvoin käytettyjen ominaisuuksien ymmärtäminen paranee ( Understand obscure features ). o Sebestan lista kohta Mahdollisuus valita sopivin vaihtoehtoisista toteutustavoista ("Choose among alternative ways to express things"). o Vertaa Sebestan listan ensimmäiseen kohtaan. 3. Ohjelmoinnin oheistyökalujen käyttö tehostuu ("Make good use of debuggers, assemblers, linkers, and related tools"). o Hankalien ohjelmointivirheiden jäljittäminen saattaa olla helpompaa, jos tuntee kielen toteutuksen yksityiskohtaisesti. 4. Kieleen kuulumattomien ominaisuuksien simulointi helpottuu ("Simulate useful features in languages that lack them"). o Erityisesti vanhemmista kielistä puuttuu monia nykyään yleisiä ominaisuuksia, joita asiantunteva ohjelmoija voi kuitenkin jäljitellä niin, että koodi säilyy luettavana. 5. Ohjelmointikieliteknologian yleinen soveltaminen ("Make better use of language technology wherever it appears") o Ohjelmointikielten periaatteiden tunteminen helpottaa kirjoittamaan ohjelmia, joiden pitää jäsentää ja käsitellä strukturoitua dataa. Yhteenvetona voidaan todeta, että "tavallisenkin" ohjelmoijan kannalta on hyödyllistä opiskella ohjelmointikielten periaatteita ainakin seuraavista syistä: 1. Ohjelmointitaito kehittyy. o Ohjelmoija osaa käyttää ohjelmointirakenteita kielen mukaisesti ja ymmärtää kielen implementoinnin vaikutukset ohjelmaan. Lisäksi virheiden etsiminen ja korjaaminen helpottuu. 2. Valmius oppia uusia kieliä kasvaa. o Useimpien ohjelmoijien on jossain vaiheessa opeteltava uusi kieli jotain erikoistehtävää varten; kielten perusperiaatteiden tunteminen antaa valmiuden tähän. Lisäksi ohjelmoinnin opettajien on syytä tuntea kielten periaatteet.

5 3. Ohjelmointiparadigmat Ohjelmointikieliä on monta eri tyyppiä; kielen tyyppi on läheisessä yhteydessä ohjelmointitapaan, paradigmaan. Ohjelmoinnissa paradigma koostuu laskennallisesta mallista, käsitteistöstä ja välineistöstä ([Har], s. 15). Ylätasolla kielet voidaan jaotella imperatiivisiin (käskykielet) ja deklaratiivisiin (esittelykielet). Paradigman mukainen kielten luokittelu ei ole aina helppoa: kielissä saattaa olla useiden ohjelmointiparadigmojen piirteitä. Paradigmojen luokittelujakin on monia. Luonnollisin ohjelmointiparadigma von Neumann -tietokoneympäristössä (ks. johdannon kappale 5) on imperatiivinen ohjelmointi. Imperatiivisen ohjelmoinnin tunnuspiirteet ovat 1. muistipaikkoja mallintavat muuttujat, 2. sijoituslauseet, joiden avulla muistia manipuloidaan ja 3. komentojen peräkkäinen suorittaminen. Edellä mainittua ohjelmointitapaa tukevia kieliä kutsutaan yleensä imperatiivisiksi kieliksi. Ei ole yllättävää, että nykykielistä valtaosa on (ainakin jossakin mielessä) imperatiivisia. Usein olio-ohjelmointi (ks. esimerkiksi [Lou] s. 14) lasketaan omaksi ohjelmointiparadigmakseen ja se vaatiikin kieleltä tukea luokkien esittämiselle; useimmat nykyisistä oliokielistä ovat kuitenkin luonteeltaan imperatiivisia ja niillä ohjelmoiminen on pitkälle imperatiivisen paradigman mukaista. Tosin nykyisiin valtakieliin on viime aikoina sisällytetty piirteitä myös muista paradigmoista, erityisesti funktionaalisesta ohjelmoinnista. Olio-ohjelmointi edellyttää joka tapauksessa siihen soveltuvaa ajattelutapaa, joten sitä voidaan perustellusti kutsua ohjelmointiparadigmaksi. Rinnakkainen ohjelmointi poikkeaa imperatiivisesta ohjelmoinnista sikäli, että siinä voidaan määritellä samanaikaisesti suoritettavia toimenpiteitä, jolloin pitää huolehtia muuttujien päivittämisen ja suoritettavien prosessien kommunikoinnin synkronoimisesta. Monet nykyiset olio-ohjelmointikielet tukevat rinnakkaisuutta. Deklaratiivisen ohjelmointiparadigman antamia vaihtoehtoja imperatiiviselle ohjelmoinnille ovat funktionaalinen ohjelmointi (funktio-ohjelmointi) ja logiikkaohjelmointi. Myös tietokantakielet lasketaan kuuluvaksi deklaratiiviseen

6 paradigmaan. Funktionaalinen ohjelmointi perustaa laskennan funktioiden soveltamiseen (application of functions) annettuihin parametreihin; tästä syystä funktionaaliset ohjelmointikielet tunnetaan myös englanninkielisellä nimellä applicative languages. Funktionaalisen ohjelmointikielen perusmekanismi on siten funktiokutsu. Tämä ilmenee havainnollisesti toistorakenteen toteuttamisessa: funktionaalisessa kielessä toisto toteutetaan funktion rekursiivisella kutsulla. Imperatiiviseen ohjelmointiin tottuneelle voi olla vaikea hahmottaa funktionaalista ohjelmointia, koska siinä ei käytetä muuttujia tai toistorakenteita. Tunnetuin funktionaalinen ohjelmointikieli on epäilemättä LISP, josta on olemassa monia murteita. Viime vuosina Haskell on myös kasvattanut suosiotaan. Logiikkaohjelmointi pohjautuu symbolisen logiikan käyttöön; logiikkaohjelmointikielessä ohjelma koostuu väitteistä (statements), jotka kuvaavat totuuksia. Puhtaassa logiikkaohjelmointikielessä ei tarvita kontrollirakenteita, mistä syystä joissakin lähteissä pelkästään logiikkaohjelmointia kutsutaan deklaratiiviseksi eli kuvausohjelmoinniksi (ominaisuudet esitellään, mutta suoritusjärjestystä ei anneta [Lou] s. 14, [Seb] kappale 16.4). Logiikkaohjelmoinnissa käytetään yleisesti arvojen esittämiseen muuttujia, mutta ne poikkeavat imperatiivisen ohjelmoinnin muuttujista siten, että ne eivät mallinna muistialueita vaan käyttäytyvät pikemminkin matematiikassa käytettävien muuttujien lailla, ts. ovat nimiä tuloksille. Prolog on selvästi tunnetuin logiikkaohjelmointikieli. 4. Ohjelmointikielten suunnittelu- ja arviointikriteerejä Tällä kurssilla pyritään arvioimaan olemassa olevia ohjelmointikieliä. Tätä varten tarvitaan periaatteita, joiden avulla kieliä voidaan arvostella. Samat kriteerit ovat tärkeitä myös ohjelmointikielien suunnittelussa. Uuden ohjelmointikielen luominen on erittäin vaikea tehtävä, siitäkin syystä, että tietojenkäsittelytieteilijät eivät ole yksimielisiä kaikista käytettävistä arviointiperiaatteista ja etenkään niiden tärkeysjärjestyksestä. Seuraavassa esitetään joitakin perusperiaatteita, jotka ovat yleisesti hyväksyttyjä. Ohjelmointikielten syntyaikoina tietokoneet olivat hitaita ja tehottomia nykyisiin verrattuna. Siksi ensimmäisten korkean tason ohjelmointikielten suunnittelussa

7 ylivoimaisesti tärkein suunnitteluperiaate oli tehokkuus. Tämän vuoksi 1950-luvulla syntynyt FORTRAN suunniteltiin muistuttamaan mahdollisimman paljon konekieltä. Noista ajoista laitteet ovat kehittyneet valtavasti ja tietokoneita käytetään yhä useammanlaisiin tehtäviin, jolloin myös ohjelmointikieliä on alettu suunnitella erikoistarkoituksiin. Tämän myötä arviointikriteeritkin ovat monimutkaistuneet. C.A.R. Hoare [Hoa], esitti kriteeristön ohjelmointikielten arviointiin 1970-luvun alkupuolella. Hänen mukaansa ohjelmointikielen tulee tukea ohjelmoijaa erityisesti ohjelman suunnittelussa, dokumentoinnissa ja virheiden etsimisessä sekä korjaamisessa. Hoare esittää, että objektiiviset periaatteet hyvän ohjelmointikielen suunnitteluun voidaan koota viiteen termiin: 1. Yksinkertaisuus (Simplicity) 2. Turvallisuus (Security) 3. Nopea käännettävyys (Fast translation) 4. Käännetyn ohjelmakoodin tehokkuus (Efficient object code) 5. Luettavuus (Readibility) Tarkastellaan lähemmin Loudenin ([Lou], Luku 3) listaaman ominaisuusjoukon ominaisuuksia. Loudenin kriteerit ovat: 1. Tehokkuus (Efficiency) 2. Yleisyys (Generality) 3. Ortogonaalisuus (Orthogonality) 4. Sisäinen yhdenmukaisuus (Uniformity) 5. Yksinkertaisuus (Simplicity) 6. Ilmaisuvoima (Expressiveness) 7. Täsmällisyys (Preciseness) 8. Laiteriippumattomuus (Machine independence) 9. Turvallisuus (Security) 10. Yhdenmukaisuus yleisesti käytettyjen merkintöjen ja sopimusten kanssa (Consistency with accepted notations and conventions) 11. Laajennettavuus (Extensibility) 12. Rajoitettavuus (Restrictability) Tehokkuus voidaan jakaa useaan osaan. Yksi tärkeimmistä tehokkuuden mittareista on (ja oli varsinkin tietokoneiden nuoruusvuosina) käännetyn koodin tehokkuus. Tämä

8 sisältyykin Hoaren listaan sellaisenaan. Joskus puhutaan myös kääntäjän kyvystä optimoida tuottamaansa konekielistä koodia. Esimerkiksi alustetut vakiomuuttujat voidaan sijoittaa arvoina koodiin jo käännösvaiheessa. Käännöksen tehokkuudella tarkoitetaan kielen kykyä sallia ohjelman konekielisen koodin tuottamisen nopeasti ja kohtuullisen kokoisella kääntäjäohjelmalla. Joissakin kielissä on ominaisuuksia, joita on hyvin vaikea tarkistaa käännösaikaisesti: Jos kääntäjä tarkastaa säännön, siitä voi tulla tehoton, jos taas jättää tarkastamatta, rikotaan luotettavuuden periaatetta. Lisäksi voidaan tarkastella kielellä ohjelmoimisen tehokkuutta: Kuinka nopeasti voidaan tuottaa hyödyllisiä ohjelmia kieltä käyttämällä? Tämä liittyy läheisesti kielen ilmaisuvoimaan: Periaatteessa ilmaisuvoimaisella kielellä voidaan kirjoittaa tehokkaammin ohjelmia, mutta toisaalta sellainen kieli on yleensä monimutkaisempi ja hitaampi oppia. Yleisyys, ortogonaalisuus ja sisäinen yhdenmukaisuus liittyvät läheisesti ohjelmointikielen rakenteisiin. Yleisyys tarkoittaa kielen ominaisuutta koota ominaisuutensa muutamista peruskäsitteistä. Esimerkiksi Pascal-kielessä on kahdentyyppisiä aliohjelmia - PROCEDURE (eivät palauta arvoa) ja FUNCTION (palauttavat arvon). Sen sijaan C- kielessä käytetään vain yhtä tyyppiä olevia funktioita, joilla voidaan toteuttaa molemmat toiminnot. Tässä mielessä C on yleisempi kuin Pascal. Ortogonaalisuus kytkeytyy yksinkertaisuuteen: ortogonaalisuudella tarkoitetaan kielen piirteiden riippumattomuutta toisistaan, kielessä pitäisi olla mahdollisimman vähän perusrakenteita, joita voidaan yhdistellä toisistaan riippumatta. Tällöin mikä tahansa yhdistelmä on laillinen ja merkityksellinen. Esimerkki ortogonaalisuuden puutteesta C -kielessä: Kielessä voidaan käyttää taulukoita (array) ja tietueita (struct). Tietue voi olla funktion paluuarvona, mutta taulukko ei voi olla. ALGOL68- kielen suunnittelussa käytettiin pääperiaatteena ortogonaalisuutta. Jokaisella lauseen rakenteella on tyyppi ja tyyppejä voi yhdistellä rajoituksetta. Tällaisen kielen ongelmaksi muodostuu se, että kieli sallii erittäin monimutkaiset rakenteet. Sisäinen yhdenmukaisuus vaatii johdonmukaisuutta kielen rakenteiden ulkoasussa ja käyttäytymisessä. Yhdenmukaisuutta voidaan rikkoa kahdella tavalla: Joko samankaltaisesti käyttäytyvät asiat näyttävät erilaisilta tai samalta näyttävät asiat käyttäytyvät eri lailla. Esimerkiksi funktion paluuarvo näyttää Pascalissa sijoituslauseelta: FUNCTION fun : Integer; begin fun := 10; end;

9 Yksinkertaisuutta pidettiin aikoinaan yhtenä tärkeimmistä suunnitteluperiaatteista. Esimerkiksi Pascal-kielessä se on ollut voimakkaana kriteerinä kieltä konstruoitaessa vastapainona ALGOL68- ja PL/I- kielten monimutkaisuudelle. Yksinkertaisuus on yllättävän vaikea saavuttaa, koska se sotii monia muita tavoiteltavia asioita vastaan. Lisäksi yksinkertaisen kielen käyttäminen voi olla vaikeata. Esimerkiksi BASIC-kieli on erittäin yksinkertainen, mutta sillä on vaikeata rakentaa suuria ohjelmia puutteittensa takia. (BASICista puuttuu lohkorakenne ja mahdollisuus esitellä muuttujia jne). Ylenmääräinen yksinkertaisuus ohjelmointikielessä rajoittaa sen ilmaisuvoimaa. Ilmaisuvoima auttaa ohjelmoijaa tuottamaan ohjelmia tehokkaammin, sen avulla kuvataan, kuinka helppoa kielessä on ilmaista monimutkaisia toimintoja ja rakenteita. Rekursion salliminen on tyypillinen seikka, joka lisää kielen ilmaisuvoimaa. (Kirjoita esimerkiksi ensin rekursiivinen Quicksort- toteutus ja sitten toteutus ilman rekursiota!) Ilmaisuvoiman kasvu on yleensä ristiriidassa yksinkertaisuuden kanssa, koska ilmaisuvoiman lisääminen vaatii kieleen uusia piirteitä ja rakenteita. Nykyisissä ohjelmointikielissä ilmaisuvoimaa pyritään parantamaan erilaisia rakenteita sisältävien kirjastojen avulla; näiden tunteminen ei ole välttämätöntä kielen käyttämisen kannalta. Ilmaisuvoimana voidaan myös pitää kielen kykyä ilmaista operaatioita lyhyesti. Tässä mielessä C on ilmaisuvoimainen kieli, esimerkiksi C-kielinen funktio strcpy(char *s, char *t) { while( *s++ = *t++); } kopioi merkkijonon toiseen. Koodi on lyhyt, mutta monen mielestä hankalahkoa luettavaa. Täsmällisyys merkitsee sitä, että kielellä on tarkka määrittely. Täsmällisyyden vaatimuksesta seuraa, että kielen käyttäytyminen on ennustettavaa ja se lisää kielen luotettavuutta. Laiteriippumattomuus saavutetaan pääasiassa käyttämällä kielessä tietotyyppejä, jotka eivät vaadi koneen sisäisen muistinvarauksen tai arkkitehtuurin sisäisten ominaisuuksien tuntemusta. C- kielessä int- tyyppinen muuttuja voi olla ympäristöstä riippuen joko 16- tai 32- bittinen luku. Sen sijaan Java- kielen int on aina 32- bittinen. Näin ollen tässä suhteessa Java on laiteriippumattomampi kuin C.

10 Turvallisuus liittyy läheisesti täsmällisyyteen ja luotettavuuteen ja se kuvaa suunnitteluperiaatetta, joka sekä estää ohjelmointivirheiden (sekä syntaktisten että semanttisten) syntymistä että edistää niiden havaitsemista. Turvallisuusperiaate johti kielten suunnittelijat luomaan tyyppikäsitteen ja tyypin tarkistuksen sekä muuttujien esittelyn. Turvallisuus on siten ristiriidassa kielen ilmaisuvoiman ja yksinkertaisuuden kanssa. Kokeneen ohjelmoijan tulisi kyetä helposti oppimaan ja käyttämään ohjelmointikieltä. Mitä standardimaisempia ratkaisuja käytetään, sitä helpommin niitä hyödynnetään. Tätä edistää yhdenmukaisuus yleisesti käytettyjen merkintöjen ja sopimusten kanssa. Tämän periaatteen rikkominen voi johtaa myös turvallisuusongelmiin, esimerkiksi nykyajan ohjelmoija tekee helposti havaitsemattomia virheitä koodatessaan FORTRANkielellä, koska se ei erottele välilyöntejä. Toistolause, joka tulostaa luvut yhdestä kymmeneen voidaan kirjoittaa FORTRANilla seuraavasti: DO 100 I= 1,10 PRINT *,'I =',I 100 CONTINUE Jos kuitenkin kirjoitetaan (vahingossa) DO 100 I= 1 10 PRINT *,'I =',I 100 CONTINUE tuloksena onkin ensimmäisenä operaationa sijoittaa muuttujaan DO100I arvo 110. Laajennettavuus sanoo, että tulisi olla jokin yleinen mekanismi, jonka avulla kieleen voidaan lisätä ominaisuuksia. Mitä uusien ominaisuuksien lisääminen tarkoittaa, vaihtelee näkökulmasta riippuen. Esimerkiksi useimmissa kielissä voi määritellä uusia tietotyyppejä ja nykyisiin olio-ohjelmointikieliin on mahdollista lisätä luokkia kirjoittamalla uusia luokkakirjastoja. Joihinkin kieliin, kuten funktionaalisiin kieliin luettavaan LISPiin, voidaan vaikuttaa syvemminkin, esimerkiksi lisäämällä uusia piirteitä kääntäjätasolle. Tavallisimmissa ns. imperatiivisissa kielissä tällainen ei ole niin helppoa. Rajoitettavuus tarkoittaa, että ohjelmoijan tulisi pystyä käyttämään ohjelmointikieltä hyödyllisesti, vaikka tunteekin vain osan kielen ominaisuuksista ja rakenteista. Esimerkiksi Java-ohjelmoijana saattaa toimia vuosiakin ilman Javan rinnakkaisuuden

11 tuntemusta. Rajoitettavuuden vaatimusta on kuitenkin kritisoitu varsin voimakkaasti, koska se voi johtaa ohjelmoijalle käsittämättömiin virhetilanteisiin. Sebesta ([Seb], kappale 1.3) käsittelee ainoastaan kielten arviointiperiaatteita, jotka jaetaan neljään pääkategoriaan (luettavuus, kirjoitettavuus, luotettavuus ja resurssivaatimukset). Pääkategorioiden kriteereihin vaikuttavat seuraavat ominaisuudet: 1. Luettavuus (Readibility) i. Yksinkertaisuus (Simplicity) ii. Ortogonaalisuus (Orthogonality) iii. Tietotyypit (Data types) iv. Syntaksi (Syntax design) 2. Kirjoitettavuus (Writability) i. Edelliset ja ii. Abstraktiotuki (Support for abstraction) iii. Ilmaisuvoima (Expressivity) 3. Luotettavuus (Reliability) i. Edelliset ja ii. Tyypin tarkistus (Type checking) iii. Poikkeusten käsittely (Exception handling) iv. Moninimisyys (Aliasing) 4. Resurssivaatimukset (cost) Sebesta korostaa erikseen kielen luettavuutta yhtenä tärkeimmistä kriteereistä. Hänen listassaan luettavuus sisältää piirteitä Loudenin listasta (yksinkertaisuus ja ortogonaalisuus). Tietotyypit liittyvät puolestaan kielen ilmaisuvoimaan, ts. sen kykyyn esittää abstraktioita erilaisista tyypeistä ja rakenteista. Syntaksin vaikutuksesta luettavuuteen Sebesta mainitsee erikoissanat (special words) sekä muodon ja merkityksen (form and meaning). Vanhemmissa kielissä rajoitettiin muuttujien nimien pituutta, jolloin niille ei voinut antaa kuvaavia nimiä. Tämä huonontaa kielen luettavuutta. Erityisen voimakkaasti kielen ulkoiseen luettavuuteen vaikuttavat sen erikoissanat (esimerkiksi kontrollirakenteiden while, for,if ja else ). Lausekkeiden kirjoittaminen niin, että niiden muodosta käy niiden tarkoitus selville on ilmeinen luettavuutta tukeva tekijä.

12 Kielen kirjoitettavuuteen - joka arvioi, kuinka helposti kielellä voi tuottaa valitun sovellusalueen ohjelmia - vaikuttaa samankaltaisia tekijöitä kuin luettavuuteenkin. Mikäli kielessä on suuri määrä piirteitä, ohjelmoija ei tunne niitä kaikkia syvällisesti ja voi siten tahtomattaan käyttää niitä virheellisesti. Näin ollen yksinkertaisuus ja piirteiden yhdisteltävyys (ortogonaalisuus) edesauttavat kirjoitettavuutta. Toisaalta liiallinenkin ortogonaalisuus voi haitata kirjoitettavuutta, koska tällöin piirteitä voidaan yhdistellä virheellisesti sitä huomaamatta. Mahdollisuus abstrahointiin on tärkeimpiä piirteitä nykyisissä ohjelmointikielissä, koska käytettävät suunnittelumetodit perustuvat tietorakenteiden valintaan niin, että ne esittävät ohjelmointiongelman piirteitä käsitteellistettynä. Näin ollen kielen tapa tukea abstraktiota vaikuttaa suuresti sen kirjoitettavuuteen. Vanhemmissa kielissä, kuten FORTRANissa, oli monimutkaisemmat tietorakenteet esitettävä epäluonnollisella tavalla, esimerkiksi taulukoita käyttämällä. Kielet, joissa on mahdollisuus määritellä omia tietorakenteita, sallivat näitä käsittelevän koodin huomattavasti luonnollisemman kirjoitusasun. Kielen ilmaisuvoima on monitahoinen käsite, kuten edellä on tullut esiin. Se voi tarkoittaa mahdollisuutta monimutkaisen ohjelman rakentamiseen pienellä vaivalla käyttämällä vahvoja operaattoreita, kuten APL-kielen matriisioperaattorit. Usein sillä tarkoitetaan, että kielessä on mahdollisuus ilmaista operaatioita lyhyesti, kuten aiemmin esitetyssä C-kielisessä strcpy-funktiossa. Ilmaisuvoiman lisääminen lisää myös kielen kirjoitettavuutta, mutta ei aina luettavuutta. Luotettavuudella tarkoitetaan kielen käyttäytymistä määritellyllä tavalla kaikissa tilanteissa. Sekä luettavuus että kirjoitettavuus vaikuttavat luotettavuuteen. Niiden lisäksi Sebesta käsittelee kolmea listassa mainittua luotettavuuteen liittyvää piirrettä. Tyypin tarkistus tarkoittaa tyyppivirheiden tarkistusta ohjelmassa, ts. sen tarkistamista, että tietyntyyppiseen muuttujaan sijoitetaan vain muodoltaan asianmukaista tietoa. Tyypin tarkistus vaikuttaa voimakkaasti kielen luotettavuuteen. Tarkistus voi tapahtua käännösaikaisesti tai ajonaikaisesti. Koska ajonaikainen tarkistus on resursseja vaativaa, pyritään pääasiassa käännösaikaiseen tarkistukseen; muutenkin on suotavaa havaita tämän kaltaiset virheet ohjelmasta mahdollisimman varhain. Poikkeusten käsittelyllä tarkoitetaan kielen kykyä havaita ajonaikaiset virheet ja mahdollisesti toipua niistä; tämä on myös kielen luotettavuuteen vahvasti vaikuttava

13 ominaisuus. Nykykielissä (kuten Java, C++ ja C#) onkin yleensä olemassa laaja poikkeusten käsittelymekanismi. Vanhemmista kielistä se sen sijaan usein puuttuu. Moninimisyydellä (aliasing) tarkoitetaan väljästi kielen kykyä muodostaa kaksi eri muuttujaa viittaamaan samaan muistipaikkaan. Tämä on yleensä mahdollista kielissä, joissa voidaan käyttää osoittimia. Moninimisyyttä pidetään yleensä varsin vaarallisena piirteenä kielessä, esimerkiksi C-ohjelmassa int a=10, b=15; int *pa,*pb; pa = &a; *pa = 20; pb = pa; *pb = b; printf("a = %d, b = %d", a,b); ei ensi silmäyksellä ehkä huomaa muuttavansa muuttujan a arvoa. Kuitenkin tulostuu a = 15, b = 15 Joissakin kielissä rajoitetaan moninimisyyttä luotettavuuden lisäämiseen. Viimeisenä arviointikriteerinä Sebesta mainitsee kielen resurssivaatimukset. Nämä muodostuvat useista eri osa-alueista. Aluksi tarvitaan resursseja kouluttamaan ohjelmoijia käyttämään kieltä: tähän vaikuttaa mm. kielen yksinkertaisuus ja samankaltaisuus muiden kielten kanssa. Toiseksi ohjelman kirjoittaminen vaatii resursseja; näiden resurssien tarve riippuu kielen kirjoitettavuudesta (sovellusalueen suhteen). Myös kääntämisen tehokkuus ja ohjelmien suorittamisen tehokkuus vaikuttavat tarvittaviin resursseihin, samoin implementointijärjestelmän kustannukset. Useimmat Java-ohjelmat voidaan tuottaa täysin ilmaisilla työkaluilla, sen sijaan esimerkiksi C++:lla toteutetun Windows-ohjelman implementointi voi olla hankalaa ilman jonkin ohjelmointiympäristön hankkimista. Huonon luotettavuuden aiheuttamat kustannukset ja ylläpidon vaatimat resurssit voidaan Sebestan mukaan myös laskea kielen resurssivaatimuksiin. Maarit Harsu esittelee lyhyesti ohjelmointikielen suunnitteluun vaikuttavia kriteerejä lähinnä Sebestan arviointiperusteiden pohjalta ([Har], 1.6. Ohjelmointikielen suunnittelu).

14 5. Ohjelmointikielten suunnitteluun vaikuttavia tekijöitä Edellisessä kappaleessa mainittujen kriteerien lisäksi kielten suunnitteluun vaikuttaa muitakin seikkoja. Yksi keskeisimmistä tällaisista seikoista on tietokoneen arkkitehtuuri. Koko tietokoneiden historian ajan vallitseva arkkitehtuurityyppi on ollut ns. von Neumannin arkkitehtuuri. Lähes kaikki nykyiset tietokoneet on suunniteltu tämän periaatteen mukaisesti; von Neumannin tietokoneessa sekä data että ohjelma tallennetaan samaan muistiin, eikä niitä voi erottaa toisistaan. Ohjelman muistialue: DATA KÄSKYT... Laskennan tulokset Käskyt ja data CPU Aritmeettislooginen yksikkö (ALU) Kontrolliyksikkö Käskyjen dekoodaus IO Kuva. von Neumannin tietokonearkkitehtuuri Keskusyksikkö (CPU, central processing unit) on muistista erillään ja suorittaa käskyt, minkä vuoksi käskyt ja data pitää siirtää muistista keskusyksikköön. Lisäksi laskennan tulokset on siirrettävä takaisin muistiin. Siirtämisen nopeus rajoittaa ohjelman suorituksen nopeutta, tätä ilmiötä sanotaan von Neumannin pullonkaulaksi (von Neumann bottleneck).

15 Itse asiassa von Neumannin arkkitehtuurin käyttöönotto johtikin ohjelmointikielten syntymiseen, kun oli mahdollista manipuloida tietokoneohjelmia samaan tapaan kuin dataa. Suurin osa nykyisistä ohjelmointikielistä onkin suunniteltu silmälläpitäen von Neumannin arkkitehtuuria. Kuten jo aiemmin mainittiin, tällaisia kieliä sanotaan imperatiivisiksi ohjelmointikieliksi. Imperatiivisen ohjelmointikielen tyypillisiä piirteitä ovat: muistia mallintavat muuttujat, sijoituslauseet, joiden avulla muistia manipuloidaan, komentojen peräkkäinen suorittaminen, toiston iteratiivinen muoto (rekursion vastapainona). Funktionaalisessa kielessä laskenta pohjautuu pääasiassa funktion soveltamiseen annettuihin parametreihin ilman sijoituslauseita ja iteraatiota. Tietojenkäsittelytieteilijät pitävät funktionaalisia kieliä monessa suhteessa parempina kuin imperatiivisia, mutta ne eivät ole nykyisessä tietokonearkkitehtuurissa niin tehokkaita kuin imperatiiviset kielet, joten ne eivät ole ainakaan toistaiseksi niin yleisiä kuin imperatiiviset kielet. Myös ohjelmistojen suunnitteluperiaatteet vaikuttavat voimakkaasti ohjelmointikielten suunnitteluun. Ensimmäiset (korkean tason) ohjelmointikielet syntyivät luvun loppupuolella; tällöin osoitettiin että "automaattinen ohjelmointi" oli mahdollista. Näihin aikoihin luotiin vielä nykyäänkin käytössä oleva FORTRAN-kieli luvulla luotiin satoja uusia ohjelmointikieliä eri periaatteiden nojalla; vuosikymmentä onkin sanottu Baabelin tornin ajaksi ([Kai], sivu 12). Kun siirryttiin 1970-luvulle, rakenteellinen ohjelmointi nousi pääperiaatteeksi ohjelmistojen suunnittelussa ja tällä vuosikymmenellä kehitetyt kielet ovatkin pääasiassa suunniteltu rakenteellisen ohjelmoinnin tarpeisiin. Antti-Juhani Kaijanahon ([Kai], sivu 13) mukaan 1970-luvun aikana onkin kehitetty merkittävimmät ideat ohjelmointikielten suunnittelussa, tämän jälkeen kielten kehitys on ollut maltillisempaa. Rakenteellisen ohjelmoinnin päämetodeiksi muodostuivat ylätasolta lähtevä suunnittelu (top-down design) ja askeleittain tarkentaminen (stepwise refinement). Käytettyjen ohjelmointikielten puutteiksi havaittiin tyypin tarkistuksen epätäydellisyys ja kontrollilauseiden puutteet (esimerkiksi goto -lausetta alettiin pitää haitallisena).

16 1970-luvun loppupuolella prosessiorientoitunut suunnittelumalli alkoi antaa tietä dataorientoituneelle mallille. Tämä johti aluksi abstraktien tietotyyppien käyttöönottoon ja lopulta olio-ohjelmoinnin syntymiseen. Olio-ohjelmointia tukevia kieliä alkoi ilmestyä 1980-luvulla (vaikka ajatuksena se ei olekaan niin uusi). Olioohjelmointikielten valta-asema osoittaa dataorientoituneen suunnittelumallin vallitsevuutta. Prosessiorientoitunut suunnittelukin on kuitenkin lyönyt leimansa nykykieliin sikäli, että monet valtakielistä (esimerkiksi Java ja C#, nykyään myös C++) tukevat rinnakkaisuutta. Lähteet [Har] Harsu, Maarit. Ohjelmointikielet. Periaatteet, käsitteet, valintaperusteet, Talentum [Hoa] Hoare, C.A.R. Hints on Programming Language Design, in C.A.R: Hoare and C.B. Jones, Essays in Computer Science, Prentice Hall [Kai] Kaijanaho, Antti-Juhani. Ohjelmointikielten periaatteet, Opetusmoniste, Jyväskylä 2010, URL: viitattu [Lou] Louden, Kenneth C. Programming Languages, Principles and Practice, PWS-KENT [Pra] Pratt, Terrence W. Programming Languages, Design and Implementation, Second edition, Prentice Hall [Sco] Scott, Michael L. Programming Language Pragmatics 2nd edition, Elsevier [Seb] Sebesta, Robert W. Concepts of Programming Languages 10th edition, Pearson 2013.

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

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

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

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

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

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

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

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

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

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

812341A Olio-ohjelmointi, I Johdanto

812341A Olio-ohjelmointi, I Johdanto 812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta

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

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n

Lisätiedot

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

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

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

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

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 1 TIE-20100 Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 2 Lähteet Luentomoniste pohjautuu vahvasti prof. Antti Valmarin vanhaan luentomonisteeseen

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

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

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

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19 Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari 1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli

Lisätiedot

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä TIE-20306 Principles of Programming Languages Seminaariesityksen essee Ryhmä 18: Heidi Vulli, Joni Heikkilä SISÄLLYSLUETTELO 1. Johdanto... 1 2. Ohjelmointikielen perusperiaatteet... 1 2.1 Paradigmat...

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

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi, 3.5. TYYPIT 59 indeksit voidaan siirtää kielitasolta oliotasolle siirryttäessä alkamaan nollasta. Vain mikäli indeksin alin arvo oliotasolla ei ole tiedossa ennen suorituksen alkua, on tarpeen lisätä taulukko-olioon

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

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Bootstrap / HTDP2 / Realm of Racket. Vertailu Bootstrap / HTDP2 / Realm of Racket Vertailu Bootstrap http://www.bootstrapworld.org/ Tarkoitettu yläkoululaisille (12-15v) Ohjelmointi on integroitu matematiikan opetukseen Materiaalina tuntisuunnitelmat

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

Maarit Harsu. O h j e l m o i n t i k i e l e t Periaatteet, käsitteet, valintaperusteet

Maarit Harsu. O h j e l m o i n t i k i e l e t Periaatteet, käsitteet, valintaperusteet Maarit Harsu O h j e l m o i n t i k i e l e t Periaatteet, käsitteet, valintaperusteet 6. elokuuta 2012 c 2012 Maarit Harsu Tämän Ohjelmointikielet-teoksen käyttöoikeutta koskee Creative Commons Nimeä-

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

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

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

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

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

Ohjelmistojen mallintaminen

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

Lisätiedot

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet Koka Ryhmä 11 Juuso Tapaninen, Akseli Karvinen 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet 1 1. Taustoja Koka on Daan Leijenin ja Microsoft:n kehittämä

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

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia Antti-Juhani Kaijanaho 16. helmikuuta 2009 Tyypitetyt ohjelmointikielet sisältävät paljon muitakin konstruktioita kuin yksinkertaisesti tyypitetyn lambda-kielen,

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

Osoittimet ja taulukot

Osoittimet ja taulukot C! ja taulukot 1.2.2018 Tiedotteita Tämän jälkeen taas pari väliviikkoa (tenttiviikko) Seuraava luento 22.2. Laskareita ei tenttiviikolla 12.2. 16.2. 2 ja muisti Muisti Keskusyksikkö Suorittaa muistissa

Lisätiedot

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

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

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

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

Tietorakenteet ja algoritmit

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

Lisätiedot

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

7/20: Paketti kasassa ensimmäistä kertaa

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

Lisätiedot

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen ADA Ohjelmointikieli Ryhmä 5 Henna Olli, Päivi Hietanen 1 JOHDANTO Ada on käännettävä ohjelmointikieli, joka kehitettiin vähentämään sulautettujen ja reaaliaikaisten järjestelmien käyttökustannuksia. Kieli

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

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

Haskell ohjelmointikielen tyyppijärjestelmä

Haskell ohjelmointikielen tyyppijärjestelmä Haskell ohjelmointikielen tyyppijärjestelmä Sakari Jokinen Helsinki 19. huhtikuuta 2004 Ohjelmointikielten perusteet - seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Tyyppien

Lisätiedot

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

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli Dart Ryhmä 38 Ville Tahvanainen Juha Häkli 1.LYHYESTI Dart on luokkapohjainen, yksiperintäinen, puhdas olio-ohjelmointikieli. Dart on dynaamisesti tyypitetty. Sovellukset on organisoitu modulaarisiksi

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 4. Joukot, relaatiot ja funktiot Osa 3: Funktiot 4.3 Funktiot Olkoot A ja B joukkoja. Funktio joukosta A joukkoon B on sääntö, joka liittää yksikäsitteisesti määrätyn

Lisätiedot

T Ohjelmistotekniikan seminaari

T Ohjelmistotekniikan seminaari T-106.5800 Ohjelmistotekniikan seminaari Scala-lukupiiri, kevät 2013 Teemu Sirkiä teemu.sirkia@aalto.fi 31.1.2013 Kenelle tämä lukupiiri on suunnattu? Scalasta kiinnostuneille Erityisesti heille, joita

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

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

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

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

Apuja ohjelmointiin» Yleisiä virheitä

Apuja ohjelmointiin» Yleisiä virheitä Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi

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

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

8/20: Luokat, oliot ja APIt

8/20: Luokat, oliot ja APIt Ohjelmointi 1 / syksy 2007 8/20: Luokat, oliot ja APIt Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/8 Kohti

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

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

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

Lyhyt kertaus osoittimista

Lyhyt kertaus osoittimista , syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin

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

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

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

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

Ohjelmointikielten kehityshistoriaa

Ohjelmointikielten kehityshistoriaa Ohjelmointikielten kehityshistoriaa Tässä osassa tarkastellaan tavallisimpien ja ohjelmointikielten kehityksen kannalta merkittävien kielten kehityshistoriaa. Pääasiallisena lähteenä on käytetty Sebestan

Lisätiedot

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

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

Tiina Partanen. Koodaamassa Matikantunnilla

Tiina Partanen. Koodaamassa Matikantunnilla Koodaamassa Matikantunnilla Racket-iskuryhmä? Ryhmä Tamperelaisia ja Ylöjärveläisiä opettajia, jotka testaavat ja kehittävät Racket-ohjelmointimateriaalia yläkoulun matematiikan (tietotekniikan ja fysiikan)

Lisätiedot

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen. Lause: Tyhjyysongelma ei ole osittain ratkeava; ts. kieli ei ole rekursiivisesti lueteltava. L e = { w { 0, 1 } L(M w ) = } Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia,

Lisätiedot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi Älysopimusten kehittäminen Sopimus suuntautunut ohjelmointi There are currently 5,000 blockchain developers. By 2020, we project a global need for over 500,000 - ConsenSys Älysopimus alustat q Ethereum

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet. 1. JOHDANTO C-kieli on perustana useille muille ohjelmointikielille. Esimerkiksi C++-kieli on kehitetty C- kielestä, Java- ja C#-kielen syntaksin perustana on toiminut C-kieli ja useat muutkin ohjelmointikielet

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

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

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

Lisätiedot

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Algoritmit 1. Luento 2 Ke Timo Männikkö

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

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä 812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus

Lisätiedot