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 vaikuttavia tekijöitä 815338A Ohjelmointikielten periaatteet, Johdanto 2
I.1 Ohjelmointikielen määritelmä Merkintäjärjestelmä, joka kuvaa laskentaa sellaisessa muodossa, että se on koneen ja ihmisen luettavissa. (Louden) Tyhjentävä määritelmä hankala keksiä, yo. riittää tässä Laskenta Määritellään usein formaalisti Turingin koneen avulla Tässä (epätarkasti): mikä tahansa tietokoneen suorittama toiminto Ohjelmointikieli koneen luettavissa Mahdollisuus kääntää automaattisesti konekielelle 815338A Ohjelmointikielten periaatteet, Johdanto 3
I.1 Ohjelmointikielen määritelmä (2) Ohjelmointikieli ihmisen luettavissa Epätarkempi vaatimus Kielessä oltava koneen toimintaa kuvaavia abstraktioita, jotta kielen käyttäminen ei vaadi koneen syvällistä ymmärtämistä Ohjelmointikielet muistuttavat usein jossain määrin luonnollista kieltä 815338A Ohjelmointikielten periaatteet, Johdanto 4
I.2 Syitä tutkia ohjelmointikieliä 1. Ohjelmointitaito kehittyy Ohjelmointi-ideoiden ilmaisuvalmius kasvaa Konstruktiot kielelle ominaisia Käytettävän kielen valinta helpottuu Kielen syvempi ymmärtäminen auttaa virhetilanteissa Oheistyökalujen käyttö tehostuu 2. Valmius oppia uusia kieliä kasvaa Perusperiaatteiden tuntemus auttaa 3. Periaatteita tarvitaan ohjelmoinnin opettamisessa 815338A Ohjelmointikielten periaatteet, Johdanto 5
I.2 Syitä tutkia ohjelmointikieliä (2) 4. Uusien kielten suunnittelu helpottuu Olemassaolevat kielet tunnettava Suunnitteluperiaatteet tunnettava 5. Tietojenkäsittely edistyy yleisesti Parhaat ratkaisut yleistyvät, jos tunnetaan periaatteet 815338A Ohjelmointikielten periaatteet, Johdanto 6
I.3 Ohjelmointiparadigmat Ohjelmointikielen tyyppi läheisessä yhteydessä ohjelmointitapaan (paradigmaan) Paradigman osat: 1. laskennallinen malli, 2. käsitteistö ja 3. välineistö Yleisjako: Imperatiivinen ohjelmointi vs. deklaratiivinen ohjelmointi 815338A Ohjelmointikielten periaatteet, Johdanto 7
I.3.1 Imperatiivinen ohjelmointi Luonnollisin ohjelmointiparadigma von Neumanntietokoneympäristössä Tunnuspiirteet: 1. Muistia mallintavat muuttujat, 2. Muistia manipuloivat sijoituslauseet 3. Komentojen peräkkäinen suorittaminen Suurin osa nykyisistä ohjelmointikielistä pääosin imperatiivisia 815338A Ohjelmointikielten periaatteet, Johdanto 8
I.3.1.1 Olio-ohjelmointi Lasketaan joskus omaksi paradigmaksi Ohjelma koostuu olioista ja toiminta niiden kommunikaatiosta Nykyiset oliokielet luonteeltaan enimmäkseen imperatiivisia 815338A Ohjelmointikielten periaatteet, Johdanto 9
I.3.1.2 Rinnakkainen ohjelmointi Viitataan usein ohjelmointimallina (peräkkäinen vs. rinnakkainen) Voidaan myös laskea ohjelmointiparadigmaksi Voidaan määritellä samanaikaisesti suoritettavia toimenpiteitä -> huolehdittava operaatioiden kommunikoinnin synkronoimisesta Monet nykyiset ohjelmointikielet tukevat 815338A Ohjelmointikielten periaatteet, Johdanto 10
I.3.2 Deklaratiivinen ohjelmointi Paradigmaan lasketaan kuuluvaksi 1. Funktionaalinen ohjelmointi 2. Logiikkaohjelmointi 3. Tietokantakielet 815338A Ohjelmointikielten periaatteet, Johdanto 11
I.3.2.1 Funktionaalinen ohjelmointi Perustaa laskennan funktioiden soveltamiseen Perusmekanismi on funktiokutsu Muuttujat ja toistorakenteet puuttuvat Kielet tunnetaan myös nimellä applicative languages Tunnettuja kieliä LISP ja Haskell 815338A Ohjelmointikielten periaatteet, Johdanto 12
I.3.2.2 Logiikkaohjelmointi Pohjautuu symbolisen logiikan käyttöön Ohjelma koostuu väitteistä (statements) Ei tarvita kontrollirakenteita Käyttää muuttujia, mutta eivät mallinna muistialueita vaan muistuttavat matematiikassa käytettäviä muuttujia Prolog harvoja yleisesti tunnettuja logiikkaohjelmointikieliä 815338A Ohjelmointikielten periaatteet, Johdanto 13
I.4 Suunnittelu- ja arviointikriteerit Yksi kurssin päätavoitteista: arvioida olemassa olevia ohjelmointikieliä -> periaatteita, joiden avulla kieliä voidaan arvostella 1950-luvulla kielet mahdollisimman yksinkertaisia 1970-luvun alkupuolella Hoaren kriteerit: 1.Yksinkertaisuus (Simplicity) 2.Turvallisuus (Security) 3.Nopea käännettävyys (Fast translation) 4.Käännetyn ohjelmakoodin tehokkuus (Efficient object code) 5. Luettavuus (Readibility) 815338A Ohjelmointikielten periaatteet, Johdanto 14
I.4.1 Loudenin kriteerit 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) 815338A Ohjelmointikielten periaatteet, Johdanto 15
I.4.1 Loudenin kriteerit (2) 10.Yhdenmukaisuus yleisesti käytettyjen merkintöjen ja sopimusten kanssa (Consistency with accepted notations and conventions) 11. Laajennettavuus (Extensibility) 12. Rajoitettavuus (Restrictability) 815338A Ohjelmointikielten periaatteet, Johdanto 16
I.4.1 Loudenin kriteerit (3) *x++=*y++ Tehokkuus Käännetyn koodin tehokkuus: yksi tärkeimpiä mittareita (varsinkin aiemmin) Käännöksen tehokkuus Kielellä ohjelmoimisen tehokkuus Yleisyys Kielen piirre koota ominaisuutensa muutamista peruskäsitteistä Esimerkki: Pascalissa kahdentyyppisiä aliohjelmia (proseduuri ja funktio), C:ssä vain funktio. Samat toiminnot mahdolliset -> C yleisempi 815338A Ohjelmointikielten periaatteet, Johdanto 17
I.4.1 Loudenin kriteerit (4) Ortogonaalisuus Kielen piirteiden riippumattomuus toisistaan, mahdollisimman vähän perusrakenteita, joita voidaan yhdistellä riippumattomasti ALGOL 68-kielen suunnittelun pääperiaate Yhdenmukaisuus Johdonmukaisuus kielen rakenteiden ulkoasussa ja käyttäytymisessä Rikotaan kahdella tavalla: 1. Samankaltaisesti käyttäytyvät asiat näyttävät erilaisilta 2. Samalta näyttävät asiat käyttäytyvät eri lailla 815338A Ohjelmointikielten periaatteet, Johdanto 18
I.4.1 Loudenin kriteerit (5) Yksinkertaisuus Aikoinaan yksi tärkeimmistä suunnitteluperiaatteista Pascalissa tärkeä Sotii monia muita tavoiteltavia asioita vastaan Yksinkertaisen kielen käyttäminen voi olla vaikeata Täsmällisyys Kielellä tarkka määrittely Lisää kielen luotettavuutta 815338A Ohjelmointikielten periaatteet, Johdanto 19
I.4.1 Loudenin kriteerit (6) Ilmaisuvoima Kuinka helppoa kielessä on ilmaista monimutkaisia toimintoja ja rakenteita Auttaa tuottamaan ohjelmia tehokkaammin Yleensä ristiriidassa yksinkertaisuuden kanssa Nykyään lisätään luokkakirjastojen tai pakkausten avulla Esimerkki C:n ilmaisuvoimasta: strcpy(char *s, char *t){ } while( *s++ = *t++); 815338A Ohjelmointikielten periaatteet, Johdanto 20
I.4.1 Loudenin kriteerit (7) Laiteriippumattomuus Saavutetaan pääasiassa käyttämällä tietotyyppejä, jotka eivät vaadi koneen sisäisten ominaisuuksien tuntemusta Esimerkki: C-kielen int voi olla 16- tai 32-bittinen, Javassa aina 32-bittinen -> Java laiteriippumattomampi Turvallisuus Estää ohjelmointivirheiden (sekä syntaktisten että semanttisten) syntymistä Edistää ohjelmointivirheiden havaitsemista Turvallisuusperiaate -> tyypintarkistus 815338A Ohjelmointikielten periaatteet, Johdanto 21
I.4.1 Loudenin kriteerit (8) Yhdenmukaisuus yleisesti käytettyjen merkintöjen ja sopimusten kanssa Edistää kokeneen ohjelmoijan mahdollisuuksia oppia ja käyttää ohjelmointikieltä Laajennettavuus Mekanismi, jonka avulla kieleen voidaan lisätä ominaisuuksia Rajoitettavuus Ei tarvitse tuntea kaikkia kielen ominaisuuksia, jotta pystyisi käyttämään kieltä hyödyllisesti 815338A Ohjelmointikielten periaatteet, Johdanto 22
I.4.2 Sebestan kriteerit *x++=*y++ Ainoastaan arviointikriteerejä Neljä pääkategoriaa, jakaantuvat alikategorioihin: 1. Luettavuus (Readibility) i. Yksinkertaisuus (Simplicity) ii. Ortogonaalisuus (Orthogonality) iii. Tietotyypit (Data types) iv. Syntaksi (Syntax design) 815338A Ohjelmointikielten periaatteet, Johdanto 23
I.4.2 Sebestan kriteerit (2) 2. Kirjoitettavuus (Writability) i. Luettavuuden kriteerit ii. Abstraktiotuki (Support for abstraction) iii. Ilmaisuvoima (Expressivity) 3. Luotettavuus i. Luettavuus ja kirjoitettavuus ii. Tyypin tarkistus (Type checking) iii. Poikkeusten käsittely (Exception handling) iv. Moninimisyys (Aliasing) 4. Resurssivaatimukset 815338A Ohjelmointikielten periaatteet, Johdanto 24
I.4.2 Sebestan kriteerit (3) Luettavuus Yksi tärkeimmistä kriteereistä Arvioi kuinka hyvin ihminen ymmärtää kirjoitettua ohjelmakoodia Tietotyypit liittyvät ilmaisuvoimaan Syntaksin vaikutus: Varsinkin erikoissanat, kuten while, if, for,... 815338A Ohjelmointikielten periaatteet, Johdanto 25
I.4.2 Sebestan kriteerit (4) Kirjoitettavuus Arvioi, kuinka helposti kielellä voi tuottaa valitun sovellusalueen ohjelmia Yksinkertaisuus ja ortogonaalisuus edesauttavat Tapa tukea abstraktiota vaikuttaa suuresti kirjoitettavuuteen Erityisesti tuki tietorakenteille Ilmaisuvoima monitahoinen käsite Kielessä mahdollisuus ilmaista operaatioita lyhyesti Lisääminen edistää kirjoitettavuutta, ei aina luettavuutta 815338A Ohjelmointikielten periaatteet, Johdanto 26
I.4.2 Sebestan kriteerit (5) Luotettavuus Kieli käyttäytyy määritellyllä tavalla kaikissa tilanteissa Tyypin tarkistus Tyyppivirheiden tarkistus ohjelmassa (käännöksen tai ohjelman ajon aikana) Poikkeusten käsittely Kielen kyky havaita ajonaikaiset virheet ja mahdollisesti toipua niistä Moninimisyys (aliasing) Kielen kyky muodostaa eri muuttujia viittaamaan samaan muistipaikkaan Voi aiheuttaa virhetilanteita, mutta hankala karsia kokonaan 815338A Ohjelmointikielten periaatteet, Johdanto 27
I.4.2 Sebestan kriteerit (6) Resurssivaatimukset Resurssit kouluttamaan ohjelmoijia Ohjelman kirjoittamisen vaatimat resurssit Kääntämisen tehokkuus Ohjelmien suorittamisen tehokkuus Implementointijärjestelmän kustannukset 815338A Ohjelmointikielten periaatteet, Johdanto 28
I.5 Suunnitteluun vaikuttavia tekijöitä I.5.1 Tietokoneen arkkitehtuuri Keskeisimpiä seikkoja - von Neumannin arkkitehtuuri vallitseva: Ohjelman muistialue: DATA KÄSKYT... CPU Aritmeettislooginen yksikkö (ALU) Laskennan tulokset Käskyt ja data Kontrolliyksikkö Käskyjen dekoodaus IO 815338A Ohjelmointikielten periaatteet, Johdanto 29
I.5.1 Tietokoneen arkkitehtuuri (2) von Neumannin arkkitehtuurin perusominaisuudet: Data ja ohjelma samassa muistissa, ei voi erottaa toisistaan Keskusyksikkö muistista erillään, suorittaa käskyt -> käskyt ja data siirrettävä muistista keskusyksikköön von Neumannin arkkitehtuurin käyttöönotto -> mahdollisuus manipuloida tietokoneohjelmia samalla tavalla kuin dataa -> ohjelmointikielten synty Imperatiiviset ohjelmointikielet pohjautuvat von Neumannin arkkitehtuuriin 815338A Ohjelmointikielten periaatteet, Johdanto 30
I.5.2 Ohjelmistojen suunnitteluperiaatteet 1950-luvulla automaattinen ohjelmointi FORTRAN lähellä konekieltä 1960-luvulla eri periaatteiden kokeilua Satoja kieliä suunniteltiin 1970-luvulla rakenteinen ohjelmointi Top-down suunnittelu ja askeleittain tarkentaminen Monet merkittävimmistä ideoista 1970-luvulla 1980-luvulta alkaen abstraktit tietotyypit ja olioohjelmointi Dataorientoitunut suunnittelumalli Nykyään vallitseva 815338A Ohjelmointikielten periaatteet, Johdanto 31