Programovací paradigma: Porovnání verzí

Odebráno 90 bajtů ,  před 8 lety
bez shrnutí editace
m (styl)
{{Programovací paradigmata}}
 
'''Programovací [[Paradigma|paradigma]]''' je způsobzákladní [[Programování|programováníprogramovací]], styl (na rozdíl od [[Metodologie vývoje softwaru|metodiky]], která představuje způsob vývoje konkrétních aplikací v [[Softwarové inženýrství|softwarovém inženýrství]]). Paradigmata se liší v konceptechpojmech a abstrakcích, použitýchkteré ktvoří reprezentacijednotlivé jednotlivých prvkůprvky programu (objekty, funkce, proměnné, omezení, aj.), a krocích, ze kterých se výpočet skládá (přiřazení, vyhodnocení, continuations (pokračování), datové toky, atd.).
 
== Přehled ==
''Programovací model'' je abstrakce počítačového systému. Například [[Von Neumannova architektura|von Neumannův model]] je používán v běžných sekvenčních počítačích. [[Paralelní výpočty]] mohou být znázorněny mnoha různými modely odrážejícími způsoby propojení procesorů. Nejběžnější modely jsou založeny na sdílené paměti, oddělené paměti s posíláním zpráv nebo kombinaci obou.
 
[[Programovací jazyk]] může podporovat [[Multiparadigmatický programovací jazyk|vícero paradigmat]]. Například programy psané v jazyce [[C++]] nebo [[Object Pascal]] mohou být čistě [[Procedurální programování|procedurální]], čistě [[Objektově orientované programování|objektové]] nebo kombinace elementů obou paradigmat. Vývojáři pak mají možnost se rozhodnout, jak a které prvky paradigmat použijí.
 
V objektově orientovaném programování jelze programemprogram vidět jako soubor navzájem propojených objektů, zatímco ve [[Funkcionální programování|funkcionálním programování]] je programem sled vyhodnocení bezstavových funkcí. V systémech s více procesory nalezne uplatnění [[Procesně orientované programování|procesně orientované programování]], v němž je aplikace množina souběžných procesů pracujících se sdílenými [[Datová struktura|datovými strukturami]].
 
