TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Samankaltaiset tiedostot
Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

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

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

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

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

Harjoitustyö: virtuaalikone

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

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

11/20: Konepelti auki

Ohjelmoinnin perusteet Y Python

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tutoriaaliläsnäoloista

ITKP102 Ohjelmointi 1 (6 op)

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

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

1. Omat operaatiot 1.1

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

Ohjelmoinnin perusteet Y Python

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

4. Lausekielinen ohjelmointi 4.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

7. Oliot ja viitteet 7.1

9. Periytyminen Javassa 9.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen historia

Tie Principles of Programming Languages Seminar Essay. Lua. Group 23 Miikka Koskinen Joose Sainio

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

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

TIE Principles of Programming Languages CEYLON

.NET ajoympäristö. Juha Järvensivu 2007

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Mathematica Sekalaista asiaa

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Sisältö. 22. Taulukot. Yleistä. Yleistä

811120P Diskreetit rakenteet

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

12. Näppäimistöltä lukeminen 12.1

2. Olio-ohjelmoinista lyhyesti 2.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

815338A Ohjelmointikielten periaatteet

7. Näytölle tulostaminen 7.1

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

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

Java kahdessa tunnissa. Jyry Suvilehto

19. Olio-ohjelmointia Javalla 19.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Olio-ohjelmointi Javalla

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

C++11 lambdat: [](){} Matti Rintala

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

Muistutus aikatauluista

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

Osoitin ja viittaus C++:ssa

Ohjelmoinnin perusteet Y Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

11. Javan toistorakenteet 11.1

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Olio-ohjelmointi Syntaksikokoelma

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

Listarakenne (ArrayList-luokka)

5. HelloWorld-ohjelma 5.1

12. Monimuotoisuus 12.1

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

8. Näppäimistöltä lukeminen 8.1

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

15. Ohjelmoinnin tekniikkaa 15.1

4. Olio-ohjelmoinista lyhyesti 4.1

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

7/20: Paketti kasassa ensimmäistä kertaa

811120P Diskreetit rakenteet

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Transkriptio:

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 Pääperiaatteita... 1 2. KIELEN RAKENNE... 2 2.1 Syntaksi... 2 2.2 Näkyvyysalue, silmukka ja kontrollirakenteet... 2 2.3 Sopimussuunnittelu ja poikkeukset... 3 2.4 Kääntäminen ja roskienkeruu... 4

