Не плашите се функционалног програмирања

// Категорије: ИТ | Магазин |

Функционално програмирање је хипстер међу програмерским парадигмама. Испрва прогнано у историју и међу академске ентузијасте, функцинално програмирање доживљава ренесансу. Зашто? Постоје бројне предности које ћемо набројати доле, а можда и зато што су "чисти" функционални језици, попут Haskell-а тешки за схватање, што им даје посебан шмек.

Стриктно функционални програмски језици се обично користе када су и перформансе и интегритет система критични: на пример, када програм треба да увек уради тачно одређену ствар коју очекујете и треба да ради у окружењу где је могуће задатке расподелити на стотине или хиљаде умрежених рачунара. Clojure, на пример, покреће Akamai, масивну мрежу за дељење садржаја, чије услуге између осталих користи и Facebook. Twitter, је интегрисао Scala-у за неке од најзахтевнијих компоненти, а AT&T користи Haskell за мрежне безбедносне системе.

Разлика у структури програма између имеративних и функционалних програмских језика

Овим језицима је заједничко то што имају стрму криву учења за већину фронт-енд веб девелопера. Међутим многи други, "разумљивији" језици у себе укључују могућности функционалног програмирања - најпре Python (у core библитеци, а подржава и функције попут map и reduce, које су карактеристичне за функционалне језике, затим и библиотеке попут Fn.py), а раме уз раме са њим и JavaScript (са методама са рад са колекцијама и библиотекама попут Underscore.js и Bacon.js).

Функцонално програмирање је на почетку обесхрабрујуће, али запамтите, оно није само за докторе наука, стручњаке за обраду података и слично. За већину нас, реална корист прихватања функционалног стила је да програми које пишемо, могу бити уситњени у мање, једноставније делове, који су истовремено позданији и лакши за разумевање. Ако сте фронт-енд девелопер, задужен за рад са подацима, за њихово форматирање за визуализације библиотекама попут D3 или Raphael, онда функционално програмирање треба да буде једно од ваших најважнијих оружја.

Прецизну дефиницију функционалног програмирања је тешко дати. У већини књига, радова и сл. које се баве овом тематиком, наићи ћете на појмове попут "функције као објекти прве класе" (functions as first-class objects), "елиминисање бочних ефеката" (eliminating side effects). А ако вам ово није довољно, на апстрактнијем нивоу, функционално програмирање се објашњава у појмовима Ламбда рачуна (неки тврде да је суштина функционалног програмирања заправо у математици) - али не брините. За почетника (а и остале који нису академски истраживачи), довољно је да схватите два појма - непроменљивост и недостатак стања.

Подаци у функционалним језицима су непроменљиви. Ово некоме, ко на пример ради у Јави, звучи невероватно и немогуће. Коме треба програм у коме се ништа не мења? Међутим то у пракси функционише: направе се нови подаци уместо да се мењају постојећи. На пример, имате низ елемената и треба да додате нови елемент. Програм ће направити нови низ са тим вашим елементом. Ту се јавља питање - то мора бити јако неефикасно. Међутим, ово је само у теорији. Заправо се не прави потпуно нови низ у меморији већ он користи постојеће вредности из претходног низа и додаје нови елемент. Унутар програмског језика, постоји механизам за приступање ресурсу који зна које елементе који ресур поседује. Ово је и логично (са стране функционалног програмског језика - пошто је низ непроменљив, можемо користити његове елементе). При том, и даље је могуће приступити старом ресурсу из других нити, функција итд. Уколико није потребан, стари ресурс се уклања из меморије.

Оба низа постоје као независни ентитети

Други врло важан аспект функционалног програмирања је недостатак стања - stateless. Ово практично значи да треба да обављају сваки задатак по први пут, без знања шта се могло десити при претходном току извршавања програма. У комбинацији са непроменљивошћу, ово помаже да апстрахујемо функције као изоловане јединице, које нису "свесне" ничега у програму осим постојања других функција са којима интерагују. Дакле, функције се ослањају само на податке које приме као параметар (које им заправо проследе друге функције) а не на неке друге, "спољне" варијабле.

Поред ових, функционални језици имају низ карактеристика које их знатно разликују од императивних и објектно-оријентисаних језика - "чисте" фунције (pure functions), недостатак петљи (итеративни алгоритми се решавају рекурзијом, укључујући и тзв. tail рекурзију), посебно схватање стања кроз перманентне објекте, lazy sequence, и многи други.

Упуштање у функционалне језике је за почетнике фрустрирајуће, али временом, када се усвоји специфичан стил програмирања, на површину испливају лепоте функционалног програмирања - мало кода, елегантност, читљивост, и високе перформансе при обради података.

Која је употреба и предност ових језика?

  • Изванредно се сналазе са великом количином података које треба брзо обрадити, поготово ако су у питању нумерички подаци. Постоје посебни језици за статистичку обраду (нпр: R) који су у основи функционални.
  • Код је сведен, лаган за одржавање.
  • Изванредно сналажење у вишенитним апликацијама. Ови језици нуде структуре које јако елегантно, брзо, и што је најважније, безбедно извршавају више нити одједном.
  • Користе пун потенцијал мултипроцесорских окружења. Произвођачи процесора су одустали од искључивог повећавања такта процесора, и прешли на развој архитектура које подржавају више процесора. Функционални језици без проблема користе све расположиве ресурсе више процесора.
  • Осим што се добро сналазе у мултипроцесорском окружењу, изванредно раде и у случајевима да треба да функционишу у архитектури дистрибуираних рачунара (више рачунара, мрежно повезаних).

Оно што је можда најбитније са прагматичне стране, функционални језици се враћају "из мртвих". Након нагле експанзије императивних, а затим и објектно-оријнтисаних језика, функционални језици су пали у заборав. Међутим, због својих несумњивих предности које смо навели, све више и више се користе. C# полако у себе укључује неке концепте функционалних језика. F# се од почетка развија тако да садржи све особине функционалог језика. Scala се лако користи у многим програмским језицима за израду појединих функционалности. А Јава 8, последња верзија популарног ОО језика, који се интензивно учи на ФОН-у у себи садржи елементе функционалног језика који ће драстично изменити напредно програмирање у њој. Такође, популарни Clojure, ради на Јава виртуелној машини, и лако се користи унутар Јаве, и обрнуто. Данас се у многим огласима за посаo, за језике попут Јаве или C#, као додатна предност тражи познавање функцоналног програмирања.

Извор: smashingmagazine.com. У овом чланку можете видети поступно објашњен пример употребе функционалне парадигме за решавање конкретног проблема у JavaScript-у.

Тренутно нема коментара. Будите први који ће поставити коментар!
7
0

Постави коментар

E-mail:
Коментар:
Антиспам:

1 + 9

Коментари пролазе модерацију, зато што смо тако у могућности