Stejně jako různé skupiny [[Softwarové inženýrství|softwarových inženýrů]] prosazují různé metodiky, různé [[Programovací jazyk|programovací jazyky]] podporujípředstavují různá programovací paradigmata. Některé jazyky jsou navrženy tak, aby umožňovaly použití jediného programovacího paradigmatu ([[Smalltalk]] je čistě objektově orientovaný, [[Haskell]] je čistě funkcionální), zatímco jiné jazkyjazyky podporují více paradigmat (např. [[Object Pascal]], [[Scala]], [[C++]], [[Java]], [[C#]], [[Visual Basic]], [[Common Lisp]], [[Scheme]], [[Perl]], [[Python]], [[Ruby]], [[Oz (programovací jazyk)|Oz]] a [[F#]]).
 
Mnohá programovací paradigmata se vyznačují tím, že umožňují, či neumožňují některé specifické programovací techniky. Kupříkladu čistě funkcionální programování zakazuje používání [[Vedlejší účinek|vedlejších účinků]], zatímco [[Strukturované programování|strukturované programování]] znemožňuje používání příkazu [[Skok (informatika)|goto]]. ČástečněI z tohoto důvodu jsou nová paradigmata oproti dřívějším často považována za dogmatická a příliš přísná. Znemožnění použití některých technik však může usnadnit prokázání správnostipochopení programu, anebo [[automatické dokazování]] jeho pochopenísprávnosti.
 
== Multiparadigmatické programovací jazyky ==
[[Multiparadigmatický programovací jazyk]], je jazyk, který podporuje více než jedno programovací paradigma. [[Timothy Budd]], autor jazyka [[Leda (programovací jazyk)|Leda]], to vysvětlil takto: „Myšlenka multiparadigmatického jazyka je poskytnutí frameworku, v němž mohou programátoři pracovat mnoha různými způsoby a volně mísit konstrukty z různých paradigmat.“ Cílem těchto jazyků je umožnit programátorům využití nejlepšího možného nástroje pro daný úkol, neboť žádné paradigma neumožňuje nejjednodušší a nejefektivnější řešení všech úloh.
 
Příkladem může být jazyk [[Oz (programovací jazyk)|Oz]], který obsahuje prvky [[Logické programování|logického]], [[Funkcionální programování|funkcionálního]], [[Objektově orientované programování|objektově orientovaného]], a dalších programovacích paradigmat. Jazyk Oz byl vyvíjen po dobu deseti let s cílem harmonicky zkombinovat koncepty původně spojené s různými paradigmaty.
 
== Historie ==
Původně byly počítače pevně zapojeny, tj. konstrukčně předurčeny k určitému úkonu, později programovány [[binární kód|binárním kódem]], který reprezentoval ovládací sekvence předávané [[Procesor|procesoru]]. Tento způsob byl obtížný a náchylný k chybám. Přechod od pevného zapojení ke strojovému kódu představuje realizaci [[Von Neumannova architektura|Von Neumannova stroje]]. Pevně zapojený systém odpovídá stroji s přenosovou funkcí pro data mezi vstupem a výstupem. Funkce je tvořena propojením komponent mezi oběma rozhraními. Pozdější stroje využívají koncepce s uloženým programem. Příkladem je Von Neumannův stroj, ve kterém jsou uloženy program i data. Ve Von Neumannově stroji každý program reprezentuje jiný, pevně zapojený stroj. Program definuje přenosovou funkci pro data.
 
Binární kód je též nazýván [[Strojový kód|strojovým kódem]]. Programování ve strojovém kódu je [[Nižší programovací jazyk|programovací paradigma nejnižší úrovně]]. Kvůli usnadnění programování byly vyvinuty [[Jazyk symbolických adres|jazyky symbolických instrukcí]], někdy souhrnně nazývané jako assembler. Ty nahradily funkce strojového kódu zkratkami jejich názvů a [[Adresa (programování)|adresy v paměti]] symbolickými popisky. Programování v jazyce symbolických instrukcí je považováno za paradigma nejnižší úrovně, ač je o generaci dál než strojový kód. Dokonce i jazyky symbolických instrukcí ze [[1960-1969|60. let 20. století]] podporovaly knihovní funkci COPY a relativně sofistikované generování podmíněných maker a předzpracování. Mimoto podporovaly i funkce modulárního programování jako např. instrukci CALL ([[Funkce (programování)|volání podprogramů]]), externí proměnné a společné (globální) části kódu, čímž umožnily značné znovupoužití kódu a nezávislost na vlastnostech hardwaru použitím logických operátorů jakými jsou instrukce READ, WRITE, GET nebo PUT. Assemblery se dodnes používají v časově krirických a [[Vestavěný systém|vestavěných systémech]].
Všechny tyto jazyky se řídí procedurálním paradigmatem. To znamená, že popisují krok po kroku postup, který musí být vykonán k vyřešení dané úlohy. [[Složitost algoritmů|Kvalita]] takového řešení závisí na schopnostech programátora.
 
Později byly vytvořeny [[Objektově orientované jazyky|objektově orientované jazyky]] ([[Simula]], [[Smalltalk]], [[Eiffel (programovací jazyk)|Eiffel]], [[Java]], apod.). V těchto jazycích jsou [[Data|data]] a metody sloužící k manipulaci s těmito daty uloženy v jednotkách zvaných [[Objekt (programování)|objekty]]. Jediný způsob, jakým se lze k datům dostatpřistupovat, je přes metody objektu. Díky tomu lze upravovatzměnit či optimalizovat vnitřní kódchování objektu, bezaniž nutnostiby měnitměnil kód, který s objektem pracuje. Objektově orientované programování je stále kritizováno věhlasnými programátory, jakými jsou např. [[Alexandr Stepanov]] a [[Richard Stallman,]] z důvodu nižší efektivity oproti procedurálnímu paradigmatu. Nutnost existence metod v každém objektu je označována za [[Bloatware|bloat]], tedy plýtvání. Jako reakce na tuto kritiku byl vyvinut [[Polymorfismus (programování)|polymorfismus]].
 
Vzhledem k tomu, že je objektově orientované programování paradigma, nikoli jazyk, bylo možné vytvořit dokonce i objektově orientovaný jazyk symbolických instrukcí. Příkladem může být High Level Assembly ([[HLA]]), který plně podporuje pokročilé datové typy a objektově orientované programování symbolickými instrukcemi navzdory svému stáří.
Nezávisle na imperativním paradigmatu, založeném na procedurálních jazycích, byla vyvinuta [[Deklarativní programování|deklarativní programovací paradigmata]]. V deklarativních jazycích je počítači řečeno, co má vykonat, nikoli jak. Program je strukturován jako soubor vlastností, které má výsledek mít, ne jako procedura, jež má být vykonána. Počítač pracuje s databází, nebo souborem pravidel a pokouší se najít řešení které má všechny požadované vlastnosti. Příkladem deklarativního programování je jazyk čtvrté generace [[SQL]], [[Funkcionální programování|funkcionální]] a [[Logické jazyky|logické jazyky]].
 
[[Funkcionální programování]] je podmnožinou deklarativního. Programy psané s využitím tohoto paradigmatu jsou založeny na [[Funkce (programování)|funkcích]], blocích kódu s vlastnostmi [[Funkce (matematika)|matematických funkcí]]. Funkcionální jazyky brání změnám hodnot proměnných prostřednictvímneumožňují [[Přiřazení|přiřazenízměnit hodnotu]] proměnných, tonamísto toho jese nahrazenopoužívá [[Rekurze|rekurzírekurze]].
 
V [[Logické programování|logickém programování]] je výpočtem automatické uvažování nad znalostmi. Fakta o řešené úloze jsou vyjádřena logickými výrazy. Za běhu programu se na fakta aplikují [[Odvozovací pravidlo|odvozovací pravidla]] dokud není nalezena odpověď na dotaz, nebo dokud není prokázáno, že jsou fakta nekonzistentní.