Funkcionalno programiranje je hipster među programerskim paradigmama. Isprva prognano u istoriju i među akademske entuzijaste, funkcinalno programiranje doživljava renesansu. Zašto? Postoje brojne prednosti koje ćemo nabrojati dole, a možda i zato što su "čisti" funkcionalni jezici, poput Haskell-a teški za shvatanje, što im daje poseban šmek.
Striktno funkcionalni programski jezici se obično koriste kada su i performanse i integritet sistema kritični: na primer, kada program treba da uvek uradi tačno određenu stvar koju očekujete i treba da radi u okruženju gde je moguće zadatke raspodeliti na stotine ili hiljade umreženih računara. Clojure, na primer, pokreće Akamai, masivnu mrežu za deljenje sadržaja, čije usluge između ostalih koristi i Facebook. Twitter, je integrisao Scala-u za neke od najzahtevnijih komponenti, a AT&T koristi Haskell za mrežne bezbednosne sisteme.

Razlika u strukturi programa između imerativnih i funkcionalnih programskih jezika
Ovim jezicima je zajedničko to što imaju strmu krivu učenja za većinu front-end web developera. Međutim mnogi drugi, "razumljiviji" jezici u sebe uključuju mogućnosti funkcionalnog programiranja - najpre Python (u core bibliteci, a podržava i funkcije poput map i reduce, koje su karakteristične za funkcionalne jezike, zatim i biblioteke poput Fn.py), a rame uz rame sa njim i JavaScript (sa metodama sa rad sa kolekcijama i bibliotekama poput Underscore.js i Bacon.js).
Funkconalno programiranje je na početku obeshrabrujuće, ali zapamtite, ono nije samo za doktore nauka, stručnjake za obradu podataka i slično. Za većinu nas, realna korist prihvatanja funkcionalnog stila je da programi koje pišemo, mogu biti usitnjeni u manje, jednostavnije delove, koji su istovremeno pozdaniji i lakši za razumevanje. Ako ste front-end developer, zadužen za rad sa podacima, za njihovo formatiranje za vizualizacije bibliotekama poput D3 ili Raphael, onda funkcionalno programiranje treba da bude jedno od vaših najvažnijih oružja.
Preciznu definiciju funkcionalnog programiranja je teško dati. U većini knjiga, radova i sl. koje se bave ovom tematikom, naići ćete na pojmove poput "funkcije kao objekti prve klase" (functions as first-class objects), "eliminisanje bočnih efekata" (eliminating side effects). A ako vam ovo nije dovoljno, na apstraktnijem nivou, funkcionalno programiranje se objašnjava u pojmovima Lambda računa (neki tvrde da je suština funkcionalnog programiranja zapravo u matematici) - ali ne brinite. Za početnika (a i ostale koji nisu akademski istraživači), dovoljno je da shvatite dva pojma - nepromenljivost i nedostatak stanja.
Podaci u funkcionalnim jezicima su nepromenljivi. Ovo nekome, ko na primer radi u Javi, zvuči neverovatno i nemoguće. Kome treba program u kome se ništa ne menja? Međutim to u praksi funkcioniše: naprave se novi podaci umesto da se menjaju postojeći. Na primer, imate niz elemenata i treba da dodate novi element. Program će napraviti novi niz sa tim vašim elementom. Tu se javlja pitanje - to mora biti jako neefikasno. Međutim, ovo je samo u teoriji. Zapravo se ne pravi potpuno novi niz u memoriji već on koristi postojeće vrednosti iz prethodnog niza i dodaje novi element. Unutar programskog jezika, postoji mehanizam za pristupanje resursu koji zna koje elemente koji resur poseduje. Ovo je i logično (sa strane funkcionalnog programskog jezika - pošto je niz nepromenljiv, možemo koristiti njegove elemente). Pri tom, i dalje je moguće pristupiti starom resursu iz drugih niti, funkcija itd. Ukoliko nije potreban, stari resurs se uklanja iz memorije.

Oba niza postoje kao nezavisni entiteti
Drugi vrlo važan aspekt funkcionalnog programiranja je nedostatak stanja - stateless. Ovo praktično znači da treba da obavljaju svaki zadatak po prvi put, bez znanja šta se moglo desiti pri prethodnom toku izvršavanja programa. U kombinaciji sa nepromenljivošću, ovo pomaže da apstrahujemo funkcije kao izolovane jedinice, koje nisu "svesne" ničega u programu osim postojanja drugih funkcija sa kojima interaguju. Dakle, funkcije se oslanjaju samo na podatke koje prime kao parametar (koje im zapravo proslede druge funkcije) a ne na neke druge, "spoljne" varijable.
Pored ovih, funkcionalni jezici imaju niz karakteristika koje ih znatno razlikuju od imperativnih i objektno-orijentisanih jezika - "čiste" funcije (pure functions), nedostatak petlji (iterativni algoritmi se rešavaju rekurzijom, uključujući i tzv. tail rekurziju), posebno shvatanje stanja kroz permanentne objekte, lazy sequence, i mnogi drugi.
Upuštanje u funkcionalne jezike je za početnike frustrirajuće, ali vremenom, kada se usvoji specifičan stil programiranja, na površinu isplivaju lepote funkcionalnog programiranja - malo koda, elegantnost, čitljivost, i visoke performanse pri obradi podataka.
Koja je upotreba i prednost ovih jezika?
- Izvanredno se snalaze sa velikom količinom podataka koje treba brzo obraditi, pogotovo ako su u pitanju numerički podaci. Postoje posebni jezici za statističku obradu (npr: R) koji su u osnovi funkcionalni.
- Kod je sveden, lagan za održavanje.
- Izvanredno snalaženje u višenitnim aplikacijama. Ovi jezici nude strukture koje jako elegantno, brzo, i što je najvažnije, bezbedno izvršavaju više niti odjednom.
- Koriste pun potencijal multiprocesorskih okruženja. Proizvođači procesora su odustali od isključivog povećavanja takta procesora, i prešli na razvoj arhitektura koje podržavaju više procesora. Funkcionalni jezici bez problema koriste sve raspoložive resurse više procesora.
- Osim što se dobro snalaze u multiprocesorskom okruženju, izvanredno rade i u slučajevima da treba da funkcionišu u arhitekturi distribuiranih računara (više računara, mrežno povezanih).
Ono što je možda najbitnije sa pragmatične strane, funkcionalni jezici se vraćaju "iz mrtvih". Nakon nagle ekspanzije imperativnih, a zatim i objektno-orijntisanih jezika, funkcionalni jezici su pali u zaborav. Međutim, zbog svojih nesumnjivih prednosti koje smo naveli, sve više i više se koriste. C# polako u sebe uključuje neke koncepte funkcionalnih jezika. F# se od početka razvija tako da sadrži sve osobine funkcionalog jezika. Scala se lako koristi u mnogim programskim jezicima za izradu pojedinih funkcionalnosti. A Java 8, poslednja verzija popularnog OO jezika, koji se intenzivno uči na FON-u u sebi sadrži elemente funkcionalnog jezika koji će drastično izmeniti napredno programiranje u njoj. Takođe, popularni Clojure, radi na Java virtuelnoj mašini, i lako se koristi unutar Jave, i obrnuto. Danas se u mnogim oglasima za posao, za jezike poput Jave ili C#, kao dodatna prednost traži poznavanje funkconalnog programiranja.
Izvor: smashingmagazine.com. U ovom članku možete videti postupno objašnjen primer upotrebe funkcionalne paradigme za rešavanje konkretnog problema u JavaScript-u.

Postavi komentar