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

Koko: px
Aloita esitys sivulta:

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

Transkriptio

1 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

2 c 2012 Maarit Harsu Tämän Ohjelmointikielet-teoksen käyttöoikeutta koskee Creative Commons Nimeä- Ei muutoksia-epäkaupallinen 1.0 Suomi -lisenssi. Nimeä Teoksen tekijä on ilmoitettava siten kuin tekijä tai teoksen lisensoija on sen määrännyt (mutta ei siten että ilmoitus viittaisi lisenssinantajan tukevan lisenssinsaajaa tai Teoksen käyttätapaa). Ei muutettuja teoksia Teosta ei saa muuttaa, muunnella tai käyttää toisen teoksen pohjana. Epäkaupallinen Lisenssi ei salli teoksen käyttöä ansiotarkoituksessa. Lisenssi on nähtävillä kokonaisuudessaan osoitteessa

3 Sisältö Alkusanat 9 1 Johdanto Taustaa Ohjelmointiparadigmat Ohjelmointikielten historiaa Ohjelmointikielten sukupolvet Esimerkki ohjelmointikielten kehittymisestä Ohjelmointikielen suunnittelu Ohjelmointikielen toteuttaminen Syntaksi ja semantiikka Taustaa Leksikaalianalyysi Kontekstittomat kieliopit Syntaksianalyysi LL-jäsennys LR-jäsennys Semanttinen analyysi Attribuuttikieliopit Tietoalkiot ja niiden sidonnat Taustaa Sijoituslause Lausekkeet ja niiden evaluointi Sidonnat Elinajat Näkyvyydet

4 4 SISÄLTÖ 4 Tyypit Tyyppien merkitys Tyyppien suunnittelunäkökohtia Vahva tyypitys Tyyppien jaottelu Skalaarityypit Numeeriset tyypit Loogiset tyypit Merkkityypit Luetellut tyypit Osavälityypit, alityypit ja johdetut tyypit Rakenteiset tyypit Taulukkotyypit Taulukon toteuttaminen Merkkijonotyypit Taulukkotyypin indeksirajat Tietuetyypit Osoitintyypit Osoittimien ominaisuuksia Osoittimien ongelmia Osoitinongelmien ratkaisuja Viitetyypit Joukkotyypit Tyyppien ekvivalenssi Lauseet Taustaa Koottu lause Valintalauseet Kaksisuuntainen valintalause Monivalintalause Toistolauseet Määrätty toistolause Määräämätön toistolause Vartioidut komennot Lauseiden todistaminen Sijoituslauseen todistaminen Kootun lauseen todistaminen Ehtolauseen todistaminen Toistolauseen todistaminen Invariantit ohjelmointikielissä

5 SISÄLTÖ 5 6 Aliohjelmat Taustaa ja terminologiaa Aliohjelmien parametriliitäntä Aliohjelmien parametrivälitys Parametrivälitysmekanismit Arvoparametrit Tulosparametrit Arvo-tulos parametrit Viiteparametrit Nimiparametrit Parametrivälitys ohjelmointikielissä Sivuvaikutuksista ja moninimisyydestä Moniulotteiset taulukot parametreina Aliohjelmat parametreina Kuormittaminen Aliohjelmien toteuttaminen Rekursiiviset aliohjelmat Poikkeusten hallinta Taustaa PL/I Ada Eiffel C Java Poikkeusten toteuttaminen Rinnakkaisuus Taustaa Terminologiaa Vuorottaisrutiinit Semaforit eli opastimet Monitorit Viestien välittäminen Synkroninen viestien välittäminen Asynkroninen viestien välittäminen Javan säikeet Kapselointimekanismit Taustaa Abstraktit tietotyypit

6 6 SISÄLTÖ 9.3 Moduulit Modula Ada Moduulityypit Luokat Olio-ohjelmointi Taustaa ja terminologiaa Imperatiivisen ja olio-ohjelmoinnin vertailu Oliokielten suunnittelunäkökohtia Operaatioiden sidonta Simula Smalltalk Eiffel C++, Java ja C# Oberon Ada Luokkien toteuttaminen Dynaamisen sidonnan toteuttaminen Yksittäisperiytymisen toteuttaminen Moniperiytymisen toteuttaminen Muotit Taustaa Makrot ja muotit Esimerkki muottien tarpeesta Ada Muottien objektiparametrit Muottien tyyppiparametrit Muottien aliohjelmaparametrit C Aspektiohjelmointi Taustaa Esimerkkejä aspektien tarpeesta AspectJ Aspektien tunnistaminen Koodin liittäminen aspektiin Poikkeusten hallinta aspektina Rinnakkaisuus aspektina Aspektien toteuttaminen

7 SISÄLTÖ 7 13 Funktionaalinen ohjelmointi Ominaisuuksia Korkeamman asteen funktiot Evaluointijärjestys Lisp ja Scheme Taustaa Erikoisfunktioita Kontrollirakenteet Lambda-lausekkeet Koodia tuottavat funktiot ML Haskell Logiikkaohjelmointi Taustaa Klausuulit ja päättelyprosessi Prologin ominaisuuksia Lauseet Lausekkeiden evaluointi Prologin resoluutio Prologin tietorakenteet Prologin kyselyiden tehokkuudesta Alitavoitteiden järjestys Katkaisu Prologin puutteita Skriptiohjelmointi Taustaa Skriptiohjelmoinnin ja järjestelmäohjelmoinnin vertailu Perl Esittely Tietotyypit Muuttujien näkyvyydet ja elinajat Aliohjelmat Kontrollirakenteet Mallin tunnistaminen Python Esittely Tietoalkiot Kontrollirakenteet Funktiot

8 8 SISÄLTÖ Moduulit ja luokat JavaScript Esittely Olioiden luominen Valmiit oliot ja funktiot Kirjallisuutta 292 Hakemisto 295

9 Alkusanat Tämä kirja on kirjoitettu alun perin Tampereen teknillisen yliopiston kurssille Ohjelmointikielten periaatteet, jota olen luennoinut. Kirja on syntynyt käyttämäni luento- ja kurssimateriaalin pohjalta. Tärkeimpänä taustamateriaalina olen käyttänyt seuraavia alan englanninkielisiä oppikirjoja: M. L. Scott. Programming Language Pragmatics. Morgan Kaufmann, R. W. Sebesta. Concepts of Programming Languages. Addison-Wesley, R. Sethi. Programming Languages: Concepts & Constructs. Addison-Wesley, Sebestan kirjasta on olemassa myös uudempi painos vuodelta 2004, mutta mielestäni vuoden 2002 versio on parempi. Ohjelmointikielten periaatteista on tehty opetusmonisteita, joita olen myös käyttänyt kirjan lähteinä: A.-J. Kaijanaho. Ohjelmontikielten periaatteet. Luentomateriaali, Tietotekniikan laitos, Jyväskylän yliopisto, syyskuu 2002, 79 ss. T. Knuutila. Ohjelmointikielten periaatteet. Luentomateriaali. Informaatioteknologian laitos, Turun yliopisto, toukokuu 2001, 148 ss. K. Koskimies. Ohjelmointikielten periaatteet. Luvut 1 3 raportissa C ja luvut 4 10 raportissa C Tietojenkäsittelyopin laitos, Tampereen yliopisto, joulukuu 1989 helmikuu 1990, yht. 213 ss. Kirja käsittelee ohjelmointikielissä esiintyviä rakenteita, niiden vaihtoehtoja ja toteutustapoja. Kirjassa on esimerkkejä useista eri ohjelmointikielistä, mutta niitä tarkastellaan lähinnä siinä yhteydessä, millaisia piirteitä jokin tietty kieli tarjoaa. Lukijan oletetaan osaavan ohjelmoida edes jollakin ohjelmointikielellä, jolloin hän pystyy tekemään vertailuja tuntemansa kielen ja muiden kielten tarjoamien vaihtoehtojen välillä. Kirja ei käy mitään 9

