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

Samankaltaiset tiedostot
ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

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

TIE Principles of Programming Languages CEYLON

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

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

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

1. Omat operaatiot 1.1

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

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

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

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

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

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

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

Ohjelmointi 1 / syksy /20: IDE

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

15. Ohjelmoinnin tekniikkaa 15.1

Haskell ohjelmointikielen tyyppijärjestelmä

Ohjelmoinnin perusteet Y Python

Taulukot. Jukka Harju, Jukka Juslin

Groovy. Niko Jäntti Jesper Haapalinna Group 31

15. Ohjelmoinnin tekniikkaa 15.1

Java-kielen perusteet

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

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

Ohjelmointi 1. Kumppanit

Common Lisp Object System

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

Javan perusteita. Janne Käki

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

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

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

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

1. Olio-ohjelmointi 1.1

Ohjelmoinnin perusteet Y Python

4. Lausekielinen ohjelmointi 4.1

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

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

Osoitin ja viittaus C++:ssa

Ohjelmoinnin peruskurssi Y1

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Ohjelmoinnin perusteet Y Python

Loppukurssin järjestelyt C:n edistyneet piirteet

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

Loppukurssin järjestelyt

Ohjelmoinnin peruskurssi Y1

TIEA341 Funktio-ohjelmointi 1, kevät 2008

7. Näytölle tulostaminen 7.1

Sisällys. 15. Lohkot. Lohkot. Lohkot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Kääntäjän virheilmoituksia

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin perusteet Y Python

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

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

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

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Matti Riihimäki Swift-ohjelmointikielen käyttäminen ios-sovelluskehityksessä. Diplomityö

Harjoitus 2 (viikko 45)

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

Ohjelmoinnin peruskurssi Y1

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

14. Hyvä ohjelmointitapa 14.1

Java-kielen perusteet

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

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

19. Olio-ohjelmointia Javalla 19.1

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Harjoitus 3 (viikko 39)

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

Ohjelmoinnin peruskurssi Y1

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin peruskurssien laaja oppimäärä

9. Periytyminen Javassa 9.1

ITKP102 Ohjelmointi 1 (6 op)

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

Metodien tekeminen Javalla

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Tutoriaaliläsnäoloista

11/20: Konepelti auki

Sisällys. 16. Lohkot. Lohkot. Lohkot

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

Transkriptio:

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... 1 2.2 Tyypitys... 1 2.3 Semantiikka... 2 2.4 Muistinhallinta... 2 3. Syntaksi... 2 4. Ohjelmointikielen erityispiirteet... 2 LÄHTEET... 5

1 1. JOHDANTO Tässä dokumentissa on käytetty pääosin lähteinä Swiftin dokumentaatiota [1] ja Matti Riihimäen diplomityötä aiheesta Swift-ohjelmointikielin käyttäminen ios-sovelluskehityksessä. [2] Swift on Applen kehittämä ohjelmointikieli ios, macos, watchos, tvos ja Linux järjestelmille. Swift esiteltiin ensimmäisen kerran yleisölle vuonna 2014 Worldwide Developers -konfrenssissa, mutta Swiftin kehittäminen alkoi jo vuona 2010. Aikanaan kaikki Applen sovellukset tehtiin käyttäen Objective-C:tä, mutta tämä kieli alkaa olla jo niin vanha, että uudemmat ohjelmointikielet omaavat paljon ominaisuuksia mitä Objective-C:llä ei ole. Apple alkoikin osittain tästä syystä kehittämään Swift -ohjelmointikieltä. Swift pohjautuukin paljon Objective-C:hen ja omaa paljon tärkeitä ominaisuuksia siitä, mutta siitä on pyritty tekemään turvallisempi. Lisäksi syntaksia on pyritty tekemään helpommin ihmisten ymmärrettäväksi. Applen esitellessä Swiftiä, sitä mainostettiinkin sloganilla Objective-C ilman C:tä. Swift on myös ottanut vaikutteita useista muista ohjelmointikielistä, kuten Rustilta, Haskelilta, Pythonilta ja C#:ltä. Alun perin ohjelmointikielen lähdekoodi ei ollut vapaasti saatavilla, mutta joulukuussa 2015 lähdekoodista tehtiin vapaata ja on nyt vapaasti saatavilla. Applella on kovat tavoitteet Swiftin kanssa ja vaikka kieli onkin uusi, on sitä otettu käyttöön monissa suuremmissakin yhteisöissä, kuten LinkedInissä ja Twitterissä [3]. 2. OHJELMOINTIKIELEN PERUSPERIAATTEET Tässä kappaleessa käsitellään Swift -ohjelmointikielen tärkeimmät perusperiaatteet ja ominaisuudet. Osiossa keskitytään erityisesti kurssilla TIE-20306 Principles of Programming Languages käytyihin asioihin. 2.1 Paradigmat Swift -ohjelmointikieli tarvitsee toimiakseen kääntäjän, joka kääntää koodin konekieleksi. Ohjelmointiparadigmojen näkökulmasta Swift on imperatiivinen ohjelmointikieli, mutta siinä on myös funktionaalisia ominaisuuksia. Imperatiivisessa ohjelmoinnissa ohjelma toteutetaan ohjelmoijan määräämässä järjestyksessä. Komennot suoritetaan muuttamalla ohjelmiston tilaan. Sen sijaan funktionaalisessa ohjelmoinnissa ei tunneta varsinaista tilan käsitettä, on olemassa vain funktioita, jotka saavat syötteitä ja antavat tuloksia. Funktionaalisessa ohjelmoinnissa funktiot ovat ensimmäisen luokan kansalaisia. Lisäksi funktionaalisessa ohjelmoinnissa ei ole muuttujia vaan ainoastaan vakioita ja literaaleja. Swift-ohjelmointikielessä sulkeumat tuovat funktionaalisia ominaisuuksia. Nämä sulkeumat ovat ensimmäisen luokan kansalaisia, eli ne käyttäytyvät muiden parametrien tapaan. Sulkeuma voi esimerkiksi olla funktion paluuarvona tai se voidaan tallentaa muuttujaan. Swiftissä on kolmentyyppisiä sulkeumia, joista yksi on funktiot. Funktionaalisissa käytetään usein hyväksi laiskaa evaluointia (laiskan evaluoinnin ideana on tehdä asioita vasta kun on ihan pakko). Swift -ohjelmointikielessä laiskaa evaluointia voidaan käyttää laiskojen muuttujien avulla. 2.2 Tyypitys Swift-ohjelmointikielessä käytetään staattista tyypitystä, jolloin jokainen muuttuja sidotaan johonkin tyyppiin käännösaikana. Muuttujan tyyppiä ei voi enää myöhemmin vaihtaa. Swiftissä muuttujat määritellään joko let (vakio) tai var (muuttuja), kääntäjä pystyy päättelemään itse tyypin (int, string, jne ). Ohjelmoija pystyy myös itse määrittelemään tyypin muuttujalle/vakiolle. Tyyppimuunnoksia Swift ei pysty tekemään, eli esim. kahta erilaista tyyppiä ei voi summata keskenään. Tämä tekee Swiftistä vahvasti tyypitetyn kielen. Tämä vähentää tyyppivirheiden mahdollisuutta, sillä kääntäjä huomaa kaikki mahdolliset tyyppivirheet, eikä virheet tule vastaan vasta ajon aikana.

2 2.3 Semantiikka Swift -ohjelmointikielessä käytetään suurimmalta osin arvosemantiikkaa, eli muuttujat sisältävät itse datan ja jokaisesta muuttujasta/vakiosta tehdään oma kopio. Viitesemantiikkaa voidaan Swiftissä käyttää avainsanalla class, eli muuttujat viittaavat objectiin muistissa. Funktioiden parametrien kanssa Swift käyttää yleensä pass-by-value:ta, eli jokaisesta parametrista tehdään oma kopio. Swiftissä on kuitenkin mahdollista käyttää pass-by-reference:ä määrittelemällä parametrin arvoksi inout. Tällöin parametri on viite tähän muuttujaan. 2.4 Muistinhallinta Swift käyttää muistinhallinnassaan ARC:tä (engl. Automatic Reference Counting). ARC laskee automaattisesti, kuinka monta kertaa ohjelmassa viitataan objektiin. Kun objektiin ei enää ole yhtään viittausta ohjelmassa, ei objektia enää tarvita ja se tuhotaan. Myös tuhoaminen hoidetaan automaattisesti, eikä ohjelmoijan tarvitse huolehtia tästä. Ohjelmoija voi kuitenkin luoda viittausyklin (engl. reference cycle), jonka takia ARC ei osaa tuhota objekteja oikein. Näitä viittausyklejä voidaan tekemällä weak tai unowned viitteitä, jolloin viitelaskuri ei kasva. 3. SYNTAKSI Swifin syntaksista on pyritty tekemään intuitiivisempi kuin edeltäjässään Objective-C-kielessä. Swift vastaa hyvin paljon mm. C++-kielen syntaksia, kuten allaolevasta esimerkistä huomataan. C++: int n = 42; if (n < 40) { // pakko olla sulut std::cout << "n is less than 40"; } else { std::cout << "n is 40 or above"; } if (n == 42) { std::cout << "the answer"; } Swift: 1 var n = 42 2 if n < 40 { 3 println("n is less than 40") 4 } else { 5 println("n is 40 or above") 6 } 7 8 if (n == 42) { //sulut ei pakolliset 9 println("the answer") 10 } Rivillä 1 nähdään muuttujan määrittely swift-kielellä. Muuttujan tyypin voi määritellä halutessaan komennolla: var n : Int = 42 Vakion määrittely taas tehdään seuraavalla tavalla: let n : Int = 42 Objective-C-kieleen verrattuna Swiftin yksi helpotus on se, että kieli ei vaadi puolipilkkuja rivien perään. 4. OHJELMOINTIKIELEN ERITYISPIIRTEET Swiftin perusperiaatteita ovat ymmärrettävyys, turvallisuus ja nopeus. Tässä kappaleessa pureudutaan näihin ominaisuuksiin tarkemmin ja esitellään muita Swiftin erityispiirteitä, jotka ovat harvinaisempia muissa ohjelmointikielissä. Kappaleessa verrataan Swiftiä lähinnä vain Objective-C -kieleen, sillä se on ollut aiemmin hallitseva kieli ios-järjestelmissä.

3 Swiftin syntaksista on tehty selkeämpi kuin mitä Objective-C oli, jonka seurauksena Swiftin avulla sama tarkoitus voidaan ilmaista lyhyemmällä koodipätkällä kuin edeltäjässään. Alla on tehty perinteinen Hello world -ohjelma molemmilla ohjelmointikielillä. Objective-C: NSString*str =@"HelloWorld"; NSLog(@"%@", str) Swift: let str ="HelloWorld" println("\(str)") Esimerkistä huomataan, että Swiftin tuloksesta löytyy sana print, joka yhdistetään tulosta-komentoon. Syntaksissa on myös otettu huomioon modernit tarpeet ja kieleen voi upottaa myös hymiöitä. Turvallisuus on Swiftin yksi vahvoista puolista. Turvallisuutta on kehitetty edeltäjästä muutamin eri keinoin. Kieleen on tehty muuttujatyyppi optional type, jonka voi liittää integer-muuttujaan x mm. seuraavalla tavalla: var x: Int? = 31 Optional-tyyppisellä muuttujalla voi joko olla jokin arvo tai sitten sen arvo on nil. Tämän tyyppiset muuttujat helpottavat koodin kirjoittamista, koska ei tarvitse olla omaa muuttujaa bool-arvoista muuttujaa sille, onko muuttujassa oikeasti jokin arvo vai ei. Swiftissä taulukoiden käytöstä on myös tehty turvallista. Kielessä ei ole mahdollista palauttaa dataa taulukon rajojen ulkopuolelta, kuten esimerkiksi kielissä Objective-C ja C oli mahdollista. Jos tällaista yritetään tehdä, ohjelma kaatuu ennen kuin mitään tietoja ehditään palauttaa. Vahva tyypitys luo turvallisuutta ja helpottaa ohjelmoijan toimimista siinä mielessä, että kaikkia tietotyyppejä ei tarvitse erikseen esitellä, koska kääntäjä osaa päätellä niitä itsekin. Swift käyttää vain yhtä tiedostoa, johon koodi talletetaan. Eli kielessä ei ole erikseen määrittelytiedostoa ja toteutustiedostoa kuten Objective-C- ja C++-kielissä. Tämä tarkoittaa sitä, että määrittelytiedostoa ei tarvitse määrittää toteutustiedostossa. Kielessä voi kuitenkin luoda niin monta tiedostoa kuin haluaa tai vaikka kirjoittaa kaiken koodin samaan tiedostoon. Swiftin yksi mielenkiintoisimmista ominaisuuksista on Playground, jossa voi kokeilla oman koodin toimivuutta nopeasti. Playground tarjoaa visuaalista palautetta omasta koodista reaaliaikaisesti, jonka ansiosta mm. virheet ovat helpommin löydettävissä. Tämä ominaisuus auttaa Swiftin opettelussa varsinkin, kun Playground näyttää mitä missäkin muuttujassa on milläkin hetkellä. Apple on myös luonut lapsille tarkoitetun Playgrounds-sovelluksen ipadille, jossa yhdistyy koodaaminen Swiftillä ja leikkiminen. Kuva 1 havainnollistaa Playgrounds-sovellusta. Swiftissä on mahdollista käyttää hyväksi myös funktionaalista ohjelmointia, kuten aiemmin dokumentissa mainittiin. Tämä lisää ohjelmoijan mahdollisuuksia ja tukee imperatiivista ohjelmointia. Funktionaalisten toteutusten kanssa tulee kuitenkin olla tarkkana, sillä ne eivät aina ole imperatiivisia toteutuksia tehokkaampia.

4 Kuva 1 Kuvakaappaus Applen Playgrounds-sovelluksesta [4]. Swift on vielä nuori ja sitä pyritään kehittämään aktiivisesti paremmaksi ja paremmaksi. Kieli on kuitenkin epävakaa siinä mielessä, että se ei ole taaksepäin yhteensopiva. Swiftissä ei siis ole takeita, että vanhemmat ohjelmat toimisivat uudemmissa versioissa. Toisaalta tämä on hyvä asia, sillä jos jossakin kohtaa tehdään kriittinen suunnitteluvirhe, niin suunnitteluratkaisuja voidaan vielä muuttaa ja kieltä ei ole sidottu mihinkään tiettyyn suunnitteluratkaisuun. Applella on kovat tavoitteet kielen kanssa ja niitä silmällä pitäen, tämä on juuri oikea tapa toimia kieltä kehittäessä. Taaksepäin yhteensopimattomuudessa on kuitenkin tiettyjä hankaluuksia. Kielen kanssa yhteensopivia kolmannen osapuolen työkaluja saattaa olla hankala löytää alati muuttuvassa kielessä. Swiftissä on mahdollista käyttää myös sisäkkäisiä funktioita, joiden avulla koodia pystyy jäsentelemään kompaktimmaksi ja parametrien välittäminen on helpompaa.

5 LÄHTEET [1] Swift-ohjelmointikielen dokumentaatio. https://developer.apple.com/library/content/documentation/swift/conceptual/swift_programming_langu age/index.html (saatavilla 15.11.2017) [2] Riihimäki, Matti. Swift-ohjelmointikielen käyttäminen ios-sovelluskehityksessä. https://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/24442/riihimaki.pdf?sequence=1 (saatavilla 15.11.2017) [3] The Good and the Bad of Swift Programming Language https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-swift-programming-language/ (saatavilla 15.11.2017) [4] Kuva Playgrounds-sovelluksesta. https://images.techhive.com/images/article/2016/07/ipadpro10- issuingcommands_swiftplaygrounds_ios10-100671802-orig.jpg (saatavilla 15.11.2017)