1 1. YLEISTÄ EIFFELISTÄ 1.1 Historia ja tausta Ranskalainen Bertrand Meyer kehitti Eiffel nimisen olio-ohjelmointiin pohjautuvan ohjelmointikielen sekä yrityksen Eiffel Software vuonna 1985. Siitä lähtien Meyer ja hänen yrityksensä, joka on nykyään nimellä Interactive Software Engineering (ISE), on kehittänyt Eiffeliä ja 1986 tuli ensimmäinen toteutus kielestä. Vuonna 2005 Eiffelistä tuli ISOstandardoitu ohjelmointikieli. Kielen suunnittelun taustalla on pyrkimys parantaa ohjelmistojen toimintavarmuutta ja tehdä uudelleen käytettäviä moduleita. Koska Meyer on sopimussuunnittelun ja avoinsuljettu-periaatteen keksijä, ovat nämä periaatteet luonnollisesti olleet vaikuttamassa kielen kehittelyyn. Myös muita periaatteita kuten esim. DRY (don't repeat yourself) ovat olleet vaikuttamassa kielen suunnittelussa. 1.2 Pääperiaatteita Eiffel on käännettävä kieli, eli kääntäjällä käännetään koodi käyttöjärjestelmässä ajettavaksi sovellukseksi. Kääntäjiä löytyy useammalle käyttöjärjestelmälle kuten esim. Windows, Macintosh ja Linux. Kielenä Eiffel on imperatiivinen. Tämä tarkoittaa, että koodin käskyt ajetaan ohjelmoijan määrittelemässä järjestyksessä. Yleisesti ottaen käskyt ajetaan siinä järjestyksessä kuin ne ovat kirjoitettu, mutta kontrollirakenteet toki muuttavat käskyjen suoritusjärjestystä. Koodista pystyy kuitenkin imperatiivisessä kielessä lukemaan missä järjestyksessä käskyt ajetaan, mikä ei päde esim. funktionaalisessa kielessä. Eiffelissä kaikki tyypit ovat luokkia ja käytetään staattista tyypitystä. Tämä tarkoittaa, että muuttujien, parametrien ja metodien paluuarvojen tyyppejä tarkistetaan käännöksen aikana. Jos tyypit eivät ole yhteensopivat toistensa kanssa saada tämä virhe selville jo käännöksen aikana, kun taas dynaamisesti tyypitetyssä kielessä tyyppivirheet tulevat esiin vasta sovelluksen ajon aikana. Myös atomiset tyypit kuten kokonaisluku ja liukuluku ovat luokkia. Tavallisesti määritellyn luokan instanssille käytetään viitesemantiikkaa (class luokan_nimi). Jos taas käytetään expanded class luokan_nimi luokan määrittelyssä käytetään arvosemantiikkaa ja esim. muuttujan arvo on itse olio eikä viite olioon niin kuin viitesemantiikassa. Olio voi myös olla komposiitti, eli se voi sisältää toisen olion ja samalla myös viitteen toiseen ulkopuoliseen olioon. Esim. olio A sisältää olion B (aliolio) sekä viitteen olioon C joka on A:n ulkopuolella.

2 2. KIELEN RAKENNE 2.1 Syntaksi Eiffelissä kaikki ohjelman toiminnallisuus toteutetaan luokkien avulla. Luokat koostuvat yleensä luokan nimestä, inherit-, create- ja feature-osiosta. Nämä osiot erotellaan toisistaan avainsanojen avulla. Kukin osio alkaa aina jollain edelle mainituista nimistä ja päättyy -sanaan. Eri rivien sisennyksillä ei ole merkitystä. Inherit-osiossa voidaan määrittää, mistä luokista kyseinen luokka periytyy. Periytyvän funktion toiminnallisuus voidaan myös määrittää uudelleen käyttämällä redefine-avainsanaa. Create-osio sisältää funktion nimen, jota käytetään luokan rakentajana. Tämä ei ole kuitenkaan pakollinen osio. Jos create-osiota ei ole, ohjelma käyttää jokaisen luokan mukana automaattisesti luotavaa default_create-funktiota, joka ei tee mitään olion luontivaiheessa. Feature-osio sisältää kaikki luokan muuttujat ja funktiot. Funktion sisältää kaiken toiminnallisuutensa do-osion sisällä. Eiffelin funktiossa ei käytetä tavallisesta poiketen return-lausetta funktion arvon palauttamiseen, vaan palautettava arvo tallennetaan Result-muuttujaan, jonka arvo palautetaan funktiosta poistuttaessa. Funktiolle on myös mahdollista luoda paikallisia muuttujia. Tämä tehdään lisäämällä local-avainsana ennen do-osiota ja listaamalla alle kaikki halutut muuttujat. Funktiossa on myös mahdollista korvata do-sana once-sanalla, jolloin funktiosta tulee vain kerran suoritettava. Tällöin funktion ensimmäisellä suorituskerralla otetaan funktion paluuarvo talteen ja palautetaan se aina kun funktiota kutsutaan. Esimerkki luokasta: class HELLO feature message do print ("Hello world!%n") 2.2 Näkyvyysalue, silmukka ja kontrollirakenteet Eiffelissä kaikki oliot voivat lukea toistensa muuttujien arvoja. Oliot eivät kuitenkaan voi muokata toistensa muuttujien arvoja. Jos muokkaaminen halutaan kuitenkin sallia, voidaan tällöin luoda assign-funktio, jolloin luokan ulkopuolelle muuttujan arvon muuttaminen näyttää tavalliselta sijoitusoperaatiolta. Esimerkkinä muuttuja := uusi_arvo.

3 Eiffel sisältää C++:n while-silmukkaa vastaavan silmukkarakenteen. Ainoana erona on, että silmukkaa suoritetaan niin pitkään, että kontrollimuuttujalle määrätty vaatimus toteutuu. Silmukkarakenteeseen voi lisätä myös kohdat variant ja invariant. Variant arvon täytyy pienentyä jokaisella silmukan suorituksella vähintään yhdellä ja invariantin täytyy pysyä samana. Näillä voidaan varmistaa, ettei muodosteta päättymätöntä silmukkaa. from n := 0 until n >= 5 loop --... n := n + 1 Toisena silmukkarakenteena on across-silmukka, jolla voidaan käydää läpi erilaisia listarakenteita. Jotta tätä silmukkaa voitaisiin käyttää, täytyy silmukkarakenteen jokaisella alkiolla olla next-funktio ja itse rakenteella first- ja last-funktiot. across list as it loop -- Saadaan iteraattorin osoittama alkio list-oliosta it.item Kieli sisältää perinteisen if-rakenteen sekä inspect-rakenteen Jälkimmäisessä voidaan esimerkiksi tutkia jonkin muuttujan arvoa ja valita suoritettava koodi sen arvon mukaan. 2.3 Sopimussuunnittelu ja poikkeukset Sopimussuunnittelu on olennainen osa Eiffeliä ja on sisäänrakennettu kieleen. Yleensä kääntäjässä voi säätää milloin sopimussuunnittelua käytetään ja missä määrin eli millä tasolla. Sovelluksen tuotantoversiossa kannattaa jättää sopimussuunnittelu pois koska sen hyöty on virheiden löytäminen kehitystyön aikana. Avainsanalla require määritellään esiehto, joka on totuusarvon palauttava lauseke. Esiehto määritellään ennen do-osiota. Avainsanalla ensure määritellään samalla tavalla jälkiehto. Tämä tehdään do-osion sisällä ja sekä esi- että jälkiehdoille määritellään myös oma tagi. Luokkainvariantti määritellään avainsanalla invariant feature-osion ulkopuolella ja samalla tavalla kuin esi- ja jälkiehdot. Poikkeuskäsittely- eli rescue-lohkoon siirrytään, jos funktion kutsuja rikkoo funktiolle asetettua esiehtoa tai funktion tulos rikkoo sille asetettua jälkiehtoa. Tällöin voidaan palata funktion suoritukseen avainsanalla retry. Uudelleen yrityksille voidaan asettaa jokin yläraja ja sen ylityttyä palataan funktiosta takaisin sen kutsujaan. Tällöin poikkeuksen käsittely jää funktion kutsujan hoidettavaksi.

4 Esimerkki sopimussuunnittelusta ja poikkeuskäsittelystä: require esiehdon_tagi: a > 0 do -- Koodia joka tekee jotain esim. lisää muuttuja a:n arvoa ensure jalkiehdon_tagi: a < 10 rescue -- Käsitellään poikkeusta retry -- Retryllä voidaan suorittaa do-osio uudelleen 2.4 Kääntäminen ja roskienkeruu Eiffel mahdollistaa myös muiden ohjelmointikielien käytön koodin sisällä. Ainakin C- kieli on suoraan tuettu niin, että Eiffel-funktion rungon voi koodata C-kielellä. Voidaan käyttää C-koodia esim. lyhyille matalan tason operaatioille. Useimmat Eiffel-kääntäjät generoivatkin ensin C-koodia, jota sitten käännetään C-kääntäjällä. Tällä tavoin voidaan optimoida koodia C-kääntäjällä ja saada siirrettävyyttä eri käyttöjärjestelmille. Aina ei kuitenkaan generoida C-koodia eikä varsinaista suoraa kytkentää ole C-kieleen. Nykyään jotkut kääntäjät osaavat myös tehdä CIL (Common Intermediate Language) -koodia tai Java bytecode -koodia välivaiheena. Eiffel käyttää roskienkeruuta, eli vapauttaa automaattisesti olion varaamaa muistia, kun siihen ei enää viitata. Vaikka roskienkeruu on tyypillistä tulkattaville kielille, löytyy Eiffelin lisäksi myös muitakin käännettäviä kieliä, joilla on roskienkeruuta. Eiffelin roskienkeruu on siitä hyvä, että se ei pelkästään vapauta muistia omaan käyttöönsä vaan palauttaa vapautettua muistia käyttöjärjestelmälle. Näin vapautettua muistia voidaan käyttää jopa muille sovelluksille, mikä on hyödyllistä varsinkin sovelluksen pitkäkestoisessa käytössä.