ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ്

കമ്പ്യൂട്ടർ ശാസ്ത്രത്തിൽ, ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് (functional programming) എന്നത് ഒരു പ്രോഗ്രാമിങ് മാതൃകയാണ് - ഫംഗ്‌ഷനുകൾ പ്രയോഗിച്ചും കംമ്പോസ് ചെയ്തുമാണ് പ്രോഗ്രാമുകൾ നിർമ്മിക്കുന്നത്. ഇത് ഒരു ഡിക്ലറേറ്റീവ് പ്രോഗ്രാമിംഗ് മാതൃകയാണ്, അതിൽ ഫംഗ്‌ഷൻ നിർവചനങ്ങൾ പ്രോഗ്രാമിന്റെ പ്രവർത്തന നില അപ്‌ഡേറ്റ് ചെയ്യുന്ന ഇമ്പറേറ്റീവ് സ്റ്റേറ്റ്മെന്റുകളുടെ ഒരു ശ്രേണിയെക്കാൾ മൂല്യങ്ങളെ മറ്റ് മൂല്യങ്ങളിലേക്ക് മാപ്പ് ചെയ്യുന്ന എക്സ്പ്രഷൻസ് ട്രീകളാണ്.  

ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിൽ, ഫംഗ്‌ഷനുകൾ ഫസ്റ്റ്-ക്ലാസ് സിറ്റിസൺസായി കണക്കാക്കപ്പെടുന്നു, അതായത്, മറ്റേതൊരു ഡാറ്റാ ടൈപ്പിനും കഴിയുന്നതുപോലെ, അവയ്ക്ക് പേരുകൾ (ലോക്കൽ ഐഡന്റിഫയറുകൾ ഉൾപ്പെടെ), ആർഗ്യുമെന്റുകളായി പാസ് ചെയ്യാനും മാത്രമല്ല മറ്റ് ഫംഗ്ഷനുകളിൽ നിന്ന് റിട്ടേൺ ചെയ്യാനും കഴിയും. ചെറിയ ഫംഗ്ഷനുകൾ മോഡുലാർ രീതിയിൽ സംയോജിപ്പിച്ച്, ഡിക്ലറേറ്റീവ്, കമ്പോസബിൾ ശൈലിയിൽ പ്രോഗ്രാമുകൾ എഴുതാൻ ഇത് അനുവദിക്കുന്നു.

ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ചിലപ്പോൾ പൂർണ്ണമായും ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിന്റെ പര്യായമായി കണക്കാക്കപ്പെടുന്നു, ഇത് ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിന്റെ ഒരു ഉപവിഭാഗമാണ്, അത് എല്ലാ പ്രവർത്തനങ്ങളെയും ഡിറ്റർമിനിസ്റ്റിക് മാത്തമാറ്റിക്കൽ ഫംഗ്ഷനുകളായി അല്ലെങ്കിൽ പ്യൂവർ ഫംഗ്ഷനുകളായി കണക്കാക്കുന്നു. നൽകിയിരിക്കുന്ന ചില ആർഗ്യുമെന്റുകൾ ഉപയോഗിച്ച് ഒരു പ്യുവർ ഫംഗ്‌ഷൻ വിളിക്കുമ്പോൾ, അത് എല്ലായ്‌പ്പോഴും അതേ റിസൾട്ട് തന്നെ നൽകും, വാല്യൂ മാറ്റാവുന്ന അവസ്ഥയോ മറ്റ് പാർശ്വഫലങ്ങളോ ഇതിനെ ബാധിക്കില്ല. ഇംമ്പറേറ്റീവ് പ്രോഗ്രാമിംഗിൽ പൊതുവായുള്ള ഇംപ്യൂവർ പ്രൊസീജറിൽ നിന്ന് വ്യത്യസ്തമാണ്, അത് പാർശ്വഫലങ്ങൾ ഉണ്ടാക്കാം (പ്രോഗ്രാമിന്റെ സ്റ്റേറ്റ് പരിഷ്ക്കരിക്കുക അല്ലെങ്കിൽ ഒരു ഉപയോക്താവിൽ നിന്ന് ഇൻപുട്ട് എടുക്കുക മുതലയാവ). പ്യൂവറിലി ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിന്റെ വക്താക്കൾ അവകാശപ്പെടുന്നത്, പാർശ്വഫലങ്ങൾ(side effects) പരിമിതപ്പെടുത്തുന്നതിലൂടെ, പ്രോഗ്രാമുകൾക്ക് കുറച്ച് ബഗുകൾ മാത്രമേ ഉണ്ടാകൂ, ഡീബഗ് ചെയ്യാനും പരിശോധിക്കാനും എളുപ്പമായിരിക്കും, ഫോർമൽ വേരിഫിക്കേഷന് കൂടുതൽ അനുയോജ്യമാകും.

ഫംഗ്‌ഷണൽ പ്രോഗ്രാമിംഗിന്റെ റൂട്ട് അക്കഡീമിയിൽ (academia) ഉണ്ട്, ഇത് ഫംഗ്‌ഷനുകളെ മാത്രം അടിസ്ഥാനമാക്കിയുള്ള ഒഫീഷ്യൽ കമ്പ്യൂട്ടേഷൻ സംവിധാനമായ ലാംഡ കാൽക്കുലസിൽ നിന്ന് വികസിച്ചതാണ്. ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ചരിത്രപരമായി ഇംപറേറ്റീവ് പ്രോഗ്രാമിംഗിനെ അപേക്ഷിച്ച് ജനപ്രീതി ആർജ്ജിച്ച ഒന്നല്ല, എന്നാൽ പല ഫംഗ്ഷണൽ ഭാഷകളും ഇന്ന് വ്യവസായപരമായും, വിദ്യാഭ്യാസപരമായും ഉപയോഗിക്കുന്നു. എന്നിരുന്നാലും, പ്രധാന പ്രോഗ്രാമിംഗ് ഭാഷകളായ കോമൺ ലിസ്പ്, സ്കീംപോലുള്ള ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിനെ ഇത് പിന്തുണയ്ക്കുന്നു, ക്ലോജർ, വൂൾഫ്രം ലാങ്വേജ്,  (മാത്തമാറ്റിക്ക എന്നും അറിയപ്പെടുന്നു), റാക്കറ്റ്, എർലാങ്, ഒകാമൽ (OCAML), ഹാസ്കൽ, എഫ്# ഈ ഭാഷകൾ എല്ലാം വൈവിധ്യമാർന്ന നിരവധി സംഘടനകൾ വ്യാവസായിക ആവശ്യങ്ങളക്കായി ഉപയോഗിക്കുന്നു. ആർ(R) (സ്ഥിതിവിവരക്കണക്കുകൾ) പോലുള്ള, വെബിലുപയോഗിക്കുന്ന ജാവാസ്ക്രിപ്റ്റ് (JavaScript) പോലെയുള്ള നിർദ്ദിഷ്‌ട ഡൊമെയ്‌നുകളിൽ വിജയം കണ്ടെത്തിയ ചില ഭാഷകൾക്കും ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് പ്രധാനമാണ്, ജെ, കെ, എക്സ്ക്വറി / എക്സ്എൽടി(XQuery / XSLT) (എക്സ്എംഎൽ), ഓപാൽ മുതലയാവ. എസ്ക്യൂഎൽ, ലെക്സ്/യാക്(SQL, Lex / Yacc) പോലുള്ള വ്യാപകമായ ഡൊമെയ്ൻ-സ്പെസിഫിക് സ്റ്റേറ്റ്മെന്റ് ഭാഷകൾ ഫങ്ഷണൽ പ്രോഗ്രാമിങ്ങിന്റെ ചില ഘടകങ്ങൾ ഉപയോഗിക്കുന്നു, പ്രത്യേകിച്ച് മ്യൂട്ടബിൾ മൂല്യങ്ങൾ ഒഴിവാക്കുന്നതിൽ. കൂടാതെ, മറ്റ് പല പ്രോഗ്രാമിംഗ് ഭാഷകളും ഒരു ഫങ്ഷണൽ ശൈലിയിലുള്ള പ്രോഗ്രാമിംഗിനെ പിന്തുണയ്ക്കുന്നു അല്ലെങ്കിൽ ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിൽ നിന്നുള്ള ഫീച്ചറുകൾ നടപ്പിലാക്കിയിട്ടുണ്ട്. സി++11,സി#, കോട്ലിൻ,പേൾ,പിഎച്ച്പി,പൈത്തൺ,ഗോ,റസ്റ്റ്, റാക്കു ,സ്കാല, ജാവ (ജാവ 8 മുതൽ). 
ചരിത്രം
1930-കളിൽ അലോൺസോ ചർച്ച് വികസിപ്പിച്ചെടുത്ത ലാംഡ കാൽക്കുലസ്, ഫംഗ്ഷൻ ആപ്ലിക്കേഷനിൽ നിന്ന് നിർമ്മിച്ച ഒരു ഔപചാരികമായ കണക്കുകൂട്ടൽ സംവിധാനമാണ്. 1937-ൽ അലൻ ട്യൂറിംഗ്, ലാംഡ കാൽക്കുലസ്, ട്യൂറിംഗ് മെഷീനുകൾ എന്നിവ കമ്പ്യൂട്ടേഷന്റെ തുല്യ മാതൃകകളാണെന്ന് തെളിയിച്ചു,[ലാംഡ കാൽക്കുലസ് ട്യൂറിംഗ് കംപ്ലീറ്റാണെന്ന് കാണിക്കുന്നു. എല്ലാ ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗ് ഭാഷകളുടെയും അടിസ്ഥാനം ലാംഡ കാൽക്കുലസ് ആണ്. 1920 കളിലും 1930 കളിലും മോസസ് ഷോൺഫിങ്കലും ഹാസ്‌കെൽ കറിയും ചേർന്ന് തീയറ്റിക്കൽ ഫോർമുലേഷൻ, കോമ്പിനേറ്ററി ലോജിക് എന്നിവ വികസിപ്പിച്ചെടുത്തു.

ചർച്ച് പിന്നീട് ഒരു വീക്കർ സിസ്റ്റം വികസിപ്പിച്ചെടുത്തു, സിമ്പ്ലി ടൈപ്പ്ഡ് ലാംഡ കാൽക്കുലസ്, എല്ലാ പദങ്ങൾക്കും വേണ്ടി ഒരു ടൈപ്പ് നൽകി ലാംഡ കാൽക്കുലസ് വിപുലീകരിച്ചു.ഇത് സ്റ്റാറ്റിക്കലി-ടൈപ്പ്ഡ് ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗിന്റെ അടിസ്ഥാനമാണ്.

ആദ്യത്തെ ഹൈ-ലെവൽ ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ഭാഷയാണ്, ലിസ്പ് 1950 കളുടെ അവസാനത്തിൽ ഐ.ബി.എം. 700/7000 സീരീസ് ശാസ്ത്ര കമ്പ്യൂട്ടറുകൾക്കു വേണ്ടി ജോൺ മക്കാർത്തി, മസാച്ചുസെറ്റ്സ് ഇൻസ്റ്റിറ്റ്യൂട്ട് ഓഫ് ടെക്നോളജി (എം.ഐ.ടി) വികസിപ്പിച്ചെടുത്തു.ലിസ്പ് ഫംഗ്‌ഷനുകൾ നിർവചിച്ചത് ചർച്ചിന്റെ ലാംഡ നൊട്ടേഷൻ ഉപയോഗിച്ചാണ്, റിക്രർസ്സീവ് ഫങ്ഷനുകൾ അനുവദിക്കുന്നതിനായി ഒരു ലേബൽ നിർമ്മിതി ഉപയോഗിച്ച് വിപുലീകരിച്ചു. ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിന്റെ പല മാതൃകാപരമായ സവിശേഷതകളും ലിസ്‌പ് ആദ്യമായി അവതരിപ്പിച്ചു, ആദ്യകാല ലിസ്‌പ്‌സ് മൾട്ടി-പാരഡൈം ഭാഷകളായിരുന്നുവെങ്കിലും പുതിയ മാതൃകകൾ വികസിപ്പിച്ചപ്പോൾ, നിരവധി പ്രോഗ്രാമിംഗ് ശൈലികൾക്കുള്ള പിന്തുണ കൂടി ഉൾപ്പെടുത്തി. പിന്നീട് വന്ന പ്രോഗ്രാമിംഗ് ഭാഷകൾ, സ്കീം, ക്ലോജർ, ഡിലൻ, ജൂലിയാ എന്നിവ ലിസ്‌പ് എളുപ്പത്തിൽ പ്രവർത്തിക്കുന്ന രീതിയിൽ പുനർരൂപകൽപന ചെയ്തു. ഇവ ശുദ്ധമായ ഫംഗ്ഷണൽ രീതികൾ പിന്തുടർന്നു, എന്നാൽ കോമൺ ലിസ്‌പ് പഴയ ലിസ്‌പ് ഭാഷകളിൽ നിന്നുള്ള മികച്ച സവിശേഷതകളെ സംരക്ഷിക്കുകയും പുതുക്കുകയും ചെയ്തു. അതായത്, കോമൺ ലിസ്‌പ് പഴയ ഭാഷകൾക്ക് മാറ്റങ്ങൾ വരുത്തി, പഴയ കോഡുകൾക്ക് പ്രശ്നം വരുത്താതെ പുതിയ ഫീച്ചറുകൾ ചേർത്തു.

ഇൻഫർമേഷൻ പ്രോസസ്സിംഗ് ലംഗ്വേജ് (IPL) 1956-ൽ വികസിപ്പിക്കപ്പെട്ടു, ഇത് ആദ്യമായുള്ള കമ്പ്യൂട്ടർ അധിഷ്ഠിത ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗ് ഭാഷയായി പരിഗണിക്കപ്പെടുന്നു. ഐപിഎല്ലാണ് ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗ് ആശയങ്ങൾ ആദ്യമായി പരിചയപ്പെടുത്തിയത്, കൂടാതെ അത് ഗണിതപരമായ ആശയങ്ങൾ എളുപ്പത്തിൽ കൈകാര്യം ചെയ്യാൻ സഹായിച്ചു. ഇത് പിന്നീട് മറ്റു ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗ് ഭാഷകളുടെ വികസനത്തിന് പ്രേരണയായിരുന്നതിനാൽ ഇതിന്റെ പ്രാധാന്യം വലുതാണ്The memoir of Herbert A. Simon (1991), Models of My Life pp.189-190  claims that he, Al Newell, and Cliff Shaw are "...commonly adjudged to be the parents of [the] artificial intelligence [field]," for writing Logic Theorist, a program that proved theorems from Principia Mathematica automatically. To accomplish this, they had to invent a language and a paradigm that, viewed retrospectively, embeds functional programming.. ഐപിഎൽ ഒരു പ്രോഗ്രാമിംഗ് ഭാഷയാണ്, സിംബലുകളുടെ ലിസ്റ്റുകൾ കൈകാര്യം ചെയ്യാനായുള്ളതാണ്. ഇതിൽ, ഒരു ഫംഗ്ഷൻ മറ്റൊരു ഫംഗ്ഷനെ സ്വീകരിക്കുന്ന "ജനറേറ്റർ" എന്ന ആശയം ഉണ്ട്. ഐപിഎല്ലിൽ ഒരു കോഡ് എങ്ങനെ ഡാറ്റയാക്കി ഉപയോഗിക്കാമെന്ന് കാണാം, അതിനാൽ ഫംഗ്ഷനുകൾക്ക് മറ്റൊരു ഫംഗ്ഷനെ നൽകാൻ കഴിയും. ഐപിഎൽ ലിസ്റ്റുകൾ (ഉദാഹരണത്തിന്, വിവരങ്ങൾ ചേർക്കൽ അല്ലെങ്കിൽ മാറ്റൽ) കൈകാര്യം ചെയ്യാൻ മാത്രം ഉപയോഗിക്കുന്ന ഒരു ഭാഷയാണ്. ഇത് കോഡിനെയും ഡാറ്റയെയും മാറ്റി ഉപയോഗിക്കുന്നു, അതിനാൽ ഇത് ഒരു സാധാരണ പ്രോഗ്രാമിംഗ് ഭാഷയിലെ പോലെ കാര്യങ്ങൾ നിർദ്ദേശിച്ച് ചെയ്യുന്നു.

അവലംബം
വർഗ്ഗം:പ്രോഗ്രാമിങ് ശൈലികൾ