Funktionaalisten kielten oppimisesta ja valinnasta

Samankaltaiset tiedostot
ELM GROUP 04. Teemu Laakso Henrik Talarmo

1. Olio-ohjelmointi 1.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Clojure, funktionaalinen Lisp murre

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

4. Lausekielinen ohjelmointi 4.1

TIE Principles of Programming Languages CEYLON

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Common Lisp Object System

Tiina Partanen. Koodaamassa Matikantunnilla

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Tähtitieteen käytännön menetelmiä Kevät 2009

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen historia

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

Arttu Kaipiainen Funktionaalinen ohjelmointi web-ohjelmistokehityksessä. Diplomityö

T Ohjelmistotekniikan seminaari

Ohjelmoinnin peruskurssien laaja oppimäärä

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin peruskurssien laaja oppimäärä

Scheme-kesäkurssi luento 2

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

11/20: Konepelti auki

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmoinnin peruskurssien laaja oppimäärä

812341A Olio-ohjelmointi, I Johdanto

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

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

Racket ohjelmointia osa 1. Tiina Partanen Lielahden koulu 2014

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

7/20: Paketti kasassa ensimmäistä kertaa

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

JAAKKO RINTA-FILPPULA FUNKTIONAALISEN OHJELMOINNIN HYÖDYT JA HAAS- TEET. Kandidaatintyö

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

opiskelun suunnittelujärjestelmä, kurki ja ilmo käyttävät kaikki samaa tietokantaa, ja uusi järjestelmä tulee osaksi tätä.

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Onnistunut ohjelmistoprojekti

TkK-tutkielmat

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Tutoriaaliläsnäoloista

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Test-Driven Development

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Ryhmäharjoitus III: Mitä on koodaaminen? A. TIEY4 Tietotekniikkataidot, kevät 2017 Tehdään ryhmäharjoitustunnilla 20.3.

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Ohjelmoinnin peruskurssien laaja oppimäärä

Uudelleenkäytön jako kahteen

Ohjelmoinnin peruskurssien laaja oppimäärä

JS-kehitys - yleiskuvaus. TIEA255 - Juho Vepsäläinen

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

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Ohjelmoinnin peruskurssien laaja oppimäärä

Test-Driven Development

CUDA. Moniydinohjelmointi Mikko Honkonen

13/20: Kierrätys kannattaa koodaamisessakin

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Tietorakenteet ja algoritmit

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnista. Ohjelmien toteutukseen tarjolla erilaisia välineitä:

Avoimen lähdekoodin ohjelmien käytettävyydestä

Ohjelmoinnin peruskurssien laaja oppimäärä

Luku 5. Monadit. 5.1 Siirrännän ongelma

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

SEMINAARI ESSEE: DYLAN. TIE Principles of Programming Languages

Funktionaalinen ohjelmointi

TERO LAHTINEN FUNKTIONAALISTEN JA OLIO-IMPERATIIVISTEN OHJELMISTOKOMPONENTTIEN YHDISTÄMINEN. Diplomityö

Ohjelmoinnin peruskurssien laaja oppimäärä

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Ohjelmoinnin peruskurssien laaja oppimäärä

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Transkriptio:

Funktionaalisten kielten oppimisesta ja valinnasta Tampere 24.1.2018 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 1

Kehitystä? 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 2

Tarve funktionaaliselle ohjelmoinnille - motivaatio Rinnakkaisen suorittamisen lisääntyminen Immutability vaatimus Oliokieliä ei käytetä niin kuin joskus ajateltiin Luokat lähinnä datan väliaikaiseen kuvaamiseen Ei varsinaista uudelleenkäyttöä perimällä Käytännössä palvelimen kirjoittaminen on POJOjen kirjoittamista ja datan kuljettaminen niiden kautta selaimeen ja tietovarastoon (ORM) Tyypillinen spring/hibernate softa Set, get Laiska evaluointi säästää resursseja 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 3

Funktonaalisuus kiteytettynä muuttujien kannalta a = 0 def increment(): global a a += 1 Mutable data def increment(a): return a + 1 Immutable data 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 4

Java 9 Lambda-lausekkeet Välitetään funktio parametrina Korkeamman asteen funktiot Palautetaan funktio funktiosta Immutable stream Sivuvaikutusten välttämiseksi Optionals Null pointterien välttämiseksi Map, filter, reduce 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 5

Funktionaalisen ohjelmoinnin hyödyt Paljon vähemmän koodia Esim. 50% Nopeuttaa myös uuden tekijän sisäänajoa Koska kokonaiskoodimäärä on pienempi Kehittäminen nopeampaa Yksinkertaisemmat ratkaisut, joita on helpompi ymmärtää Luokkahierarkiat ja viestinvälitys synnyttävät paljon ajonaikaisia yhteyksiä olioiden välille, joiden perässä pysyminen vaikeaa Moniperintä ja korket luokkahierarkiat Vaikea hallita -> usein päädytään kompositioon 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 6

Milloin fp ei ole hyvä vaihtoehto Ohjelman toiminta on lähinnä tilan muuttamista Ohjelman osien välinen kommunikointi tapahtuu tilan muutosten avulla Matalan tason ohjelmointi Tilan muuttamista 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 7

Mihin se sopii? Rinnakkainen ohjelmointi Tilattomuus 4 CPU:ta rinnan DSL Helppoja kirjoittaa esim. Clojurella Matemaattispainotteiset algoritmit Koodia on helpompi lukea kuin vastaaavaa proseduraalista koodia Kun halutaan välttää bugeja Optional, Maybe Vähemmän koodia Sofistikoituneempi virheenkäsittely (ei pureta pinoa) 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 8

Ruby, Python, Java Näistä löytyy funktionaalisia piirteitä kaikista Miksei siis käyttäisi map, reduce, filter ja lambdat ja Optional? Problem solved käytetään vaikka Java 9 versiota ja sen funktionaalisia piirteitä! 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 9

Java, Python, Scala Eivät kuitenkaan ole olemukseltaan funktionaalisia kieliä Voi tehdä myös imperatiivisia ratkaisuja Funktionaalisella kielellä ohjelmoitaessa tapa ajatella ongelman ratkaisusta eroaa merkittävästi imperatiivista tavasta ratkaista ongelma Ongelman kuvaus ajattomasti Imperatiivinen tyyli korostaa ajan kulumista ja suorituksen vaiheita Funktionaalinen tyyli korostaa ongelman kuvausta 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 10

Mikä kieli oppimisen kannalta paras? Kysy ensin mikä on oppimisen tavoite? Oppia käyttämään map ja reduce funktioita? Ja muita korkeamman kertaluvun funktioita? Oppia jotain funktionaalista? Vältellä muuttuvaa dataa, varautua rinnakkaisuuteen/samanaikaisuuteen Immutability, pure functions Oppia uusi tapa ajatella ongelman ratkaisua? Oppia uusi paradigma Oppia käyttämään esim. ClojureScriptin re-frame/reagent kirjastoja? Oppia eräs funktionaaliseen ohjelmointiin läheisesti liittyvä ratkaisu tiettyyn domain spesifiin ongelmaan selaimen DOM puun tilan hallinta Käyttää fp-ominaisuuksia sisältävää kieltä heti käytännön toteutuksissa (esim. verkkopalvelin + selain) Esim. Scala, Clojure, F# Jokin muu, mikä? 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 11

Tavoite - paradigman oppiminen Erinomainen kieli Haskell Pakottaa funktionaaliseen ajatteluun Mikä on paljon muutakin kuin map ja reduce IO-operaatiot eristetty puhtaasta koodista IO - monadeilla Esim. satunnaislukujen luominen, file IO, jne. IO-operaatioita kömpelöjä käyttää Dokumentaatiossa toivomisen varaa Huikea tyyppijärjestelmä Käytetään jossain määrin oikeastikin Myös ML (Meta Language) 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 12

Tavoite fp-ominaisuuksien hyödyntäminen Korkeamman kertaluvun funktiot Ruby, Java 8->, Python, JavaScript, C++ - >11, Elixir, Erlang, Go, Elixir, D, Dart, Scala, Swift, Smalltalk, PHP, R, Clojure, F#, OCaml, C#, Haskell.. Siis lähes kaikilla kielillä voi ohjelmoida korkeamman kertaluvun funktioilla operointi funktionaalisesti Tyyli imperatiivinen 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 13

Välimalli - tavoite epäpuhtaan koodin vähentäminen Välimallin valinta https://www.youtube.com/watch?v=mxiiv_ecs88 Clojure, Scala Käytetään oikeasti Koodi voi olla hyvinkin puhdasta (pure) Pohdinta, mikä pitää toteuttaa puhtaasti ja missä voi olla epäpuhtauksia Myös selaimessa scala.js ja ClojureScript Käytännöllisin ratkaisu arkitarpeisiin Tarvitaanko olioita? Refaktorointitarpeet (funktioiden polymorfismi (clj), luokat->oliot->perintä(scala) 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 14

Scala Martin Odersky, 2004 École Polytechnique Fédérale de Lausanne https://www.scala-lang.org/documentation/learn.html Mutability kuuluu kuvioon, mutta sitä voi myös vältellä Hyvällä tavalla pragmaattinen Oliokieli, missä funktionaalinen Shapeless etc. pure functional kirjastot Lens (mm. kopiointi mutaation sijaan) Helppo kokeilla ScalaFiddle Tamperelaista tekoa, Otto Chrons. JVM-pohjainen, käytetään oikeassa elämässä CLR-versiota ei päivitetä Scala.js -> JavaScript 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 15

Clojure Rick Hickey, 2007 Helppo laatia DSL makrojen avulla Helppo tehdä kokonaan uusi kieli https://www.braveclojure.com/, pragmaattinen kirjanen Käytetään oikeassa elämässä Työkalut keskeneräisiä ja vaiheessa Osaamistoive aika monessa työpaikkailmoituksessa Mutta kuitenkaan itse clojure-kehittäjiä ei etsitä vrt. scala JVM-pohjainen, myös CLR ja JavaScript ClojureScript 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 16

