Ֆունկցիոնալ ծրագրավորում

Ֆունկցիոնալ ծրագրավորում, դիսկրետ մաթեմատիկայի բաժին է և ծրագրավորման մի մոդել, որում հաշվարկման պրոցեսը մեկնաբանվում է որպես ֆունկցիայի արժեքների հաշվարկում՝ վերջինիս մաթեմատիկական հասկացությամբ (ի տարբերություն ֆունկցիայի պրոցեդուրային ծրագրավորման մեջ, որտեղ այն  դիտվում է որպես ենթածրագիր):
Ֆունկցիոնալ ծրագրավորումը հակադրվում է իմպերատիվ ծրագրավորման մոդելին, որը հաշվարկման պրոցեսը նկարագրում է որպես վիճակների հաջորդական փոփոխություն: Անհրաժեշտության դեպքում ֆունկցիոնալ ծրագրավորման մեջ հաշվարկվող պրոցեսի հաջորդական վիճակների ամբողջ համախումբը ներկայացվում է պարզ ձևով, օրինակ՝ որպես ցուցակ:
Ֆունկցիոնալ ծրագրավորումը ենթադրում է մուտքային տվյալներից և այլ ֆունկցիաների արդյունքներից կախված ֆունկցիայի արդյունքների հաշվարկ և չի ենթադրում ծրագրի վիճակի պահպանում: Հետևաբար՝ այն չի ենթադրում նաև այդ վիճակի փոփոխելիություն:
Պրակտիկայում իմպերատիվ ծրագրավորման մեջ մաթեմատիկական ֆունկցիայի տարբերությունը ՛՛ֆունկցիա՛՛ հասկացությունից այն է, որ իմպերատիվ ֆունկցիաները կարող են կախված լինել ոչ միայն արգումենտից, այլ նաև ֆունկցիայի նկատմամբ արտաքին համարվող փոփոխականներից, ինչպես նաև ունենալ կողմնակի էֆեկտ և փոխել արտաքին փոփոխականների վիճակը:
Այսպիսով՝ իմպերատիվ ծրագրավորման մեջ միևնույն պարամետրերով, բայց ալգորիթմի տարբեր էտապներում աշխատելիս միևնույն ֆունկցիան կանչելու ժամանակ կարելի է ելքում ստանալ տարբեր տվյալներ՝ փոփոխականների վիճակի ֆունկցիայի վրա ազդեցության պատճառով:
Իսկ ֆունկցիոնալ լեզվի մեջ միևնույն պարամետրերով ֆունկցիայի կանչման ժամանակ միշտ կստանանք նույն արդյունքը՝ ելքային տվյալները կախված են միայն մուտքային տվյալներից:
Սա թույլ է տալիս ֆունկցիոնալ լեզուների ծրագրի կատարման միջավայրին քեշավորել ֆունկցիայի արդյունքները և կանչել նրանց հերթականությամբ, ինչը չի որոշվում ալգորիթմով, և զուգահեռացնել նրանց՝ առանց ծրագրավորողի կողմից լրացուցիչ միջամտության:
Ֆունկցիոնալ ծրագրավորման համար որպես հիմք հանդիսանում է լյամբդա-հաշիվը:


== Ֆունկցիոնալ ծրագրավորման լեզուներ ==
Ֆունկցիոնալ ծրագրավորման առավել հայտնի լեզուներից են հանդիսանում.

Lisp-ը և նրա բազմաթիվ դիալեկտները, որոնցից առավել ժամանակակիցներն են Scheme, Clojure, Common Lisp լեզուները,
Erlang - պրոցեսների աջակցությամբ ֆունկցիոնալ լեզու
APL – MATLAB ժամանակակից գիտական հաշվողական միջավայրերի նախորդ
ML – այժմ օգտագործվող դիալեկտներից հայտնի են Standard ML և Objective CAML)
F# - ML ընտանիքի ֆունկցիոնալ լեզու .NET պլատֆորմի համար
Scala
Miranda
Nemerle – հիբրիդ ֆունկցիոնալ/իմպերատիվ լեզու
XSLT և XQuery
Haskell – զուտ ֆունկցիոնալ լեզու:Որպես կանոն, ֆունկցիոնալ ծրագրավորման լեզուների նկատմամբ հետաքրքրությունը, հատկապես զուտ ֆունկցիոնալ լեզուների, եղել է ավելի շատ գիտական, քան կոմերցիոն: Սակայն այնպիսի լեզուներ, ինչպիսիք են Erlang, OCaml, Haskell, Scheme լեզուները, ինչպես նաև հատուկ R (վիճակագրություն), Wolfram, J և K (ֆինանսական վերլուծություն), և XSLT (XML) լեզուները, գտել են իրենց կիրառությունը կոմերցիոն ծրագրավորման ոլորտում:


== Պատմություն ==
Լյամբդա-հաշիվը դարձել է ֆունկցիաների նկարագրության և հաշվարկի համար տեսական հիմք: Լինելով մաթեմատիկական աբստրակցիա, այլ ոչ թե ծրագրավորման լեզու, այն այսօր բոլոր ֆունկցիոնալ ծրագրավորման լեզուների հիմքն է: Նրա նմանատիպ կոմբինատոր տրամաբանություն տեսական հասկացությունը, համարվում է ավելի աբստրակտ, քան λ-հաշիվը: Եվ λ-հաշիվը, և կոմբինատոր տրամաբանությունը մշակվել են մաթեմատիկայի սկզբունքների ավելի պարզ ու ճշգրիտ նկարագրության համար:
Առաջին ֆունկցիոնալ լեզուն Lisp-ն է, որը ստեղծվել է Ջոն Մակկարտի կողմից 1958թ. և իրականացվել է IBM 700/7000-ի համար: Lisp-ում առաջին անգամ ներդրվել են ֆունկցիոնալ լեզվի բազմաթիվ հասկացություններ: Հետագայում Lisp-ի զարգացումներն են դարձել այնպիսի լեզուներ, ինչպիսիք են Scheme-ը և Dylan-ը:


== Առանձնահատկություններ ==
Ֆունկցիոնալ ծրագրավորման առանձնահատկությունների հիմքը, որպես առավելություն, ինչպես նաև որպես տվյալ մոդելի թերություն, հանդիսանում է այն, որ նրանում իրականացվում է հաշվարկների մոդել առանց վիճակների: Եթե իմպերատիվ ծրագիրը իրականացման ցանկացած էտապում ունի վիճակ, այսինքն՝ կա  բոլոր փոփոխականների արժեքների համախումբ, և բերում է կողմնակի էֆեկտի, ապա զուտ ֆունկցիոնալ ծրագիրը ոչ ամբողջությամբ, ոչ իր առանձին մասերով չունի վիճակ և չի բերում կողմնակի էֆեկտի: Այն, որ իմպերատիվ լեզուներում արվում է փոփոխականների արժեքների վերագրմամբ, ֆունկցիոնալ լեզուներում արվում է ֆունկցիայի պարամետրերին արտահայտություններ տալով: