Funkcionální programování: Porovnání verzí

Smazaný obsah Přidaný obsah
Narovnání přesměrování Ruby (programovací jazyk)
JAnDbot (diskuse | příspěvky)
m {{Commonscat}}; kosmetické úpravy
Řádek 10:
 
== Použití ==
 
Funkcionální [[programovací jazyk]]y, především [[čistě funkcionální]], se používají spíše v akademickém než komerčním prostředí. Přesto široké spektrum organizací využívá některé funkcionální programovací jazyky jako např. [[Erlang (programovací jazyk)|Erlang]], [[R (programovací jazyk)|R]] ([[statistika]]), [[Mathematica]] (symbolická matematika), [[Haskell (programovací jazyk)|Haskell]], ML, J a K ([[finanční analýza]]) a doménově specifické programovací jazyky jako XQuery/[[XSLT]] ([[Extensible Markup Language|XML]]). Dále jsou funkcionální programovací jazyky důležité pro některá odvětví informatiky, například zabývající se umělou inteligencí, formální specifikací, modelováním nebo rychlým prototypováním.
 
== Historie ==
 
Prvopočátky funkcionálních jazyků najdeme již ve 30. letech 20. století. Tehdy profesor matematiky a filosofie na Princeton University [[Alonzo Church]] (1903-1995) vytvořil netypovaný [[lambda kalkul]] jako matematickou teorii funkcí. K nejznámějším Churchovým vědeckým přínosům patří také tzv. Church-Turingova teze o tom, že algoritmus je ekvivalentní pojmu funkce a Churchův teorém z roku 1936 o tom, že aritmetika je [[Rozhodnutelnost|nerozhodnutelná]].
 
Řádek 32 ⟶ 30:
 
== Koncepty ==
 
Spousta konceptů a paradigmat je vlastní funkcionálnímu programování a cizí imperativnímu programování (včetně [[objektově orientované programování|objektově orientovaného programování]]). Nicméně programovací jazyky jsou často hybridy několika programovacích paradigmat, takže programátoři používající hlavně imperativní mohou též používat některý z konceptů funkcionálního programování.
 
=== Funkce vyššího řádu ===
 
Funkce jsou higher-order, česky ''funkce vyššího řádu'', v případě, kdy můžou převzít nějakou funkci jako argument nebo navrátit funkci jako výsledek. (Derivace a neurčitý integrál jsou toho příkladem v matematice). Higher-order funkce jsou důsledek toho, že funkce jsou entity první kategorie (First class) tím, že funkci lze použít jako argument a vracet jako výsledek jiné funkce (a cokoli jiného). Rozdíl mezi těmito pojmy je tento: higher-order popisuje matematický koncept funkce aplikovanou na jinou funkci, přičemž First class je počítačově-vědní termín, který popisuje programové jazykové entity, které nemají žádné omezení ve svém použití (tudíž first class funkce se může objevit kdekoliv v programu, stejně jako jiné first class entity, jako například čísla, včetně použití jako argument funkce, návratová hodnota funkce nebo součást datové struktury). Higher-order funkce přirozeně vznikají při použití [[currying]] (např. v [[Haskell (programovací jazyk)|Haskellu]]), což je technika, při které je funkci předán pouze první argument a funkce navrátí další higher-order funkci, která přijme další argument.
 
=== Čistě funkcionální ===
 
[[Čistě funkcionální]] programy nemají žádné vedlejší efekty. To činí jejich chování jednodušším na pochopení a naprogramování. Například výsledek použití čisté funkce na čistý argument nezávisí na pořadí vyhodnocení. V důsledku jazyk, který nemá žádné nečisté funkce (čistě funkcionální jako například [[Haskell (programovací jazyk)|Haskell]]), může použít [[evaluace (programování)|evaluaci]] call-by-need. Nicméně ne všechny funkcionální jazyky jsou čisté. Jazyky z rodiny Lispu nejsou čisté, protože způsobují vedlejší efekty.
 
Řádek 67 ⟶ 62:
 
=== Rekurze ===
 
Opakování je ve funkcionálních jazycích obvykle provedeno pomocí [[rekurze]]. [[Rekurzivní funkce]] vyvolávají samy sebe, čímž dovolují opakování programu. [[Koncová rekurze]] (tail recursion) může být rozpoznána a optimalizována kompilátorem do stejného kódu, který se používá na implementaci opakování, čti ''cyklu'', u imperativních jazyků. Programovací jazyk Scheme standardně vyžaduje další implementaci{{kdo?}} k rozpoznávání těchto funkcí.
 
Řádek 97 ⟶ 91:
 
=== Funkcionální programování v nefunkcionálních jazycích ===
 
Je možné používat funkcionální styl programování i v jazycích, které nejsou považovány za funkcionální. Některé nefunkcionální jazyky si od funkcionálních jazyků půjčily některé rysy jako higher-order funkce a zpracování seznamů. To dělá jednodušší používání tohoto stylu v těchto jazycích. Funkcionální struktury jako higher-order funkce a zpracování seznamů můžeme implementovat v C++ pomocí knihoven. V C můžeme použít ukazatele na funkce, abychom získali některé z efektů higher-order funkcí, například můžeme implementovat běžnou funkci mapování za použití funkčních ukazatelů. Deklarativní specifické jazyky jako [[SQL]] a [[Lex (software)|Lex]]/[[Yacc]], které nejsou Turing-kompletní, používají některé elementy funkcionálního programování, hlavně při vyvarování se nestálých hodnot.
 
== Porovnání funkcionálního a imperativního programování ==
 
Funkcionální programování je velmi odlišné od imperativního programování. Nejvýraznější rozdíl je v tom, že funkcionální programování zabraňuje vedlejším efektům, které jsou používané v imperativním programování k implementování stavů vstupů a výstupů. [[Čistě funkcionální]] programování zakazuje vedlejší efekty. Zakázání vedlejších efektů zajišťuje referenční průhlednost, která ulehčuje verifikaci, optimalizaci a paralelizaci programů a ulehčuje psaní automatických nástrojů k provedení těchto procesů.
 
Řádek 110 ⟶ 102:
 
=== Záležitosti efektivity ===
 
Funkcionální programovací jazyky mají automatické spravování paměti s [[garbage collection]], v kontrastu se staršími programovacími jazyky jako je [[C (programovací jazyk)|C]] a [[Pascal (programovací jazyk)|Pascal]], které používají explicitní spravování paměti. Funkcionální programovací jazyky jsou náročnější na systémové prostředky. Nicméně spousta imperativních programovacích jazyků jako [[Java (programovací jazyk)|Java]], [[Perl]], [[Python]], [[Ruby]] mají také automatickou správu paměti a taky jsou náročné na systémové prostředky.
 
Řádek 116 ⟶ 107:
 
=== Programovací styly ===
 
Imperativní jazyky směřují k sérii kroků, vykonané programem při provádění akce, kdežto funkcionální programy směřují ke kompozici a poskládání funkcí často bez upřesňujících explicitních kroků. Jednoduchý příklad dvou řešení stejného problému za použití multiparadigmatického jazyka (Python):
 
Řádek 146 ⟶ 136:
 
== Související články ==
 
* [[Function-level programování]]
* [[Čistě funkcionální]]
Řádek 153 ⟶ 142:
* [[Deklarativní programování]]
* [[Logické programování]]
 
== Externí odkazy ==
* {{Commonscat}}
 
{{Pahýl}}