10 10 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet ohjelmointikieltä systemaattisesti läpi, vaan kielistä on esimerkkejä sovitettuna kuhunkin aiheeseen. Kirjassa on joissakin kohdissa käsitelty kielten eri piirteiden suunnittelunäkökohtia. Niitä ei kuitenkaan ole otettu mukaan siinä ajatuksessa, että mitä tulee ottaa huomioon silloin, kun lukija on suunnittelemassa jotakin uutta ohjelmointikieltä. Tämäkään ajatus ei tietenkään ole täysin mahdoton, mutta ensisijainen tarkoitus on se, että tuntiessaan suunnittelunäkökohdat lukija pystyy pohtimaan olemassa olevien kielten ominaisuuksia, näkemään erilaisia vaihtoehtoja ja vertailemaan eri kieliä. Suunnittelunäkökohtien esittelyn tavoitteena on siis auttaa lukijaa huomaamaan, millaisia vaihtoehtoisia piirteitä kielissä on, millainen ratkaisu johonkin tiettyyn kieleen on valittu, millaisia valintaperusteita voi olla ja mitä seurauksia valinnoilla on (esimerkiksi piirteiden toteutukselle). Kirjan kirjoittamisen aikana olen saanut palautetta alan asiantuntijoilta. Käsikirjoitusta ovat lukeneneet ja kommentoineet Kai Koskimies, Tommi Mikkonen ja Mika Katara Tampereen teknillisestä yliopistosta sekä Ari Vesanen Oulun yliopistosta. Lisäksi olen saanut vinkkejä kirjan aihealueeseen liittyen Jorma Tarhiolta Teknillisestä korkeakoulusta. Kiitokset heille kaikille. Tampereella tammikuussa 2005 Maarit Harsu

11 Luku 1 Johdanto 1.1 Taustaa Käsitteen ohjelmointikieli määritteleminen on vaikeaa. Voidaan ajatella, että ohjelmointikieli on väline tai käyttöliittymä, jolla ihminen pystyy kertomaan tietokoneelle, mitä sen pitäisi tehdä. Tämän määritelmän heikkoutena on kuitenkin liiallinen laajuus. Määritelmän mukaan esimerkiksi HTML (hypertext markup language) luettaisiin ohjelmointikieleksi, mitä ei kuitenkaan yleensä haluta. Määritelmää voidaan rajoittaa kertomalla jotain kielen ilmaisuvoimasta. Tavallisesti ohjelmilla tarkoitetaan sellaisia rakenteisia tekstejä, joita pystytään käsittelemään Turingin koneella. Näin ohjelmointikieli on väline, jolla saadaan tietokone simuloimaan universaalia Turingin konetta. Tässä määritelmässä on kuitenkin se ongelma, että todellisten tietokoneohjelmien kohdalla eteen tulee resurssipula, kun taas Turingin koneen nauha on ääretön. Jos tämän seikan ottaa huomioon määrittelyssä, niin määritelmästä tulee monimutkainen ja hankala käyttää [Kai02]. Alussa esitetyllä määritelmällä on myös se heikkous, että se ei sano mitään siitä, missä muodossa tietokoneelle annettavien komentojen tulee olla. Tietokoneiden alkuaikoina toimintojen valitseminen tapahtui asettamalla kytkimiä sopiviin asentoihin. Kytkinten asettelun määräämää käyttöliittymää ei kuitenkaan yleensä haluta laskea ohjelmointikieleksi. Määritelmää voidaan rajoittaa niin, että ohjelmointikieli on merkintäjärjestelmä, joka kuvaa laskentaa sellaisessa muodossa, että se on sekä ihmisen että koneen luettavissa [Lou03]. Määritelmä sulkee pois myös HTML:n, koska se ei kuvaa laskentaa. Sen sijaan visuaaliset ohjelmointikielet tulevat lasketuiksi mukaan, mutta niitä ei käsitellä kirjassa tämän enempää. Ohjelmointikielten tutkimiseen voidaan löytää useita perusteluita. Oh- 11

12 12 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet jelmointikielten yleisten periaatteiden tuntemisella on vaikutusta [Seb02] uusien ohjelmointikielten omaksumiseen ajatusten esittämiskykyyn ohjelmointikielen valintaan kielen toteutuksen ymmärtämiseen omien ohjelmointikielten suunnitteluun. Ohjelmointikielen oppiminen voi perustua aikaisemmin opittuihin kieliin, esimerkiksi C++-ohjelmoijien on helppo oppia Java samoin kuin Pascalosaajien Modula-2. Myös vähemmän toisiaan muistuttavissa kielissä on paljon samanlaisia piirteitä, joita voidaan pitää ohjelmointikielten peruskäsitteinä. Niiden tunteminen helpottaa myös aivan uudenlaisen ohjelmointikielen oppimista. Samoin kuin luonnollisen kielen oppimisessa myös ohjelmointikielen oppimisessa yleiset tiedot kieliopillisista rakenteista edistävät asioiden omaksumista. Ohjelmoijan käyttämän kielen ilmaisuvoima vaikuttaa siihen, millä tarkkuudella tai syvyydellä ohjelmoija pystyy ajattelemaan ja esittämään ajatuksiaan. Erityisesti abstrakteista käsitteistä puhuminen ei ole mahdollista, jos kieli ei sitä tue. Kieli siis rajoittaa sitä, mistä asioista on mahdollista kommunikoida. Vain yhtä ohjelmointikieltä osaava ohjelmoija joutuu rajoittumaan tämän kielen tarjoamiin käsitteisiin. Laajempi tuntemus ohjelmointikielten yleisistä käsitteistä sen sijaan mahdollistaa laajempialaisen pohdinnan ohjelmoinnin ja ohjelmointikielten käsitteistä. Useita ohjelmointikieliä osaava ohjelmoija voi myös simuloida muiden kielten ominaisuuksia ohjelmoidessaan jollakin kielellä, jossa jotakin toivottua ominaisuutta ei ole. Ohjelmoija, joka osaa vain yhtä ohjelmointikieltä, valitsee mielellään tämän kielen ohjelmointitehtäviinsä eikä välttämättä ole halukas oppimaan uusia kieliä. Ohjelmointikielten yleiset periaatteet tunteva ohjelmoija pystyy paljon objektiivisemmin tekemään vertailuja eri kielten välillä ja valitsemaan aina kuhunkin tarkoitukseen sopivimman kielen. Ohjelmointikieleen sisällytettävien ominaisuuksien yhtenä valintakriteerinä on se, miten piirteet voidaan toteuttaa ja miten helppoa toteuttaminen on. Tietämys ohjelmointikielten toteutusnäkökohdista auttaa ymmärtämään, miksi ohjelmointikielet ovat sellaisia kuin ovat. Tämä taas johtaa siihen, että ohjelmoija osaa paremmin käyttää kieltä järkevästi eli niin kuin kieli on suunniteltu käytettäväksi. Toteutusnäkökohtien tunteminen auttaa myös kirjoittamaan tehokkaampia ohjelmia, koska ohjelmoija osaa valita käyttämänsä rakenteet niiden tehokkuuden ja tilanteeseen sopivuuden perusteella. Esi-

13 Johdanto 13 merkiksi tuntemalla rekursion toteutustavan ohjelmoija ymmärtää, miksi se voi olla tehottomampi kuin vastaava iteratiivinen ratkaisu. Vain hyvin harvat ohjelmoijat suunnittelevat ja toteuttavat oikeita ohjelmointikieliä. Ohjelmointikielten suunnitteluperiaatteista on kuitenkin hyötyä myös pienimuotoisemmissa tehtävissä. Ohjelmissa voidaan joutua lukemaan ja kirjoittamaan erilaisia rakenteisia tekstejä. Tällaisten tehtävien suorittamisessa on hyvä tietää, millainen käsiteltävän tekstin rakenne tulisi olla, jotta sitä olisi helppo ohjelmallisesti lukea, selata ja jäsentää. 1.2 Ohjelmointiparadigmat Sanalla paradigma on useita merkityksiä. Ohjelmointikielten yhteydessä sillä tarkoitetaan kokonaisuutta, joka muodostuu seuraavista kolmesta osasta: laskennallisesta mallista, käsitteistöstä ja välineistöstä [BG94]. Perinteisessä imperatiivisessa paradigmassa laskennallinen malli perustuu RAMkoneeseen (random access machine) eli hajasaantikoneeseen. Jos halutaan toteuttaa esimerkiksi lajitteluohjelma, käsitteistöön kuuluvat kielen rakenteet kuten tietueet, osoittimet, toistorakenteet ja tiedostot. Välineistö taas tarkoittaa sitä, miten ohjelmoija kielen käsitteitä käyttää. Lajitteluohjelman tapauksessa välineistöä voivat olla linkitetty lista sekä syöttö- ja tulostustoiminnot. Yleisesti ottaen paradigma antaa mahdollisuudet tai puitteet eri asioiden toteuttamiseen. Eri paradigmoissa on erilaiset mahdollisuudet eri asioiden toteuttamiseen. Jotkin tehtävät onnistuvat helpommin jossakin ohjelmointiparadigmassa, jotkin toiset asiat taas jossakin toisessa paradigmassa. Ohjelmointikielien jaottelu eri paradigmoihin ei ole välttämättä kovin helppoa. Yksi usein käytetty jaottelu on [Weg89]: Imperatiivinen paradigma (käskykielet) lohkorakenteinen (proseduraalinen) oliokeskeinen hajautettu (rinnakkainen) Deklaratiivinen paradigma (esittelykielet) funktionaalinen looginen tietokantakielet.