F# Don Syme, 2005 Pyörii CLR:n päällä Yhteensopiva C#:n kassa C# sis. Myös fp-ominaisuuksia LINQ Walmart investoi vuonna 2016 3.3 mrd taalaa start-upiin, jonka teknologia on F# pohjainen (jet.com) Kurottava Amazonin etumatkaa umpeen Oliot mukana vrt. Scala Piirteitä Haskellista, ML:stä ja LINQ:sta 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 17

Funktionaaliset käsitteet Kategoriateoria Kategoriateoria näkyy Haskellissa Asian kuvaa erinomaisesti Bartoz Milewski https://bartoszmilewski.com/2014/10/28/categorytheory-for-programmers-the-preface/ Monadi, funktori, applicative funktori javallakin voi ohjelmoida monadisesti Aika hankalaa Esim. https://www.slideshare.net/mariofusco/monadic-java Ja monta muuta Funktionaaliseen ohjelmointiin on paras funktionaalinen ohjelmointikieli 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 18

Fp-kieli ensimmäisenä kielenä Yläasteen opettajilla erittäin hyviä kokemuksia Racketista Hyvin clojuremainen kieli Scheme tyyppinen Racket BSL (Beginning Student Language) Rajallinen määrä funktioita Kokemuksen mukaan parempi oppia fp ensin helpottaa muiden paradigmojen oppimista myöhemmin Ei toimi toisin päin!!! 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 19

Lampun vaihtaminen Kuinka monta Haskell-ohjelmoijaa tarvitaan vaihtamaan lamppu? Haskell-ohjelmoijat eivät vaihda lamppua, vaan korvaavat sen. Samalla korvataan myös talo, jossa lamppu on. 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 20

Pari opiskeluvinkkiä REPL Vuorovaikutus komentotulkin kanssa Funktioiden testaaminen Vanhan unohtaminen Varsinkin, jos haluaa oppia tavan ajatella vs. käyttää funktionaalisia ominaisuuksia 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 21

Reality check Clojure Ei ole production ready Hypeä enemmän, pihviä vähemmän Lisp-maine ei auta Hyvä porttihuume funktionaaliseen ohjelmointiin, mutta jos on aikaa opiskella vain yksi kieli, yleiskäyttäisempi ja valmiimpi voi olla parempi, esim. Scala Haskell Erinomainen, jos löytyy hyvä käyttötapaus, oma lukunsa Ohjelmien todistaminen helpompaa Matemaattiset sovellukset Teoreettinen Heikot työkalut F# Microsoftin työkalut, CLR, C# yhteensopiva Käytetään oikeasti, esim. case Walmart Finanssimaailman sovellukset pitää laskea oikein Azure functions tuki maaliskussa 2017 (vrt. Amazon Lambda, serverless) Scala Lupaavin 2000-luvun uusista kielistä Tukee olio-ohjelmointia Vahvat backend kirjastot (mm. Play, Akka) Vahvat fp-kirjastot (scalaz, cats etc.) Pragmaattinen 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 22

Linkit Kategoriateoria (jämäkkää teoriaa) https://bartoszmilewski.com/2014/10/28/categorytheory-for-programmers-the-preface/ Videosarja: https://www.youtube.com/watch?v=i8lbkfssr58 Functional design patterns (yleistajuinen) https://www.youtube.com/watch?v=srqt1nahyc 0 Odersky fp:n ja olio-ohjelmoinnin eroista ja kuinka Scala vastaa tarpeeseen modulaarisuus (yleistajuinen) https://www.youtube.com/watch?v=k_g_xutydpg 25.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 23

Linkit Haskell-kirja (kohtuullisen helppotajuinen) http://learnyouahaskell.com/ Why functional programming matters (teoreettinen) http://www.cse.chalmers.se/~rjmh/papers/whyfp.pdf Oderskyn Scala-kurssit Courserassa https://www.coursera.org/specializations/scala Clojure-kirja (helppotajuinen) https://www.braveclojure.com/ ScalaFiddle (kokeile Scalaa) https://scalafiddle.io/ Huom! Tässä myös scala.js vinkit, selaimen ja backendin voi molemmat laatia Scalalla 25.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 24

Linkit F# (kokeile F#) http://www.tryfsharp.org/learn Racket (opettajan materiaali harjoituksineen) http://racket.koodiaapinen.fi/ 25.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 25

Koulutukset ja legacy-koodin kirjoittaminen uudelleen Räätälöidyt toimialaan sovitetut koulutukset funktionaalisesta ohjelmoinnista tai ohjelmistokomponenttien uudelleensuunnittelu funktionaalisesti Funktionaalisen ohjelmoinnin soveltuvuuskonsultointi Sopiiko valitun toimialan ongelman ratkaisuun ja millä edellytyksillä juuso.vuorinen@ideallearning.fi 25.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 26