Programovací paradigma
Programovací paradigma je základní programovací styl (na rozdíl od metodiky, která představuje způsob vývoje konkrétních aplikací v softwarovém inženýrství). Paradigmata se liší v pojmech a abstrakcích, které tvoří jednotlivé 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
editovatProgramovací model je abstrakce počítačového systému. Například 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 vícero paradigmat. Například programy psané v jazyce C++ nebo Object Pascal mohou být čistě procedurální, čistě objektové nebo kombinace obou paradigmat. Vývojáři pak mají možnost se rozhodnout, jak a které prvky paradigmat použijí.
V objektově orientovaném programování lze program vidět jako soubor navzájem propojených objektů, zatímco ve 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í, v němž je aplikace množina souběžných procesů pracujících se sdílenými datovými strukturami.
Stejně jako různé skupiny softwarových inženýrů prosazují různé metodiky, různé programovací jazyky 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é jazyky podporují více paradigmat (např. Object Pascal, Scala, C++, Java, C#, Visual Basic, Common Lisp, Scheme, Perl, Python, Ruby, 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ších účinků, zatímco strukturované programování znemožňuje používání příkazu goto. 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 pochopení programu, nebo automatické dokazování jeho správnosti. Jindy jde o tvorbu programů se speciálními vlastnostmi, jako například v případě diferencovatelného programování programů s mnoha parametry, jež je potřeba optimalizovat.
Multiparadigmatické programovací jazyky
editovatMultiparadigmatický programovací jazyk je jazyk, který podporuje více než jedno programovací paradigma. Timothy Budd, autor jazyka 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, který obsahuje prvky logického, funkcionálního, objektově orientovaného, a dalších programovacích paradigmat.
Historie
editovatPůvodně byly počítače pevně zapojeny, tj. konstrukčně předurčeny k určitému úkonu, později programovány binárním kódem, který reprezentoval ovládací sekvence předávané 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 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ým kódem. Programování ve strojovém kódu je programovací paradigma nejnižší úrovně. Kvůli usnadnění programování byly vyvinuty jazyky symbolických instrukcí, někdy souhrnně nazývané jako assembler. Ty nahradily funkce strojového kódu zkratkami jejich názvů a 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 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 (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ě kritických a vestavěných systémech.
Dalším pokrokem byl rozvoj procedurálních jazyků. Tyto jazyky třetí generace (první generace vyšších programovacích jazyků) používají slovní zásobu související s řešeným problémem. Jsou jimi například jazyky:
- C — vyvinut okolo roku 1970 v Bellových laboratořích;
- COBOL (COmmon Business Oriented Language) — používá výrazy jako soubor, přesunout nebo kopírovat;
- FORTRAN (FORmula TRANslation – „překlad výrazů“) — používá matematickou terminologii, byl vyvinut zejména pro řešení vědeckých úloh;
- ALGOL (ALGOrithmic Language) — zaměřen na definice algoritmů s použitím matematické terminologie, stejně jako FORTRAN;
- PL/I (Programming Language One) — hybridní komerčně-vědecký jazyk pro všeobecné použití, podporující ukazatele;
- BASIC (Beginners All purpose Symbolic Instruction Code) — vyvinut kvůli rozšíření okruhu programátorů.
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. Kvalita takového řešení závisí na schopnostech programátora.
Později byly vytvořeny objektově orientované jazyky (Simula, Smalltalk, Eiffel, Java, apod.). V těchto jazycích jsou data a metody sloužící k manipulaci s těmito daty uloženy v jednotkách zvaných objekty. Jediný způsob, jakým lze k datům přistupovat, je přes metody objektu. Díky tomu lze změnit či optimalizovat vnitřní chování objektu, aniž by mě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 bloat, tedy plýtvání. Jako reakce na tuto kritiku byl vyvinut 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, který plně podporuje pokročilé datové typy a objektově orientované programování symbolickými instrukcemi navzdory svému stáří.
V rámci imperativního programování existuje alternativa ke strukturovanému programování v podobě tzv. „literate programming“, ve kterém není vše přizpůsobováno počítači, ale naopak programátorovi. Programy jsou strukturovány jako sítě propojených textů – dokumentace je zahrnuta v kódu programu a program je strukturován v závislosti na psaném textu, nikoli na požadavcích kompilátoru.
Nezávisle na imperativním paradigmatu, založeném na procedurálních jazycích, byla vyvinuta 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í a logické jazyky.
Funkcionální programování je podmnožinou deklarativního. Programy psané s využitím tohoto paradigmatu jsou založeny na funkcích, blocích kódu s vlastnostmi matematických funkcí. Funkcionální jazyky neumožňují změnit hodnotu proměnných, namísto toho se používá rekurze.
V 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í pravidla dokud není nalezena odpověď na dotaz, nebo dokud není prokázáno, že jsou fakta nekonzistentní.
Odkazy
editovatReference
editovatV tomto článku byl použit překlad textu z článku Programming paradigm na anglické Wikipedii.
Externí odkazy
editovat- Obrázky, zvuky či videa k tématu programovací paradigma na Wikimedia Commons