14 14 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet Jaottelussa ei kuitenkaan pystytä erottelemaan esimerkiksi rinnakkaista funktionaalista paradigmaa tavanomaisesta (peräkkäisestä) funktionaalisesta paradigmasta, mikä onnistuu jaottelussa [BG94]: Paradigma imperatiivinen (proseduraalinen) oliokeskeinen funktionaalinen looginen Ohjelmointimalli peräkkäinen rinnakkainen. Jaottelussa valitaan paradigma, ja valittuun paradigmaan liitetään ohjelmointimalli, joka voi olla peräkkäinen tai rinnakkainen. Ohjelmointimallin ansiosta erottelu rinnakkaisten funktionaalisten kielten ja peräkkäisten funktionaalisten kielten välillä onnistuu. Tälläkin jaottelulla on kuitenkin puutteensa. Se ei pysty sovittamaan esimerkiksi funktionaalista oliokieltä mihinkään ryhmään, mikä onnistuisi, jos myös oliokeskeisyys otettaisiin mukaan omana ohjelmointimallinaan samalla tavalla kuin tieto rinnakkaisuudesta tai peräkkäisyydestä. Kahdessa edellä esitetyssä jaottelussa suhtaudutaan eri tavalla siihen, kuuluvatko oliokielet mukaan imperatiiviseen paradigmaan vai eivät. Jos halutaan erityisesti korostaa imperatiivisuutta (ilman oliokeskeisyyttä), voidaan puhua proseduraalista kielistä. Jatkossa tässä kirjassa otetaan se kanta, että imperatiivinen paradigma ei sisällä oliokieliä. Ohjelmointikielten jaotteluita on muitakin. Osterhout erottelee yhteen ryhmään järjestelmäohjelmointikielet, joita ovat esimerkiksi Pascal, C, C++ ja Java, ja toiseen ryhmään skriptikielet, kuten Perl, Python ja JavaScript [Ous98]. Järjestelmäohjelmointikielet on tarkoitettu komponenttien toteuttamiseen symbolisia konekieliä korkeammalla tasolla, kun taas skriptikielillä voidaan yhdistellä olemassa olevia komponentteja toisiinsa. Paradigmojen jaotteluun ei siis ole olemassa yhtä yleisesti hyväksyttyä tapaa. Vaikka jaottelu olisi millainen tahansa, ongelmia syntyy ainakin siinä, että on olemassa myös moniparadigmakieliä, jotka sisältävät piirteitä useasta eri paradigmasta. Lisäksi ohjelmointikieliin tulee uusia ominaisuuksia niin, että uudet kielet eivät aina helposti sovi olemassa oleviin jaotteluihin. Esimerkkinä uusista ominaisuuksista ovat joidenkin kielten aspektiominaisuudet, vaikkakaan aspektiohjelmointia ei (ainakaan vielä) voi pitää

15 Johdanto 15 omana paradigmanaan, koska aspektikielillä on mahdollista ohjelmoida välittämättä aspektiominaisuuksista. Tarkastellaan seuraavaksi eri paradigmojen ominaispiirteitä. Imperatiiviselle paradigmalle olennaista on tuhoava sijoituslause, jossa uuden arvon sijoittaminen tuhoaa vanhan arvon. Sijoituslause on myös sikäli oleellisessa asemassa, että laskenta perustuu siihen, millaisia arvoja eri muuttujilla eri tilanteissa on. Kontrollin siirtäminen tapahtuu eksplisiittisesti, ja kontrollin kulkua on suhteellisen helppo seurata ohjelmatekstistä. Esimerkkejä imperatiivista paradigmaa noudattavista kielistä ovat Fortran, Pascal, C ja Ada83. Oliokeskeisessä paradigmassa oliot ovat tärkeässä asemassa: niitä luodaan, ja ne välittävät ja vastaanottavat viestejä. Samanlaiset (saman tyyppiset) oliot kuuluvat samaan luokkaan. Luokkia voidaan myös periyttää toisistaan. Esimerkkejä oliokielistä ovat Simula67, Eiffel ja Smalltalk. C++ on hybridi kieli siinä mielessä, että se sisältää sekä imperatiivisen että olioohjelmoinnin piirteitä. Funktionaalisissa kielissä laskenta tapahtuu funktioiden avulla, joilla ei yleensä ole sivuvaikutuksia. Puhtaissa funktionaalisissa kielissä ei ole sijoituslausetta, vaan kaikki arvot saadaan funktioiden tuloksina. Esimerkkejä funktionaalisista kielistä ovat Lisp, Scheme (Lispin murre), ML (Meta Language), Haskell ja Miranda. Näistä kahta jälkimmäistä voidaan pitää puhtaana funktionaalisena kielenä. Loogisessa paradigmassa keskeisessä asemassa ovat logiikan kaavat. Ohjelman suoritus tarkoittaa loogisen väittämän todistamista ohjelman loogiseksi seuraukseksi. Looginen paradigma on suhteellisen uusi, se on syntynyt vasta 1970-luvulla. Yleisin käytettävä logiikkaohjelmoinnin kieli on Prolog, jolla on useita murteita. Rinnakkaisessa paradigmassa oleellisessa asemassa ovat prosessit, joita voi olla useita yhtäaikaa suoritettavana. Yhtäaikaisesta suorituksesta johtuen tärkeää on myös prosessien tahdistaminen eli synkronointi, jolla varmistetaan, että prosessit ovat sopivissa suorituksen vaiheissa keskinäisen tiedon välityksen onnistumiseksi. Rinnakkaisia ohjelmointikieliä ovat Occam ja SR (Syncronizing Resources). Myös Java ja Ada sisältävät välineitä rinnakkaiseen ohjelmointiin. 1.3 Ohjelmointikielten historiaa Kuvassa 1.1 on esitetty joitakin ohjelmointikieliä ja niiden pohjautumista toisiinsa. Mustalla pallolla merkityistä kielistä on nimi näkyvissä. Useimmat näistä kielistä esiintyvät kirjan myöhemmissä esimerkeissä. Valkoisella

16 16 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet pallolla merkittyjen kielten nimi ei ole näkyvissä. Nimen puuttuminen voi johtua siitä, että kieli ei ole kovin merkittävä tämän kirjan kannalta tai siitä, että nimen poisjättämisellä on saatu kuvaa vähän selvemmäksi. Kuvasta 1.1 voidaan löytää joitakin kehityslinjoja. Fortranin eri versiot muodostavat oman linjansa. Fortran II on merkitty valkoisella pallolla. Fortran III on ollut olemassa, mutta se ei koskaan levinnyt laajaan käyttöön, eikä sitä myöskään näy kuvassa. Fortran90:n nimi on jätetty pois kuvan selventämiseksi. C-perheen kielen kielet erottuvat omana linjanaan. B-kielen edeltäjän BCPL:n nimi puuttuu. Algol-perheen kieliin kuuluvat esimerkiksi Pascal ja Modula-2. Funktionaalisilla kielillä on oma linjansa, joka kuitenkin yhdistyy imperatiivisiin kieliin Pascalin kautta. Logiikkakieli Prolog ei ole yhteydessä muihin kieliin. Ohjelmointikielten historia [Seb02, Kos89] alkaa 1950-luvun alkupuolelta, jolloin symbolisten konekielten siirrettävyysongelmiin alettiin etsiä ratkaisua automaattisesta ohjelmoinnista. Siinä ohjelmoija esittää ongelman kuvauksen jollakin formaalilla kielellä, minkä jälkeen jokin erityinen ohjelma tuottaa siitä konekielisen ohjelman, joka ratkaisee ongelman. Nykyisessä terminologiassa formaalit kielet tarkoittavat korkean tason kieliä ja konekielisen ratkaisun tuottajia kutsutaan kääntäjiksi. Aluksi ihmisten oli vaikea uskoa, että automaattinen ohjelmointi voisi olla mahdollista. Fortrania voidaan pitää nykyisten lausekielten kantaisänä, joka myös edisti luottamusta automaattisen ohjelmoinnin mahdollisuuksiin. Tosin ensimmäisen Fortran-kääntäjän toteuttaminen oli vaikea tehtävä: siihen meni kolme vuotta ja 18 ihmistyövuotta. Pääkehittäjänä toimi John Backus, ja kehitys tapahtui IBM:n tuella. Fortranissa oli joitakin nykyisten ohjelmointikielten piirteitä: taulukkomuuttujat, toistolause (for-silmukkaa vastaava) ja valintalause (if-lausetta vastaava). Fortran levisi laajaan käyttöön, ja sen uudemmat versiot ovat edelleen käytössä. Fortranin tieteellisen laskennan vastapainoksi John McCarthy havaitsi tarpeen symboliselle tiedonkäsittelylle. Aluksi hän yritti laajentaa Fortrania tähän suuntaan, mutta totesi kuitenkin paremmaksi vaihtoehdoksi kehittää uuden kielen: Lispin. Kehitystyö tapahtui aluksi paperilla, myös Lispohjelmat käännettiin aluksi paperilla. Sitten huomattiin, että alun perin teoreettiseksi leluksi tarkoitettu Lisp-funktio eval voi toimia Lisp-tulkkina. Lispin kehitys on myöhemmin johtanut muiden funktionaalisten kielten kehittymiseen. Myös Cobol kehitettiin 1950-luvulla kaupallista laskentaa ja hallinnollisia sovelluksia varten. Kieli on vieläkin käytössä. Seuraavaksi kehitys johti Algol60:n syntymiseen, koska haluttiin laitevalmistajasta riippumaton algoritmien toteuttamiseen tarkoitettu kieli. Kehitystyö tapahtui saksalais-amerikkalaisena yhteistyönä. Algol60 oli ensim-

17 Johdanto Cobol Fortran I Fortran IV CPL PL/I Basic Algol60 Simula I Lisp B C Fortran 77 C++ Algol68 Pascal Modula-2 Smalltalk Ada83 Simula67 ML Prolog Scheme Common Lisp 1990 Oberon Modula-3 Visual Basic Eiffel Haskell Java Fortran 95 Ada C# Kuva 1.1: Ohjelmointikielten sukupuu

18 18 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet mäinen lohkorakenteinen kieli, lisäksi siinä oli mukana nykyisen kaltaiset kontrollirakenteet ja rekursio. Algol60:n suunnittelussa pidettiin tärkeänä sitä, että ohjelmat pystytään mekaanisesti kääntämään konekielelle. Algol60:n suunnitteluprosessin tuloksena saatiinkin uusi notaatio ohjelmointikielten syntaksin kuvaamiseen: BNF (Backus-Naur form). Algol60 ei kuitenkaan akateemisen maineensa vuoksi levinnyt niin laajaan käyttöön kuin Fortran, mutta sillä on ollut kuitenkin tärkeä merkitys myöhemmin kehitettyjen kielten suunnittelussa. Algol60:n pohjalta kehitettiin useita merkittäviä kieliä. Yksi näistä oli Norjassa kehitetty Simula. Kielen keskeisenä ajatuksena oli simulointi, josta johdettiin luokan käsite. Simula oli siis ensimmäinen oliokieli. Simula I:ssa oli mukana luokat ja oliot, Simula67:ssa mukaan otettiin myös periytyminen. Myös Basic syntyi 1960-luvulla. Sen kehitysperiaatteena oli luoda helppo kieli, jonka käyttö olisi helppo opettaa kenelle tahansa. Basicin lähtökohtana oli Algol60, mutta monia tärkeitä piirteitä jätettiin pois, esimerkiksi lohkorakenne. Sitä pidettiin liian vaikeana. Edelleen 1960-luvulla kehitettiin PL/I (tai PL/1, programming language one). Sen oli tarkoitus olla universaali ohjelmointikieli, joka sopisi erilaisiin tehtäviin. Tuolloin ohjelmointitehtävät (ja ohjelmoijat) voitiin jakaa kahteen ryhmään. Toinen ryhmä harrasti tieteellistä laskentaa, jossa käsiteltiin liukulukuja, taulukoita ja aliohjelmia. Toisen ryhmän tehtävänä taas oli hallinnollinen tietojenkäsittely, jossa tarvittiin kiintolukulaskentaa, tehokasta siirräntää (I/O) ja merkkijonojen käsittelyä. PL/I:n tarkoitus oli sopia molempiin tarkoituksiin, ja siihen yhdistettiin piirteitä Fortranista, Algol60:sta ja Cobolista. Kieli oli 1970-luvulla suosittu, vaikka sitä voidaan pitää laajana ja vaikeana kielenä. Siinä oli kuitenkin joitakin tärkeitä uusia piirteitä kuten poikkeusten hallinta ja rinnakkaisuus. Algol60:n pohjalta alettiin kehittää uutta kieltä: Algol68:a. Kielen käsitteistön oli tarkoitus olla systemaattisempi kuin Algol60:n. Kieli jäi kuitenkin enimmäkseen käyttämättä laajuutensa ja vaikeaselkoisen määrittelynsä vuoksi. Algol68:n kehityksessä oli mukana Niklaus Wirth, joka paheksui Algol68:n monimutkaisuutta. Hän jäi kuitenkin mielipiteensä kanssa vähemmistöön. Tästä syystä Wirth alkoi kehittää kieltä, joka olisi selkeä, yksinkertainen ja helppo toteuttaa. Näin syntyi Pascal. Siinä oli selkeä tietotyypin käsite, jonka avulla käyttäjä pystyi määrittelemään omia tietotyyppejään. Pascalissa oli paljon hyviä oivalluksia, mutta myös joitakin puutteita. Pascal on ollut lähtökohtana monille myöhemmille kielille, ja yksi tärkeä merkitys on se, että Pascalin puutteet osattiin ottaa huomioon myöhemmissä kielissä. Wirth on kehittänyt Pascalin pohjalta Modula-2:n ja Oberonin.

19 Johdanto 19 Ohjelmistotuotanto kasvoi voimakkaasti 1970-luvulla, ja laitekustannukset pienenivät. Näin ohjelmointikustannusten merkitys tuli hyvin oleellisiksi. Ohjelmointi oli kuitenkin hyvin virhealtista, ja tarvittavia resursseja oli vaikea ennakoida. Käytössä oli useita eri kieliä ja niiden murteita, ja ohjelmat olivat vaikeasti siirrettäviä. Lopulta ajauduttiin niin kutsuttuun ohjelmistokriisiin. Ratkaisuna kriisiin oli rakenteellinen ohjelmointi, jota monet 1970-luvulla kehitetyistä kielistä tukivat. Usein kielet tukivat myös laajempaa ohjelmistotuotantoa, esimerkiksi Modula-2 moduulikäsitteen muodossa. Myös tietoabstraktio löytyy monista tämän aikakauden kielistä. Dennis Ritchie kehitti 1970-luvulla C-kielen, joka sai vaikutteita Algol68:sta, vaikka ei sitä syntaksiltaan muistutakaan. Kielen varsinaisia edeltäjiä ovat CPL, BCPL ja B. Sekä BCPL että B ovat tyypittömiä kieliä, mikä oli ajalle epätyypillistä. C oli alunperin tarkoitettu raakaan järjestelmäohjelmointiin, ja sillä kirjoitettiin Unix-käyttöjärjestelmä kokonaan uudestaan. C-kielen tyyppitarkistukset eivät ole täydellisiä, mistä syystä ohjelmista saadaan toisaalta joustavia ja tehokkaita mutta toisaalta virhealttiita. C-kielessä ei käsitteellisesti ole juurikaan mitään uutta, mutta siitä tuli hyvin suosittu ja siksi merkittävä. Funktionaalisten kielten kehittelyä jatkettiin 1970-luvulla, jolloin syntyi useita Lisp-johdannaisia, esimerkiksi Scheme. Alkunsa sai myös ML, joka on tyypitetty funktionaalinen kieli. Siinä on paljon vaikutteita Lispistä, mutta se on syntaksiltaan Algol-tyyppinen. Myös oliokieliä kehitettiin, jolloin syntyi Smalltalk. Sitä voidaan pitää puhtaimpana oliokielenä. Itse kieli on hyvin pieni, mutta sen peruskirjasto on hyvin suuri. Lisäksi kehitettiin myös Prolog, joka logiikkakielenä on täysin erilainen kuin muut ohjelmointikielet. Seuraavalla vuosikymmenellä syntyi Ada (Ada83), joka kehitettiin Yhdysvaltain puolustusministeriön toimeksiannosta. Kieli on saanut nimensä Augusta Ada Byronin mukaan, jonka on sanottu olleen maailman ensimmäinen ohjelmoija. Ada syntyi tarkan vaatimusraportin pohjalta. Kehitystyössä tarkasteltiin olemassa olevia kieliä, ja etsittiin niiden joukosta sopivia lähtökohtia uudelle kielelle. Adan perusajatuksena oli saada ohjelmista luotettavia, siksi kielessä on vahva tyypitys, joten virheet huomataan mahdollisimman aikaisessa vaiheessa. Muita kielen piirteitä ovat tietoabstraktio, rinnakkaisuus, geneerisyys (tyyppien parametrointi) ja poikkeusten hallinta. Kieltä pidettiin aikanaan laajana mutta silti suhteellisen helppona oppia. Ada83:n pohjalta on myöhemmin kehitetty Ada95, johon on lisätty olioparadigman piirteitä kuten periytyminen ja monimuotoisuus (polymorfisuus). Myös rinnakkaisuuteen liittyviä mekanismeja on parannettu. Uusia oliokieliä kehitettiin 1980-luvulla. Bjarne Stroustrup laajensi C- kieltä olioilla, jolloin syntyi C++. Bertrand Meyer kehitti Eiffel-kielen, jota

20 20 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet voidaan pitää puhtaana oliokielenä. Syntaksiltaan Eiffel muistuttaa Adaa. Ohjelmissa on mahdollista käyttää esi- ja jälkiehtoja sekä invariantteja, joten kieli tukee ohjelmien formaalia todistamista. Olio-ohjelmointi yleistyi 1990-luvulla, jolloin C++:n pohjalta kehitettiin Java. Tarkoituksena oli säilyttää C-kielestä lähtöisin oleva joustavuus mutta samalla parantaa turvallisuutta. Javassa ei ole osoittimia, vaan ne on korvattu viitteillä. Kielessä on automaattinen roskien keruu. Javassa moniperiytyminen ei ole mahdollista muuten kuin rajapintojen avulla. Javan ja C++:n pohjalta on myöhemmin kehitetty C#. Kun Javassa joitakin C++:n piirteitä jätettiin pois, niin C#:ssa monet näistä piirteistä on tuotu takaisin, tosin hieman eri muodossa. Myös Internetin käyttö alkoi ja yleistyi 1990-luvulla, millä oli vaikutusta ohjelmointikielten kehitykseen, erityisesti skriptikielten yleistymiseen. Kielet sopivat hyvin HTML-dokumenttien luomiseen ja käsittelemiseen, koska niillä kirjoitettua koodia voidaan helposti sisällyttää HTML-dokumentteihin. 1.4 Ohjelmointikielten sukupolvet Ohjelmointikielten kehittyminen jaetaan tavanomaisesti viiteen sukupolveen. Eri sukupolvet kuvaavat sitä, miten lähellä kieli on suorittavaa laitetta ja toisaalta miten kaukana se on ohjelmoinnin kohteesta eli sovellusalueesta. Ensimmäisen sukupolven kielet olivat konekieliä. Tällöin ohjelmointi oli sananmukaisesti oli koodaamista: ratkaisualgoritmi piti muuttaa binaarikoodiksi. Muistiosoitteet olivat viittauksia absoluuttisiin muistiosoitteisiin. Jos ohjelman keskelle piti lisätä uusi käsky, ohjelman loppuosan sijainti muistissa muuttui, joten myös loppuosaan kohdistuvat viittaukset piti päivittää. Toisen sukupolven kielillä eli symbolisella konekielillä ohjelmointi oli huomattavasti helpompaa. Käskyillä oli selkeät nimet ja muistiosoitteet olivat symbolisia. Ohjelmia voitiin kääntää erillisiksi moduuleiksi, jotka voitiin myöhemmin linkittää suoritettavaksi ohjelmaksi. Ohjelmia oli kuitenkin vaikea lukea (varsinkin muiden kuin alkuperäisen kirjoittajan), ja ne olivat hyvin koneriippuvia. Kolmannen sukupolven kielillä tarkoitetaan korkean tason lausekieliä, joita ovat useimmat nykyisin käytössä olevat ohjelmointikielet. Tyypillisiä piirteitä ovat abstraktit kontrollirakenteet ja tietoalkioiden tyypitys. Aliohjelmien avulla voidaan rakentaa uusia abstrakteja käskyjä. Ohjelmia on suhteellisen helppo lukea, ja ne ovat helposti siirrettäviä. Neljättä sukupolvea tarkoittava lyhenne 4GL esiintyy usein sovelluskehittimien yhteydessä. Sovelluskehitintä voidaan ajatella ohjelmana, jol-

21 Johdanto 21 la pystyy helposti generoimaan jonkin tietyn sovellusalueen ohjelmia. Tällaiset ohjelmointikielet ovat kuitenkin epäyhtenäisiä, esimerkiksi tietyn valmistajan kaupallisia tuotteita. Sovelluskehittimissä kieli on usein liitetty graafiseen käyttöliittymään. Viidennen sukupolven kielillä eli asiantuntijajärjestelmillä pyritään mallintamaan ihmisen ajattelua ja päätöksentekoa. Edellä esitettyä sukupolvijaottelua voidaan pitää keinotekoisena siinä mielessä, että useimmat nykyisistä ohjelmointikielistä kuuluvat kolmanteen sukupolveen. Neljäs ja viides sukupolvi nähdään usein vain mainoslauseina. Lisäksi funktionaalinen ohjelmointi ei selvästi kuulu mihinkään sukupolveen. Järkevämpää onkin esittää pidemmälle menevä jaottelu kolmannen sukupolven sisällä [Knu01]: 1. koneriippumattomat kielet 2. tyyppi- ja kontrollirakenteita sisältävät kielet 3. kontrolliabstraktiota (aliohjelmia) tukevat kielet 4. tietoabstraktiota (moduuleja, olioita) tukevat kielet 5. geneerisyyttä ja monimuotoisuutta tukevat kielet. Luettelossa esiintyvät kielten ominaisuudet tulevat tarkemmin esiin kirjan myöhemmissä luvuissa. 1.5 Esimerkki ohjelmointikielten kehittymisestä Tässä kohdassa tarkastellaan esimerkin avulla, millaisten vaiheiden kautta ohjelmointikielten kehittyminen voi tapahtua. Tavoitteena on usein kielten tason nostaminen eli tehtävien abstrahointi laitetasolta lähemmäksi ihmisen ajattelutavan käsitteitä. Esimerkiksi kontrollirakenteet ovat kehittyneet niin, että symbolisella konekielellä kirjoitetuissa ohjelmissa on havaittu usein esiintyviä samojen komentojen jonoja: LDX... CMPX... JG...

22 22 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet Tämä komentojono voidaan abstrahoida vertailun perusteella tapahtuvaksi hypyksi. Korkeamman tason kieliin (esimerkiksi Fortraniin) on sitten lisätty ehdollisen hypyn toteuttava kontrollirakenne (matemaattinen valintalause): IF ( expr ) GOTO address Myöhemmässä vaiheessa valintalauseen käyttöjä tarkastelemalla voidaan havaita usein esiintyviä rakenteita: 10: IF ( expr ) GOTO GOTO 10 20:... Koodissa tapahtuu toisto, joka jatkuu niin kauan kun ehto on voimassa. Myöhemmissä kielissä (esimerkiksi Algol60) tämä on abstrahoitu toistolauseen toteuttavaksi kontrollirakenteeksi: while expr do... Edellisen kaltaiselle kehitykselle voidaan löytää mahdollisuuksia myös nykyisissä ohjelmointikielissä. Esimerkiksi suunnittelumalleja (design pattern) voidaan pitää usein esiintyvinä luokkien kokoelmina, jossa luokilla on samanlaiset suhteet toisiinsa. Suunnittelumallit on siis koottu matalamman tason käsitteistä eli luokista ja niiden välisistä suhteista. Vastaavanlainen kehitys kuin edellä esitetty voisikin johtaa mallikieliin (pattern language), jotka kertovat, miten ja missä tilanteissa suunnittelumalleja voidaan käyttää. Jonkin verran tällaisia on jo olemassa. Ohjelmointikielten kehitys voi siis tapahtua olemassa olevien piirteiden pohjalta. Kuitenkin myös uusien laskentamallien kehitys vaikuttaa ohjelmointikielten kehittymiseen, eikä kaikkia uusia piirteitä voida mallintaa vanhojen pohjalta. Esimerkiksi rinnakkaisuuden kehittyminen ohjelmointikieliin on vaatinut tuekseen laitteistotasolla mahdollistettavan rinnakkaisuuden. 1.6 Ohjelmointikielen suunnittelu Ohjelmointikielille voidaan asettaa erilaisia vaatimuksia. Yleisenä vaatimuksena voidaan mainita se, että kieltä voidaan helposti käyttää siihen tehtä-

23 Johdanto 23 Taulukko 1.1: Kielen ominaisuuksien arviointi Arviointiperusteet Kielen ominaisuuksia Luettavuus Kirjoitettavuus Luotettavuus Yksinkertaisuus Ortogonaalisuus Kontrollirakenteet Tietotyypit Syntaktiset ratkaisut Ilmaisuvoima Abstrahoinnin tukeminen Virheiden havaitseminen Oikeellisuus vään, mihin se on tarkoitettu. Eri kielille voidaan asettaa muitakin vaatimuksia, jotka riippuvat kielen tarkoituksesta. Erilaisia vaatimuksia löytyy lähteistä [Knu01, Seb02]. Kielen suunnitteluperusteita voidaan tarkastella taulukon 1.1 mukaisesti. Taulukko perustuu Sebestan kirjassa esitettyyn taulukkoon [Seb02]. Luettavuuteen vaikuttaa ensinnäkin yksinkertaisuus. Jos kieli on hyvin suuri, ohjelmoijilla on taipumus käyttää vain jotakin osajoukkoa kielen ominaisuuksista. Toisten ohjelmoijien kirjoittamia ohjelmia on silloin vaikea lukea, koska he ovat voineet ottaa käyttöönsä jonkin toisen osajoukon kielestä. Yksinkertaisissa kielissä on yleensä vain yksi tapa ilmaista jokin tietty asia. Jos tapoja on useita, kielen lukeminen on vaikeampaa. Liian pitkälle vietynä yksinkertaisuus voi kuitenkin vaikeuttaa lukemista. Esimerkiksi symboliset konekielet ovat yksinkertaisia, mutta niiden lukeminen ei ole helppoa. Ortogonaalisuus tarkoittaa kielen rakenteiden riippumattomuutta toisistaan. Ortogonaalisessa kielessä on suhteellisen pieni joukko rakenteita, joita voi yhdistellä suhteellisen harvoilla tavoilla. Jokainen yhdistelytapa on laillinen, ja sillä on järkevä tulkinta. Kielen säännöissä ei siis juurikaan ole poikkeuksia. Tämä edistää ohjelmien luettavuutta. Olemassa olevista kielistä on löydettävissä joitakin epäortogonaalisia piirteitä. Esimerkiksi Pascalissa funktio voi palauttaa muun tyyppisiä arvoja mutta ei taulukoita. C:ssä taas on inkrementointiin neljä eri tapaa, jotka ainakin joissakin tilanteissa voivat tarkoittaa täysin samaa asiaa. Lisäksi C:ssä parametrit ovat yleensä arvoparametreja, mutta taulukot käsitellään viiteparametreina. Monien mielestä funktionaalisissa kielissä yhdistyy parhaiten ortogonaalisuus ja yksinkertaisuus. Liian pitkälle vietynä ortogonaalisuus voi kuitenkin tehdä kielestä monimutkaisen. Tästä esimerkkinä on Algol68, jossa jokaisella kielen rakenteella on tyyppi ja useimmat kielen rakenteet tuottavat jonkin arvon.

24 24 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet Tällöin esimerkiksi ehtolause voi olla sijoituslauseen vasemmalla puolella, kunhan ehtolauseen tuloksena on osoite. Kontrollirakenteet (ja rakenteellinen ohjelmointi) parantavat ohjelmien luettavuutta. Esimerkkinä tarkastellaan sisäkkäisiä silmukoita C-kielen syntaksilla kirjoitettuna: while ( incr < 20 ) { while ( sum <= 100 ) { sum += incr; } incr++; } Jos kielessä ei ole while-lausetta, vastaava koodi joudutaan kirjoittamaan hankalammin, mikä vaikeuttaa ymmärtämistä: Loop1: if ( incr >= 20 ) goto Out; Loop2: if ( sum > 100 ) goto Next; sum += incr; goto Loop2; Next: incr++; goto Loop1; Out: Kieleen valitut tietotyypit vaikuttavat luettavuuteen, esimerkiksi looginen tyyppi (boolean) selventää muuttujan merkitystä verrattuna siihen, että loogisen arvojen sijasta käytettäisiin numeerisia arvoja. Myös tietuetyypit selventävät ohjelmaa, koska niiden avulla yhteenkuuluvat arvot voidaan koota yhteen. Kielen syntaksi vaikuttaa luettavuuteen. Tunnusten pituuden rajoittaminen vähentää luettavuutta, koska tunnukset eivät silloin yleensä ole kuvaavia. Syntaksissa määritellyt varatut sanat taas auttavat tunnistamaan kielen kontrollirakenteet muusta ohjelmakoodista, mikä helpottaa ohjelmien lukemista. Kirjoitettavuudella tarkoitetaan sitä, miten helposti kieltä pystytään käyttämään ohjelmien tuottamiseen. Useimmat luettavuuteen vaikuttavat kielen piirteet vaikuttavat myös kirjoitettavuuteen, koska ohjelmia kirjoitettaessa joudutaan jo kirjoitettuja osia samalla lukemaan. Vaikutukset ovat lisäksi yleensä samansuuntaisia: se, mikä helpottaa lukemista, helpottaa myös kirjoittamista. Tosin yksinkertaisuuden kohdalla vaikutuksena on lisäksi se, että yksinkertaisessa kielessä kirjoitusvirheiden mahdollisuus on pienempi.

