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

Վիքիպեդիայից՝ ազատ հանրագիտարանից

Ֆունկցիոնալ ծրագրավորում, դիսկրետ մաթեմատիկայի բաժին է և ծրագրավորման մի մոդել, որում հաշվարկման պրոցեսը մեկնաբանվում է որպես ֆունկցիայի արժեքների հաշվարկում՝ վերջինիս մաթեմատիկական հասկացությամբ (ի տարբերություն ֆունկցիայի պրոցեդուրային ծրագրավորման մեջ, որտեղ այն  դիտվում է որպես ենթածրագիր):

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

Ֆունկցիոնալ ծրագրավորումը ենթադրում է մուտքային տվյալներից և այլ ֆունկցիաների արդյունքներից կախված ֆունկցիայի արդյունքների հաշվարկ և չի ենթադրում ծրագրի վիճակի պահպանում: Հետևաբար՝ այն չի ենթադրում նաև այդ վիճակի փոփոխելիություն:

Պրակտիկայում իմպերատիվ ծրագրավորման մեջ մաթեմատիկական ֆունկցիայի տարբերությունը ՛՛ֆունկցիա՛՛ հասկացությունից կայանում է նրանում, որ իմպերատիվ ֆունկցիաները կարող են կախված լինել ոչ միայն արգումենտից, այլ նաև ֆունկցիայի նկատմամբ արտաքին համարվող փոփոխականներից, ինչպես նաև ունենալ կողմնակի էֆեկտ և փոխել արտաքին փոփոխականների վիճակը:

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

Իսկ ֆունկցիոնալ լեզվի մեջ միևնույն պարամետրերով ֆունկցիայի կանչման ժամանակ միշտ կստանանք նույն արդյունքը՝ ելքային տվյալները կախված են միայն մուտքային տվյալներից:

Սա թույլ է տալիս ֆունկցիոնալ լեզուների ծրագրի կատարման միջավայրին քեշավորել ֆունկցիայի արդյունքները և կանչել նրանց հերթականությամբ, ինչը չի որոշվում ալգորիթմով, և զուգահեռացնել նրանց՝ առանց ծրագրավորողի կողմից լրացուցիչ միջամտության:

Ֆունկցիոնալ ծրագրավորման համար որպես հիմք հանդիսանում է լյամբդա-հաշիվը:

Ֆունկցիոնալ ծրագրավորման լեզուներ[խմբագրել | խմբագրել կոդը]

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

  • 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-ը:

Առանձնահատկություններ[խմբագրել | խմբագրել կոդը]

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