Groovy. Niko Jäntti Jesper Haapalinna Group 31

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

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

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

Java-kielen perusteet

16. Javan omat luokat 16.1

7. Näytölle tulostaminen 7.1

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

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

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

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Java-kielen perusteet

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

11/20: Konepelti auki

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Java-kielen perusteet

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

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

20. Javan omat luokat 20.1

7/20: Paketti kasassa ensimmäistä kertaa

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Olio-ohjelmointi Javalla

TIE Principles of Programming Languages CEYLON

Objective-C. Ryhmä 35: Ilpo Kärki Aleksi Pälä

Java kahdessa tunnissa. Jyry Suvilehto

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

17. Javan omat luokat 17.1

Taulukot. Jukka Harju, Jukka Juslin

15. Ohjelmoinnin tekniikkaa 15.1

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

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

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

11.4. Context-free kielet 1 / 17

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

Harjoitus 5 (viikko 48)

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

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

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

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

12. Monimuotoisuus 12.1

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

Ohjelmoinnin perusteet, syksy 2006

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

Tässä dokumentissa kuvataan Keimo-projektissa sovellettavia ohjelmointikäytäntöjä. Päivämäärä Projektiryhmä Keimo

Ohjelmoinnin jatkokurssi, kurssikoe

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

17. Javan omat luokat 17.1

Harjoitus 5 (viikko 41)

9. Periytyminen Javassa 9.1

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

Rajapinta (interface)

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

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

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

12. Monimuotoisuus 12.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Clojure, funktionaalinen Lisp murre

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

7. Oliot ja viitteet 7.1

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

ITKP102 Ohjelmointi 1 (6 op)

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

14. Poikkeukset 14.1

Osoitin ja viittaus C++:ssa

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

ITKP102 Ohjelmointi 1 (6 op)

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

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

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

Metodien tekeminen Javalla

Ohjelmoinnin peruskurssien laaja oppimäärä

Ehto- ja toistolauseet

1. Omat operaatiot 1.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Kielioppia: toisin kuin Javassa

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Harjoitus 4 (viikko 47)

Osoittimet ja taulukot

Harjoitus 6 (viikko 42)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Haskell ohjelmointikielen tyyppijärjestelmä

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Javan perusteita. Janne Käki

Transkriptio:

Groovy Niko Jäntti Jesper Haapalinna Group 31

Johdanto Groovy on Apachen kehittämä Javaan perustuva dynaaminen oliopohjainen ohjelmointikieli. Kielen kehitys alkoi vuonna 2003, versio 1.0 julkaistiin 2007 ja sitä kehitetään edelleen. Groovyn ideologiana on vaihtoehtoinen tyypitys, mutta mahdollisuudella staattiseen tyypitykseen ja kääntämiseen. Suurin osa toimivasta Java-koodista toimii myös Groovyssä. Ideana onkin tarjota Java-ohjelmoijille helposti omaksuttavat tavat ja pikku hiljaa totuttaa Groovyn idioomiin. Groovy tuo Javan ominaisuuksien lisäksi muun muassa mahdollisuuden scriptaukseen ja käännösaikaiseen metaohjelmointiin. Tässä on esiteltynä lyhyesti ja pinnallisesti Groovyn tärkeimpiä piirteitä ja ominaisuuksia. Vapaaehtoinen tyypitys Groovyn vapaaehtoista tyypitystä ei tule sekoittaa joistain ohjelmointikielistä tuttuun heikkoon tyypitykseen. Vapaaehtoisessa tyypityksessä ei ole pakko eksplisiittisesti kirjoittaa muuttujan tai funktion paluuarvon tyyppiä, mutta näin voi kuitenkin halutessaan tehdä. String astring = 'foo' assert astring. touppercase () Yllä muuttuja annetaan eksplisiittisesti tyyppi String, josta tiedetään löytyvän metodi touppercase(). Näin on totuttu tekemään esimerkiksi C++-kielessä. Groovyssä voitaisiin edellinen yhtä hyvin kirjoittaa seuraavanlaiseen muotoon: def astring = 'foo' assert astring. touppercase () Staattinen ja dynaaminen tyyppitarkastus Käännettäessä Groovy suorittaa oletusarvoisesti vain minimaalisesti tyyppitarkastelua. Staattisia tyyppitarkastuksia ei ole mahdollista tehdä, sillä luokan tai olion käyttäytyminen saattaa muuttua ajon aikana. On esimerkiksi mahdollista liittää dynaamisesti ajon aikana uusi metodi olioon. Eli Groovyssä ei siis voida tietää etukäteen, miten olion tulee toimimaan. Vaikka tiedetään luokan esittely, vasta ajon aikana osataan kutsua oikeaa jäsenmuuttujaa tai metodia. On myös mahdollista kirjoittaa ohjelmakoodi perinteisellä Java -tyylillä, eli luovutaan dynaamisuudesta ja luotetaan staattiseen tyyppitarkastukseen. Kääntäjälle voidaan luokka- tai metodikohtaisesti kertoa, että halutaan käyttää staattista tyypitystä antamalla luokalle tai metodille annotaatio @groovy.lang.typechecked. Tällöin kääntäjä tekee käännöksen aikana paljon enemmän tarkasteluja ja antaa todennäköisemmin virheitä.

Syntaksi Groovyn syntaksi on hyvin samanlainen kuin suosituimmissa ohjelmointikielissä. Esimerkiksi kommentointi tapahtuu täysin samalla tavalla kuin C++:ssa ja Javassa. Mutta Groovystä löytyy mielenkiintoinen ominaisuus nimeltään quoted indentifiers. Nämä esiintyvät pisteen jälkeen pistelausekkeissa. Esimerkiksi name osuus lausekkeessa person.name voidaan lainausmerkkien avulla kirjoittaa person. name tai person. name. Mielenkiintoisempaa tässä on se, mitä tämä mahdollistaa. Lainausmerkkien sisällä voidaan muun muassa käyttää merkkejä, mitkä ovat kiellettyjä Java-kielessä, kuten alaviiva, välilyönti tai kysymysmerkki. Varsinainen käyttötarkoitus liittyy kuitenkin Groovyn merkkijonotyyppeihin. Lainausmerkkien sisälle voidaan nimittäin kirjoittaa lauseke, joka sitten evaluoidaan ohjelmaa ajettaessa. Tästä kuitenkin kerrotaan tarkemmin kohdassa Merkkijonot. Merkkijonot Groovyssa on kahdenlaisia merkkijonotyyppejä. Ensimmäinen on suoraan Javasta, java.lang.string, ja toinen on Groovyn oma GString, jota vastaavia löytyy joistain muista ohjelmointikielistä interpolated string -nimellä. Heittomerkeillä ympäröidyt merkkijonot ( tämä on lause ) ovat perinteisiä Java merkkijonoja, eikä näitä voi interpoloida. Kolmilla heittomerkeillä ympäröity merkkijono on monirivinen, esimerkiksi: tässä On Monta riviä Lainausmerkeillä ympäröidyt merkkijonot ovat myös Java -merkkijonoja, jos ne eivät sisällä interpoloitavaa lauseketta. def name = 'Guillaume' // a plain string def greeting = "Hello ${name}" assert greeting. tostring () == 'Hello Guillaume' Myös interpoloitavista merkkijonoista voi tehdä monirivisiä. Tämä tapahtuu ympäröimällä monirivinen teksti kolmilla lainausmerkeillä: def name = 'Groovy' def template = """ Dear Mr ${name}, You're the winner of the lottery! Yours sincerely, Dave """

Numerot Dynaamisuus ja vapaaehtoinen tyypitys mahdollistavat, ettei Groovy:ä kirjoitettaessa tarvitse kertoa tarkalleen numeron tyyppiä, vaan muuttuja mukautuu automaattisesti. Esimerkiksi: def a = 1 assert a instanceof Integer // Integer.MAX_VALUE def b = 2147483647 assert b instanceof Integer // Integer.MAX_VALUE + 1 def c = 2147483648 assert c instanceof Long Def -avainsanalla määriteltyyn muuttujaan voidaan myös pakottaa tietty tyyppi lisäämällä muuttujan arvon perään tyyppiä kuvaava kirjain; i = integer, bi = big integer, l = long jne. assert 42i == new Integer ( '42' ) // lowercase i more readable assert 123L == new Long ( "123" ) // uppercase L more readable Sulkeumat Groovyssä sulkeuma on avoin, anonyymi koodilohko, joka voi ottaa vastaan argumentteja, palauttaa arvon, ja joka voidaan tallentaa muuttujaan. Groovyssä sulkeuma voi viitata sekä sitä ympäröivän näkyvyysalueen muuttujiin että ympäröivän näkyvyysalueen ulkopuolella määriteltyihin vapaisiin muuttujiin. Sulkeuma määritellään noudattaen syntaksia: { [ closureparameters -> ] statements } Hakasulkeiden ympäröimä osa on vapaaehtoinen. Se sisältää luettelon sulkeuman ottamista parametreista. Jälkimmäinen osa sisältää nolla tai useamman lausekkeen. Sulkeuma on luokan groovy.lang.closure instanssi ja voidaan tallentaa muuttujaan. Sulkeumaa kutsutaan kuten tavallisia metodeja. Esimerkiksi: def printname { name -> println name } printname ("Teemu Teekkari") Groovyssä sulkeumia käytetään lambda-funktioiden sijasta ja ne ovat tärkeimpiä ominaisuuksia funktionaalisen ohjelmoinnin näkökulmasta.

Erot Javaan Groovystä on haluttu luoda mahdollisimman luontainen ohjelmointikieli Javaan tottuneille. Kuitenkin eroja löytyy, etenkin kielen dynaamisuudesta johtuen. Merkittävimpänä erona lienee kutsuttavien metodien valinta vasta ajon aikana. Tämä tarkoittaa sitä, että kun ohjelmaa ajetaan ja kutsutaan jotain metodia, oikea metodi päätellään parametrien tyyppien perusteella. Javassa tämä tapahtuu jo käännösvaiheessa. Groovyssä on tuotuna valmiiksi useimmin käytetyt paketit ja luokat, joten niitä voi käyttää ilman eksplisiittistä import-lauseketta. Lainausmerkkien ja heittomerkkien ympäröivät merkkijonot tai yksittäinen merkki on Groovy:ssä automaattisesti tyyppiä String (tai GString). Vain yhden kirjaimen sisältävä merkkijono on tyyppiä Char vain silloin, kun muuttujalle on eksplisiittisesti annettu tyypiksi char. assert 'c'. getclass ()== String char a = 'a' assert a. getclass ()== Character Toisin kuin Javassa, vertailuoperaattoreista ==-operaattori kääntyy Groovyssä metodiksi compareto(), jos vertailtavat objektit toteuttavat Comparable-rajapinnan, ja metodiksi equals() muulloin. Mikäli halutaan tarkistaa osoittavatko kaksi objektia samaan muistipaikkaan, käytetään metodia is(). Groovy ei myöskään tue Java 7:n Automatic Resource Management -lohkoja vaan sama toiminnallisuus saavutetaan käyttämällä sulkeumia, mikä yksinkertaistaa ohjelman rakennetta.