25 Johdanto 25 Jos taas kieli on laaja, niin tarvitessaan harvoin käyttämiään rakenteita ohjelmoija tekee helposti virheitä. Samoin jos kieli on liian ortogonaalinen, ohjelmoija ei helposti huomaa virheitä, jotka tapahtuvat rakenteiden yhdistelyssä. Kielen ilmaisuvoima ja abstrahoinnin tukeminen liittyvät läheisesti toisiinsa. Ilmaisuvoimaan vaikuttaa esimerkiksi kieleen valittujen toimintojen määrä. Jos kielessä ei ole tarpeeksi toimintoja, ne joudutaan tuottamaan ohjelmallisesti, mihin voi kulua paljon aikaa. Ilmaisuvoimaan vaikuttaa myös se, miten lähellä kielen rakenteet ovat ihmisen ajattelurakenteita. Esimerkiksi symbolisissa konekielissä ratkaisut joudutaan esittämään käyttämällä koneen terminologiaa, kun taas korkeamman tason kielissä ratkaisut voidaan esittää sovellusalueen terminologialla. Korkeamman tason kielessä on enemmän abstrahointimahdollisuuksia. Abstrahointi tukee ohjelmien kirjoittamista niin, että kaikkia yksityiskohtia ei tarvitse ottaa huomioon ohjelmia kirjoitettaessa. Esimerkiksi toimintojen abstrahointi aliohjelmien sisään vähentää kirjoitustyötä ja mahdollisten virheiden määrää. Ilmaisuvoiman ja abstrahoinnin yhteydessä mainittu kielen taso kertoo, missä kohdassa kieli sijaitsee kone-sovellusalue akselilla. Mitä korkeammalla tasolla kieli on, sitä riippumattomampi se on tietokoneesta ja sitä enemmän se tukee sovellusaluetta (vrt. sovelluskehittimet). Jos kielen taso määritellään suhteessa sovellusalueeseen, ei ole järkevää vertailla eri sovellusalueille tarkoitettuja kieliä keskenään. Kieli voi toisaalta olla yleiskäyttöinen eli sellainen, että se sopii useille eri sovellusalueille. Tällöin kieltä voidaan käyttää hyvin laajoilla ja epäyhtenäisillä sovellusalueilla, mistä yleensä seuraa, että kieli ei voi olla kovin korkealla tasolla. Ohjelmaa voidaan pitää luotettavana, jos se toimii määrittelynsä mukaisesti. Jos ohjelmia on helppo lukea ja kirjoittaa, ne myös yleensä ovat luotettavampia. Ohjelmointikielen suunnittelussa joudutaan ottamaan kantaa siihen, missä vaiheessa virheet (esimerkiksi tyyppivirheet) havaitaan. Virheiden havaitseminen mahdollisimman aikaisessa vaiheessa parantaa ohjelmien luotettavuutta, toisaalta taas tarkistusten pois jättäminen tekee kielestä joustavan. Luotettavuuteen liittyy myös poikkeusten hallintamekanismin suunnittelu. Oikeellisuudella viitataan ohjelmien todistamiseen ja oikeellisuudesta varmistumiseen. Vaikka ohjelmia ei formaalisti todistettaisikaan oikeiksi, jo kielen rakenteiden selkeys auttaa varmistumaan siitä, että ohjelma toimii oikein. Esimerkiksi rakenteellinen ohjelmointi ja modulaarisuus tukevat vakuuttumista oikeellisuudesta, kun taas goto-lauseiden esiintyminen ohjelmissa vaikeuttaa sitä. Joissakin kielissä on mahdollisuus käyttää invariantteja eli pysyväisväittämiä, joiden automaattinen tarkistaminen lisää ohjelmien luotettavuutta.

26 26 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet Taulukon 1.1 kohtien lisäksi ohjelmointikielen ominaisuuksia voidaan tarkastella siltä kannalta, miten kieli tukee koko ohjelmistoprosessia eli millaisia taloudellisia vaikutuksia sillä on. Kieli tukee suunnittelua, jos se sisältää tarvittavia abstrahointivälineitä, esimerkiksi tietoabstraktion ja kontrolliabstraktion (aliohjelmat). Ylläpitoa taas helpottaa se, että ohjelma voidaan jakaa osiin, joilla on mahdollisimman vähän liittymiä toisiinsa. Tällöin muutosten vaikutukset järjestelmän muihin osiin voidaan minimoida. Kieli vaikuttaa ohjelmistoprosessiin, ja hyväksi todetut kehitysmenetelmät vaikuttavat kieliin. Esimerkiksi top-down suunnittelun tukemiseksi ohjelmointikieliin on lisätty mahdollisuuksia rakenteelliseen ohjelmointiin. Toisena esimerkkinä kaksisuuntaisesta vaikutuksesta on se, että ohjelmistojen jatkuvasti kasvaessa on huomattu tarve ohjelmistojen jakamiselle osiin. Tämän seurauksena ohjelmointikieliin on lisätty modulaarisuutta tukevia välineitä. Myös tehokkuusnäkökohdat tulee ottaa huomioon kielen suunnittelussa. Toteutuksen tehokkuudella voidaan viitata toisaalta siihen, miten tehokkaasti kääntäjä voidaan toteuttaa, ja toisaalta siihen, miten tehokasta koodia kääntäjä tuottaa. Kääntäjän toteuttamisessa yksinkertaisimmat ominaisuudet voidaan yleensä toteuttaa tehokkaimmin. Toisin sanoen vaikeasti toteutettavat ominaisuudet ovat yleensä sellaisia, joita myös ohjelmoijan on vaikea ymmärtää ja käyttää. 1.7 Ohjelmointikielen toteuttaminen Ohjelmointikielen suunnittelu on pohjana kielen toteuttamiselle, mikä tapahtuu kääntäjän tai tulkin avulla. Kääntämisessä lähdekoodi käännetään sellaiseen muotoon, että kone pystyy sen suorittamaan. Kuva 1.2 esittää käännösprosessia. Kun ohjelma on käännetty, ohjelmoija voi ajaa ohjelmaa eli antaa sille syötearvot, jolloin ohjelma tehtävän suoritettuaan antaa jonkin tuloksen (tulosarvot). Varsinainen kääntäminen sisältää useita vaiheita, joissa tehdään vaiheelle ominaisia tarkistuksia tai analyyseja. Nämä vaiheet ovat nimeltään: leksikaalianalyysi (selaaminen) syntaksianalyysi (jäsentäminen) semanttinen analyysi välikielen generointi koodin optimointi

27 Johdanto 27 Lähdeohjelma Kääntäjä Kohdeohjelma Syöte Kohdeohjelma Tulos Kuva 1.2: Käännösprosessi Lähdeohjelma Syöte Tulkki Tulos Kuva 1.3: Tulkkausprosessi koodin generointi. Kääntäjän toteuttamisessa kussakin analyysissa tehdään erilaisia tarkistuksia, jotta huomataan mahdolliset virheet lähdeohjelmassa. Kääntäjän toteutus sisältää yleensä symbolitaulun, johon kerätään ohjelmassa esiintyvät tunnukset kuten muuttujien, vakioiden, tyyppien ja aliohjelmien nimet. Nimet lisätään symbolitauluun silloin, kun ollaan käsittelemässä esittelyitä. Tässä yhteydessä tarkistetaan, ettei symbolitaulussa ole jo samalla näkyvyysalueella samannimistä tunnusta. Tätä kutsutaan esittelyiden työstämiseksi (elaboration). Kun taas jokin tunnus havaitaan ohjelmassa myöhemmin, tarkistetaan, löytyykö tunnus symbolitaulusta (eli onko tunnus esitelty) ja minkä tyyppinen tunnus on kyseessä. Vaihtoehtona ohjelmien kääntämiselle on ohjelmien tulkkaus, joka on esitetty kuvassa 1.3. Tulkkaaminen on kääntämiseen verrattuna hyvin yksinkertaista, ja sen etuna on virheiden helppo paikallistaminen. Jos esimerkiksi havaitaan taulukon indeksirajan ylittäminen, voidaan virheilmoituksen lisäksi antaa virheen tarkka sijainti lähdekoodissa. Haittoina ovat kuitenkin suorituksen hitaus ja suurempi muistitilan tarve. Ohjelmointikielistä Lisp on tulkkikieli, tosin myöhemmille versioille on toteutettu myös kääntäjiä. Myös monet skriptikielet, kuten JavaScript ja Python ovat tulkattavia. Tulkkaamisessa syötearvot annetaan sitä mukaan, kun tulkkaaminen etenee sellaiseen vaiheeseen, että syötearvoja tarvitaan. Kielissä voi olla piirteitä, joiden toteuttaminen tulkkaamalla on helpompaa ja luontevampaa kuin kääntämällä. Esimerkiksi Lisp-kielisessä ohjelmassa voidaan kirjoittaa koodia ja suorittaa tämä koodi saman tien.

