ebooksgratis.com

See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Funktionaalinen ohjelmointi – Wikipedia

Funktionaalinen ohjelmointi

Wikipedia

Funktionaalinen ohjelmointi eli funktio-ohjelmointi on ohjelmointiparadigma, joka perustuu matemaattisten funktioiden käyttöön. 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 rekursion avulla. Toisin kuin 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.

Yliopistoissa suosituimpia funktionaalisia ohjelmointikieliä ovat Lisp/Scheme ja Haskell sekä symboliseen matematiikkaan Mathematica. Yritysmaailmassa käytetään enemmän Common Lispiä, Erlangia 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ä.

Sisällysluettelo

[muokkaa] Historia

Vuonna 1936, siis ennen tietokoneita, toisistaan erillään julkaistiin kaksi tietojenkäsittelytieteen matemaattisen pohjan muodostavaa laskennan mallia: Turingin kone ja lambda-laskenta. Turingin kone on tietokoneen matemaattinen malli: ohjelman suoritus etenee koneen tilaa muuttamalla. Lambda-laskenta mallintaa funktion laskentaa: sieventämällä lauseketta säännöllisesti yksinkertaisemmaksi saadaan selville funktion arvo.

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-laskentaan. Funktionaaliset ohjelmointikielet ovat jopa hyvin lähellä alkuperäistä lambda-laskentaa.

Vuonna 1958 John McCarthy kehitti lambda-laskennan pohjalta Lisp-kielen (List Processing) tekoälyohjelmien määrittelyä varten, esimerkkinä siitä kuinka yksinkertainen Turing-täydellinen kieli voi olla. Se perustui vahvasti lambda-laskentaan mutta salli myös perinteisen imperatiivisen ohjelmoinnin.

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 on toiseksi vanhin yleisesti käytetty ohjelmointikieli, se on säilynyt tunnetuinpana ja käytetyinpänä funktionaalisena ohjelmointikielenä. Iästään huolimatta se ei ole muuttunut merkittävästi toisenlaiseksi kuten Fortran.

[muokkaa] Funktionaalisen ohjelmoinnin etuja

  • Selkeä yhteys matematiikkaan, jolloin ohjelma voidaan helposti kirjoittaa vastaamaan määritelmää ja todistaa oikeaksi induktiolla.
  • Parempi tuki funktioiden käsittelylle (funktio parametrina, lambda-lauseke, funktioiden kompositio, currying), jolloin ohjelma usein voidaan jakaa pienempiin ja yleiskäyttöisempiin osiin.
  • Koska sivuvaikutuksia ei ole, funktioiden suoritusjärjestys on vapaa.
  • Rinnakkaisuus ei aiheuta lainkaan vaikeuksia, koska jaettavaa tilaa ei ole. Periaattessa jokainen funktiokutsu voitaisiin suorittaa eri säikeessä.
  • Kääntäjä voi optimoida samanlaiset funktiokutsut yhdeksi.
  • Ohjelmoija oppii määrittelemään ohjelmia täsmällisesti, soveltamaan rekursiota ja käyttämään geneerisyyttä.
  • Ohjelmointikielen kielioppi on yksinkertaisempi suunnitella ja toteuttaa.

[muokkaa] Esimerkkejä

Esimerkeissä käytetään matematiikan tapaista pseudokoodia. Funktion parametreja ei kuitenkaan eroteta sulkeilla tai pilkuilla juuri missään funktionaalisessa kielessä, joten func(x) = 2x ilmaistaan seuraavasti:

func x = 2*x

[muokkaa] Fibonaccin luvut

Funktionaalisissa ohjelmointikielissä Hei maailma -ohjelman vastine on funktio, joka laskee Fibonaccin lukuja:

fib n = 0, kun n = 0
        1, kun n = 1
        fib (n−1) + fib (n−2), kun n > 1

Yllä olevasta käy heti ilmi, että fib ei ole määritelty, jos n < 0.

[muokkaa] Funktion määritteleminen toisten funktioiden avulla

Leikitään, että voidaan käyttää vain kahta funktiota:

plusyksi x = x + 1
miinusyksi x = x - 1

Niinpä funktio, joka lisää parametriinsa kaksi, voidaan määritellä edellisen avulla:

pluskaksi x = plusyksi (plusyksi x)

Funktio, joka lisää yhteen parametrit x ja y, onnistuu rekursion avulla:

plus x y = x, kun y = 0
           plus (plusyksi x) (miinusyksi y), kun y > 0

[muokkaa] Funktionaalinen ohjelmointi opetuksessa

Melko usein tietojenkäsittelytieteen perusteet opetetaan Scheme-kielellä, joka on Lispin yksinkertainen murre. Tällöin oppikirja on lähes poikkeuksetta Structure and Interpretation of Computer Programs, jota pidetään erinomaisena teoksena. Kirjan verkkoversio ja videoluennot ovat saatavilla verkosta.

[muokkaa] Lähteet


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -