ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017
Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................ 3 2.3 Työkaluja............................... 3 3 Muita huomioita 4 i
1 Johdanto Evan Czaplicki kehitti Elm-ohjelmointikielen vuonna 2012 tutkielmaansa varten, jossa hän tutki Elm-kielen käyttöä funktionaalisten käyttöliittymien luomista varten. Sen ensimmäinen versio ei ollut muuta kuin internetistä löydettävä koodieditori, sekä esimerkkejä. Internetissä sijaitseva koodieditori teki siitä helpon kokeilla. Elm on web-ohjelmointiin suunnattu staattisesti tyypitetty puhtaasti funktionaalinen ohjelmointikieli. Elm on ottanut paljon vaikutteita Haskellista, ja se toimii yhteen perustavanlaatuisten web-tekniikoiden kuten HTML ja CSS kanssa. Se on käännettävä ohjelmointikieli, joka kääntyy JavaScriptiksi, ja jota voidaan upottaa suoraan JavaScriptiin. "Hello" ++ " World!" Koodi 1: Hello World! 1
2 Ominaisuuksia Elm tukee modulaarisuutta, mahdollistaen koodin jakamisen useampaan pienempään tiedostoon. Moduulit Elmissä toimivat nimiavaruuksien avulla. Toisesta moduulista käytettävä funktio täten kutsutaan syntaksilla Module.function. Elmiin löytyy kattava määrä julkisia kirjastoja, joita voi ladata Elm-kielen virallisilta kotisivuilta. Elmin koodin arkkitehtuurina toimii Model-Update-View. Tässä mallissa model sisältää ohjelman tilan, update kertoo, miten ohjelman tilaa päivitetään, ja view kuvaa tapaa, jolla ohjleman model esitetään käyttäjälle. Tämä oli hyvin luonnollinen malli Elm-kielelle, jonka sen kehittäjät havaitsivat ilmenevän sillä kirjoitetuissa peleissä lähes aina. 2.1 Muuttujat ja tietorakenteet Kontrastina JavaScriptille Elm on vahvasti ja staattisesti tyypitetty kieli, kuten Haskell, johon se pohjautuu. Kuitenkaan arvojen tyyppejä ei ole pakko esitellä, vaan kääntäjä tunnistaa ne itse, kuten JavaScriptissä, joskaan Elm ei myöskään vaadi mitään vastinetta JavaScriptin var :lle jolla eritellään muuttujat. Elmissä kaikki muuttujat ovat muuttumattomia (immutable), eli niiden arvot eivät koskaan muutu. Tämän johdosta tietorakenteet kuten Dict ja Map on toteutettu pysyvinä tietorakenteina (persistent data structure): kaikki tietorakenteet pitävät sisällään kirjanpidon tietorakenteen vanhoista versioista, eli tietorakenteen sisältöä ei koskaan muuteta, vaan tietorakenteen yhteyteen lisätään päivitetty kopio, joka jakaa vanhan version kanssa muuttumattomat kentät. 2
2.2 Funktiot Elmin funktiot ovat, kuten puhtaalle funktionaaliselle kielelle on ominaista, tilattomia. Funktioita ei ole pakko esitellä, joskin dokumentaatio suosittelee sitä selkeyden vuoksi. Mitään mekaanista tarvetta sille ei kuitenkaan ole, joskin esitellylle funktiolle on määritetty etukäteen tyypit. Myös anonyymit funktiot ovat sallittuja. Funktiot ovat syntaktisesti erikoisia ihmisille, jotka ovat tottuneet esimerkiksi C++, Java, JS, Python funktioihin foo(a,b), sillä ne käyttävät sulkujen ja pilkkujen sijasta välilyöntejä funktioiden kutsussa. Koodissa 2 esitetään yksinkertainen funktio, joka ottaa kaksi tyypin Int parametria ja palauttaa yhden Int:n. Koodi 2: Funktio foo ja anonyymi funktio -- Funktion foo esittely ja toteutus foo Int -> Int -> Int foo a b = a+b -- Anonyymi funktio joka toteuttaa jakolaskun \c -> c / 2 2.3 Työkaluja Käännettäessä Elm käy läpi kaikki mahdolliset polut, mitä ohjelmakoodi voi suorittaa ajon aikana. Samalla, kun polkuja käydään läpi, kääntäjä tarkistaa koodin kaikki tyypitykset, tarkistaen, että yhdessäkään tapauksessa tyypityksien kanssa ei tule epäsopivuuksia. Tämän takia Elmillä kirjoitettu koodi ei koskaan tuota virheitä ajon aikaisesti. Elmin kääntäjä myös pystyy tulkitsemaan väärin kirjoitettuja muuttujien nimiä, analysoiden koodia ja päätellen sen mukaan, mitä muuttujan nimeä kyseisessä kohdassa saatetaan tarkoittaa. Käännöksen yhteydessä se myös ilmoittaa tästä ohjelmoijalle, jotta virhe voidaan korjata. 3
Elmin debuggeri hyödyntää Elmin puhdasta funktionaalisuutta sekä muuttumattomia muuttujia. Se tallentaa ohjelmoijan syötteet aikajanalle, jota ohjelmoija voi sen jälkeen kulkea eteen- ja taaksepäin. Kun ohjelmoija sen jälkeen muuttaa koodin arvoja, hän voi nähdä niiden vaikutukset lopputuloksessa suoraan debuggerissa ilman, että hänen tarvitsee testata ohjelmaa manuaalisesti itse. 3 Muita huomioita Elm ei tarjoa ohjelmoijalle työkaluja muistinhallintaan. Kyseessä on varsin korkean tason kieli, joka kääntyy toiseksi korkean tason kieleksi, joten tämä ei yllätä. Elm kuitenkin pyrkii tehokkuuteen, joten voidaan mahdollisesti luottaa kääntäjän toteuttajien luovan mahdollisimman tehokkaita käännöksiä. Toinen mainittava huomio lienee Elmin record -tietorakenne, joka on hieman kuin JavaScriptin olio (verrattavissa monen muunkin kielen olioihin), mutta sen kentät eivät voi olla tyhjiä, siltä ei voi kysyä kenttiä joita siinä ei ole, eikä se tunne viittauksia itseensä (muiden kielien self, this). 4