28 28 Ohjelmointikielet Periaatteet, käsitteet, valintaperusteet Lähdeohjelma Muunnin Välikielinen ohjelma Välikielinen ohjelma Syöte Virtuaalikone Tulos Kuva 1.4: Käännösprosessin ja tulkkausprosessin välimuoto Kääntämisen ja tulkkaamisen hyvät puolet voidaan yhdistää, jolloin tuloksena saadaan kuvan 1.4 mukainen välimuoto. Kuvassa olevan muuntimen englanninkielinen vastine (translator) tarkoittaa sekä kääntäjää että tulkkia. Muunnin suorittaa tavallisesti kääntämisen alkupään vaiheita kuten leksikaali- ja syntaksianalyysit sekä välikielen generoinnin. Esimerkiksi Java-toteutuksissa tavukoodi on tällainen välikielinen esitys, jota sitten tulkataan. Tosin suuremman nopeuden saavuttamiseksi tavukoodi voidaan myös kääntää binaarikoodiksi JIT-kääntäjällä (Just-In-Time) juuri ennen ohjelman suorittamista. Käännetty koodi (esimerkiksi operaation koodi) voidaan tallentaa, jolloin operaatiota uudelleen kutsuttaesssa voidaan käyttää jo käännettyä koodia. Kääntämisen ja tulkkaamisen ero ei välttämättä ole kovin suuri. Jos kuvan 1.4 muunnin on hyvin yksinkertainen, prosessi on lähellä tulkkaamista. Jos taas muunnin on monimutkainen ja käy läpi kielen rakenteet läpikotaisin, eikä tee vain pientä mekaanista muunnosta, prosessi muistuttaa kääntämistä. Välikielinen esitys voi olla myös jokin ohjelmointikieli. Esimerkiksi jotkin Eiffel-toteutukset generoivat (ei-luettavaa) C-kieltä, joka sitten käännetään C-kääntäjällä. On myös mahdollista, että kielelle on olemassa sekä tulkki että kääntäjä. Tällöin ohjelmia kehitettäessä (ja virheiden etsinnässä) käytetään tulkkia. Kun ohjelma saadaan vakaammaksi, se käännetään paremman suoritusnopeuden saavuttamiseksi. Joissakin kielissä, esimerkiksi C:ssä ennen varsinaista käännöstä tehdään esikäännös, jonka yhtenä tehtävänä on laventaa makrot. Tämä on tarpeellista, koska makroja voidaan käyttää kielen syntaksin uudelleenmäärittelyyn: #define begin { #define end } #define then...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ohjelmoinnista. Ohjelmien toteutukseen tarjolla erilaisia välineitä:

Ohjelmoinnista. Ohjelmien toteutukseen tarjolla erilaisia välineitä: Ohjelmien toteutukseen tarjolla erilaisia välineitä: perinteiset ohjelmointikielet eri tyyppisiä eri paradigmat eri tarkoituksiin ohjelmointiympäristöt kieli + tukiympäristö (kieliherkkä toimitin, debuggeri,

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

Käännös, linkitys ja lataus

Käännös, linkitys ja lataus Luento 10 (verkkoluento 10) Käännös, linkitys ja lataus Ohjelmasta prosessiin Käännösyksikkö Kääntämisen vaiheet Makrot, literaalit Staattinen ja dynaaminen linkitys Nimien sidonta Lausekielestä suoritukseen

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

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

Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi

Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi Rinnakkaisuuden hyväksikäyttö peleissä Paula Kemppi 24.4.2008 Esityksen rakenne Johdantoa Rinnakkaisuus Pelimoottorien rinnakkaisuuden mallit Funktionaalisen rinnakkaisuuden malli Rinnakkaisen tiedon malli

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

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

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

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

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

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 II Ohjelmointikielten kehityshistoriaa Sisältö 1. Ohjelmointikielten sukupolvet 2. Pääohjelmointikielten kehitys 815338A Ohjelmointikielten periaatteet,

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

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

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

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

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

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin 812347A Olio-ohjelmointi, 2015 syksy 2. vsk II Johdanto olio-ohjelmointiin Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden esittely 2 II.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

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

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

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

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

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

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

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

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka Rinnakkaisuus parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa Rinnakkaisuuden etuja: laskennan nopeutuminen (sarjoittuvat operaatiojonot) ilmaisuvoima (ongelman

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

.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

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

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

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

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

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

Olio-ohjelmointi Johdanto olio-ohjelmointiin

Olio-ohjelmointi Johdanto olio-ohjelmointiin Olio-ohjelmointi Johdanto olio-ohjelmointiin Ohjelmistoa kehitettäessä voidaan tunnistaa ainakin kaksi abstraktiota: prosessiabstraktio ja dataabstraktio. Prosessiabstraktio huomattiin jo varhain, koska

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

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

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

Lisätiedot

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

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

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

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

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

Clojure, funktionaalinen Lisp murre

Clojure, funktionaalinen Lisp murre Clojure, funktionaalinen Lisp murre Principles of Programming Languages, S2015 Jukka Pekka Venttola & Pietari Heino Taustaa Clojuren pohjana on käytetty Lisp ohjelmointikieltä, jonka historia ulottuu 1950

Lisätiedot

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi 17.5.2006 1/5 Oppimistavoitteet kurssilla Rinnakkaisohjelmointi Rinnakkaisuus ja rinnakkaisuuden soveltaminen tietojenkäsittelyjärjestelmissä Kurssin Tietokoneen toiminta perusteella ymmärtää, miten ohjelman

Lisätiedot

19/20: Ikkuna olio-ohjelmoinnin maailmaan

19/20: Ikkuna olio-ohjelmoinnin maailmaan Ohjelmointi 1 / syksy 2007 19/20: Ikkuna olio-ohjelmoinnin maailmaan Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

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

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

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

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

Lisätiedot

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

Johdatus ohjelmointiin

Johdatus ohjelmointiin Johdatus ohjelmointiin Ohjelmistot tietokonejärjestelmissä Jaana Holvikivi Ohjelmistojen tehtävät Sovellusohjelmat tekstinkäsittely ja muut toimistosovellukset kirjanpito, tuotannonohjaus selaimet, mediaohjelmat

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

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

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

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

Lisätiedot

Johdatus Ohjelmointiin

Johdatus Ohjelmointiin Johdatus Ohjelmointiin Syksy 2006 Viikko 2 13.9. - 14.9. Tällä viikolla käsiteltävät asiat Peruskäsitteitä Kiintoarvot Tiedon tulostus Yksinkertaiset laskutoimitukset Muuttujat Tiedon syöttäminen Hyvin

Lisätiedot

Varhaiset oliokielet Modula, CLU ja Smalltalk. T : Seminar on the History of Programming Languages Kari Koskinen Otaniemi 29.9.

Varhaiset oliokielet Modula, CLU ja Smalltalk. T : Seminar on the History of Programming Languages Kari Koskinen Otaniemi 29.9. Varhaiset oliokielet Modula, CLU ja Smalltalk T-106.5800: Seminar on the History of Programming Languages Kari Koskinen Otaniemi 29.9.2009 Luennon sisältö Modula CLU (CLUster programming language) Smalltalk

Lisätiedot

Käyttöjärjestelmien historia. Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen

Käyttöjärjestelmien historia. Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen Käyttöjärjestelmien historia Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen Käyttöjärjestelmien jaottelu Voidaan jaotella erilaisin menetelmin Aikajana (määrä,

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

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

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

4. Luokan testaus ja käyttö olion kautta 4.1

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

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

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

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

P e d a c o d e ohjelmointikoulutus verkossa

P e d a c o d e ohjelmointikoulutus verkossa P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN

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

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python 7. helmikuuta 2009 Ohjelmoinnista Ohjelman peruselementtejä Koodin kommentointi Lohkorakenne Ohjausrakenteet If For While Try Funktiot Käyttö

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Kielioppia: toisin kuin Javassa

Kielioppia: toisin kuin Javassa Object Pascal Pascal kielen oliolaajennus (Inprise/Borland:n oma) luokat Voit uudelleenkäyttää luomiasi objekteja esim. komponentteja Periytyminen Kielioppia: toisin kuin Javassa Ei eroa isojen ja pienien

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Lisätiedot

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

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

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot