Ero sivun ”Funktionaalinen ohjelmointi” versioiden välillä
[arvioimaton versio] | [arvioimaton versio] |
Poistettu sisältö Lisätty sisältö
p Botti lisäsi: ca:Programació funcional |
pieniä oikaisuja ja selvennöksiä, ML-historiaa |
||
Rivi 1:
'''Funktionaalinen ohjelmointi''' eli '''funktio-ohjelmointi''' on [[ohjelmointiparadigma]], joka perustuu matemaattisten [[funktio]]iden käyttöön ja tarkemmin [[lambda-kalkyyliin]]. Puhtaasti funktionaalisissa ohjelmissa ei ole lainkaan tilaa eikä siten myöskään sijoituslausetta tai silmukoita: muuttujaan ei voida sijoittaa uutta arvoa, ja suuret tietomäärät käsitellään [[rekursio]]n avulla. Toisin kuin [[imperatiivinen ohjelmointi|imperatiivisessa ohjelmoinnissa]], funktiolla ei ole sivuvaikutuksia eli sen arvo on aina sama samoilla parametreilla.
Monet funktionaaliset ohjelmointikielet eivät ole puhtaasti funktionaalisia, vaan tukevat myös tilamuuttujia ja sivuvaikutuksia. Puhtaudella on joitain ongelmallisia kohtia, kuten monimutkainen syötön ja tulostuksen toteutus, joka vastaavasti on helppo toteuttaa jos sivuvaikutukset sallitaan. Silti ohjelmointikieltä pidetään funktionaalisena, mikäli sillä pääsääntöisesti ohjelmoidaan kuten puhtaasti funktionaalisilla kielillä.
Yliopistoissa suosituimpia funktionaalisia ohjelmointikieliä ovat [[Scheme|Lisp/Scheme]] ja [[Haskell]] sekä symboliseen matematiikkaan [[Mathematica]]. Yritysmaailmassa käytetään enemmän [[Common Lisp]]iä, [[Erlang (ohjelmointikieli)|Erlang]]ia, [[Scala (ohjelmointikieli)|Scala]]a ja [[XML]]-tiedostojen muuntamiseen tarkoitettua [[XSLT]]:tä. Lisäksi monissa imperatiivisissa kielissä on jonkinlaista tukea funktionaaliselle ohjelmoinnille: usein ainakin funktion voi antaa parametrina, ja joskus kielessä on rakenne nimettömien funktioiden luomiseen lambda-lausekkeella. Merkittävänä poikkeuksena [[Java]] ei tue suoraan oikeastaan mitään funktionaalisen ohjelmoinnin apuvälinettä.
== Historia ==
Vuonna 1936, siis ennen tietokoneita, toisistaan erillään julkaistiin kaksi tietojenkäsittelytieteen matemaattisen pohjan muodostavaa [[laskennan malli]]a: [[Turingin kone]] ja [[lambda-
Pian Turingin koneen ja lambda-laskennan huomattiin olevan sama asia eri tavalla määriteltynä: toisin sanoen Turingin koneen ja lambda-laskennan ohjelmat voidaan kääntää toisikseen. Kummatkin mallit ovat olleet hyödyllisiä: Turingin koneen pohjalta kehittyi aikanaan tietokone, mutta ohjelmointikielet perustuvat enemmän lambda-
Vuonna 1958 [[John McCarthy]] kehitti lambda-
Lispin ei ollut tarkoitus olla oikea ohjelmointikieli. Siitä huolimatta McCarthyn kollega Steve Russell ohjelmoi Lisp-tulkin tietokoneelle. Erilaiset Lispin muunnelmat yleistyivät nopeasti ohjelmointikäytössä. Vaikka Lisp-kieliperhe
70-luvun lopulla Robin Milner yhdisti tyyppiteorian ja teoreemantodistajien tutkimusta konkreettiseen funktionaaliseen ohjelmointiin. Tuloksena oli ML-ohjelmointikieli, joka esitteli automaattisen [[tyypinpäättely]]n ja käytti matematiikalta näyttävää kielioppia. Siitä kehittyi myöhemmin Standard ML, OCaml ja Haskell, jotka ovat tunnettuja muun muassa vahvasta tyyppijärjestelmästä ja kääntäjien optimointikyvystä. Nykyisin ML-pohjaisten funktionaalisten kielten ja niiden tyyppijärjestelmien sekä optimoinnin tutkimus on hyvin vilkasta.
== Funktionaalisen ohjelmoinnin etuja ==
* Selkeä yhteys matematiikkaan, jolloin ohjelma voidaan helposti kirjoittaa vastaamaan määritelmää ja todistaa oikeaksi [[matemaattinen induktio|induktiolla]].
* Parempi tuki funktioiden käsittelylle (funktio parametrina, lambda-lauseke, funktioiden kompositio, ''currying'' eli curry-muunnos tai ”kuritus”), jolloin ohjelma usein voidaan jakaa pienempiin ja yleiskäyttöisempiin osiin.
* Koska sivuvaikutuksia ei ole, funktioiden suoritusjärjestys on vapaa ja kääntäjä voi optimoida samanlaiset funktiokutsut yhdeksi.
* Rinnakkaisuus ei aiheuta lainkaan vaikeuksia, koska jaettavaa tilaa ei ole.
* Ohjelmoija oppii määrittelemään ohjelmia täsmällisesti, soveltamaan rekursiota ja käyttämään geneerisyyttä.
*
== Esimerkkejä ==
Rivi 45 ⟶ 46:
== Funktionaalinen ohjelmointi opetuksessa ==
Yleensä funktionaalisia kieliä ei käytetä perusopetuksessa. Kuitenkin yliopistoissa funktionaalista ohjelmointia opetetaan usein syventävällä kurssilla esimerkiksi Haskell- tai Scheme-ohjelmointikielellä.
== Lähteet ==
|