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)