Paradigma programování - Programming paradigm

Programovací paradigmata jsou způsobem, jak klasifikovat programovací jazyky na základě jejich vlastností. Jazyky lze rozdělit do několika paradigmat.

Některá paradigmata se týkají hlavně důsledků pro model provádění jazyka, jako je umožnění vedlejších účinků nebo zda je sled operací definován prováděcím modelem. Další paradigmata se týkají hlavně způsobu organizace kódu, například seskupení kódu do jednotek spolu se stavem, který je kódem upraven. Přesto se ostatní zabývají hlavně stylem syntaxe a gramatiky.

Mezi běžné programovací paradigmata patří:

  • imperativ, ve kterém programátor instruuje stroj, jak změnit jeho stav,
  • deklarativní, ve kterém programátor pouze deklaruje vlastnosti požadovaného výsledku, ale ne jak jej vypočítat
    • funkční, ve kterém je požadovaný výsledek deklarován jako hodnota řady funkčních aplikací,
    • logika, ve které je požadovaný výsledek deklarován jako odpověď na otázku o systému faktů a pravidel,
    • matematický, ve kterém je požadovaný výsledek deklarován jako řešení optimalizačního problému
    • reaktivní, ve kterém je požadovaný výsledek deklarován pomocí datových toků a šíření změn

Symbolické techniky, jako je reflexe , které umožňují programu odkazovat na sebe, lze také považovat za paradigma programování. To je však kompatibilní s hlavními paradigmaty, a proto samo o sobě není skutečným paradigmatem.

Například jazyky, které spadají do imperativního paradigmatu, mají dva hlavní rysy: uvádějí pořadí, ve kterém dochází k operacím, s konstrukcemi, které tento řád výslovně řídí, a umožňují vedlejší efekty, ve kterých lze stav v jednom časovém okamžiku upravit, v rámci jedné jednotky kódu a poté později číst v jiném časovém okamžiku uvnitř jiné jednotky kódu. Komunikace mezi jednotkami kódu není explicitní. Mezitím je v objektově orientovaném programování kód organizován do objektů, které obsahují stav, který je upraven pouze kódem, který je součástí objektu. Většina objektově orientovaných jazyků jsou také naléhavé jazyky. Naproti tomu jazyky, které odpovídají deklarativnímu paradigmatu, neuvádějí pořadí, ve kterém se mají provádět operace. Místo toho dodávají řadu dostupných operací v systému spolu s podmínkami, za kterých je každé z nich možné provést. Implementace prováděcího modelu jazyka sleduje, které operace lze provádět zdarma, a nezávisle vybírá pořadí. Více na Srovnání víceparadigmatických programovacích jazyků .

Přehled

Přehled různých programovacích paradigmat podle Petera Van Roye

Stejně jako je softwarové inženýrství (jako proces) definováno různými metodologiemi , jsou programovací jazyky (jako modely výpočtu) definovány odlišnými paradigmaty . Některé jazyky jsou navrženy tak, aby podporovaly jedno paradigma ( Smalltalk podporuje objektově orientované programování, Haskell podporuje funkční programování), zatímco jiné programovací jazyky podporují více paradigmat (například Object Pascal , C ++ , Java , JavaScript , C# , Scala , Visual Basic , Common Lisp ( Scheme , Perl , PHP , Python , Ruby , Oz a F# ). Například programy napsané v C ++, Object Pascal nebo PHP mohou být čistě procedurální , čistě objektově orientované nebo mohou obsahovat prvky obou nebo jiných paradigmat. Softwaroví návrháři a programátoři rozhodují, jak tyto prvky paradigmatu použít.

V objektově orientovaném programování jsou programy považovány za sadu interagujících objektů. Ve funkčním programování jsou programy považovány za posloupnost vyhodnocení bezstavové funkce. Při programování počítačů nebo systémů s mnoha procesory jsou v procesově orientovaném programování programy považovány za sady souběžných procesů, které působí na logické sdílené datové struktury .

Mnoho programovacích paradigmat je stejně známých pro techniky, které zakazují, jako pro ty, které umožňují . Například čisté funkční programování zakazuje použití vedlejších efektů , zatímco strukturované programování zakazuje použití příkazu goto . Částečně z tohoto důvodu jsou nová paradigmata těmi, kteří jsou zvyklí na dřívější styly, často považována za doktrináře nebo příliš rigidní. Přesto se vyhýbání některým technikám může snazší pochopit chování programu a dokázat věty o správnosti programu.

Programovací paradigmata lze také porovnat s programovacími modely , což umožňuje vyvolání prováděcího modelu pomocí pouze API. Programovací modely lze také zařadit do paradigmat na základě vlastností prováděcího modelu.

Pro paralelní výpočet je běžné použití programovacího modelu místo jazyka. Důvodem je, že podrobnosti o paralelním hardwaru pronikají do abstrakcí používaných k programování hardwaru. To způsobí, že programátor bude muset mapovat vzory v algoritmu na vzory v prováděcím modelu (které byly vloženy kvůli úniku hardwaru do abstrakce). V důsledku toho nikdo paralelní programovací jazyk dobře nemapuje všechny problémy s výpočty. Proto je pohodlnější použít základní sekvenční jazyk a vkládat volání API do modelů paralelního spouštění prostřednictvím programovacího modelu. Takové modely paralelního programování lze klasifikovat podle abstrakcí, které odrážejí hardware, jako je sdílená paměť , distribuovaná paměť s předáváním zpráv , představy o místě viditelném v kódu atd. Lze je považovat za příchutě programovacího paradigmatu, které platí pouze pro paralelní jazyky a programovací modely.

Kritika

Někteří výzkumníci programovacích jazyků kritizují pojem paradigmat jako klasifikaci programovacích jazyků, např. Harper a Krishnamurthi. Argumentují tím, že mnoho programovacích jazyků nelze striktně zařadit do jednoho paradigmatu, ale spíše obsahují funkce z několika paradigmat. Viz Porovnání programovacích jazyků s více paradigmaty .

Dějiny

Postupem času se vyvinuly různé přístupy k programování, které byly jako takové identifikovány buď v té době, nebo zpětně. Časný přístup vědomě identifikovaný jako takový je strukturované programování , prosazované od poloviny 60. let. Koncept „programovacího paradigmatu“ jako takového se datuje přinejmenším do roku 1978 v přednášce Turingovy ceny Roberta W. Floyda s názvem The Paradigms of Programming , která cituje pojem paradigmatu, jak jej použil Thomas Kuhn ve své struktuře vědecké Revoluce (1962).

Strojový kód

Na nejnižší úrovni programovací paradigmata jsou strojový kód , který přímo reprezentuje instrukce (obsah paměti programu) jako sled čísel a assembleru , kde jsou strojové instrukce reprezentovány mnemotechnické pomůcky a adresy paměti může být poskytnuta symbolické štítky. Někdy se jim říká jazyky první a druhé generace .

V šedesátých letech byly vyvinuty montážní jazyky na podporu COPY knihovny a dosti propracovaných podmíněných schopností generování maker a předzpracování, CALL to ( podprogramy ), externích proměnných a společných sekcí (globals), umožňující významné opětovné použití kódu a izolaci od specifik hardwaru prostřednictvím použití logických operátorů, jako je READ/WRITE/GET/PUT. Shromáždění bylo a stále je používáno pro časově kritické systémy a často v integrovaných systémech, protože poskytuje nejpřímější kontrolu nad tím, co stroj dělá.

Procedurální jazyky

Dalším pokrokem byl vývoj procedurálních jazyků . Tyto jazyky třetí generace (první popsané jako jazyky na vysoké úrovni ) používají slovní zásobu související s řešeným problémem. Například,

  • COmmon Business Oriented Language ( COBOL ) - používá termíny jako soubor , přesun a kopírování .
  • FORmula TRANslation ( FORTRAN ) - pomocí matematické jazykové terminologie byla vyvinuta hlavně pro vědecké a technické problémy.
  • ALGOrithmic Language ( ALGOL ) - zaměřený na to, aby byl vhodným jazykem pro definování algoritmů , a přitom používal terminologii matematického jazyka, zaměřoval se na vědecké a technické problémy, stejně jako FORTRAN.
  • Programming Language One ( PL/I )-hybridní komerčně-vědecký obecný jazyk podporující ukazatele .
  • Začátečníci Univerzální symbolický instrukční kód ( BASIC ) - byl vyvinut tak, aby umožnil psaní programů více lidem.
  • C  -univerzální programovací jazyk, původně vyvinutý Dennisem Ritchiem mezi lety 1969 a 1973 v AT&T Bell Labs .

Všechny tyto jazyky dodržují procedurální paradigma. To znamená, že krok za krokem popisují přesně postup, který by měl být podle konkrétního programátora přinejmenším dodržen při řešení konkrétního problému. Účinnost a účinnost každé takové řešení, tak tedy zcela subjektivní a velmi závisí na tom programátora zkušenosti, vynalézavost a schopnost.

Objektově orientované programování

Po rozšířeném používání procedurálních jazyků byly vytvořeny jazyky objektově orientovaného programování (OOP), jako jsou Simula , Smalltalk , C ++ , Eiffel , Python , PHP , Java a C# . V těchto jazycích jsou data a způsoby, jak s nimi manipulovat, uchovávány jako jedna jednotka nazývaná objekt . S dokonalým zapouzdřením , jedním z charakteristických rysů OOP, jediný způsob, jak by jiný objekt nebo uživatel měl přístup k datům, je prostřednictvím metod objektu . Vnitřní fungování objektu lze tedy změnit bez ovlivnění jakéhokoli kódu, který objekt používá. Alexander Stepanov , Richard Stallman a další programátoři stále vyvolávají kontroverze ohledně účinnosti paradigmatu OOP oproti procedurálnímu paradigmatu. Potřeba, aby každý objekt měl asociativní metody, vede některé skeptiky ke spojování OOP se softwarovým nadýmáním ; pokus vyřešit toto dilema prošel polymorfismem .

Protože objektově orientované programování je považováno za paradigma, nikoli za jazyk, je možné vytvořit dokonce objektově orientovaný assemblerový jazyk. High Level Assembly (HLA) je toho příkladem, který plně podporuje pokročilé datové typy a objektově orientované programovací jazyky assembleru-a to navzdory jeho raným počátkům. Různá paradigmata programování lze tedy vnímat spíše jako motivační memy jejich obhájců, než nutně představující pokrok z jedné úrovně na druhou. Přesná srovnání účinnosti konkurenčních paradigmat jsou často obtížnější kvůli nové a odlišné terminologii aplikované na podobné entity a procesy spolu s mnoha rozdíly v implementaci napříč jazyky.

Další paradigmata

Gramotné programování , jako forma imperativního programování , strukturuje programy jako web zaměřený na člověka, jako v hypertextové eseji: dokumentace je nedílnou součástí programu a program je strukturován podle logiky expozice prózy, nikoli podle kompilátoru.

Nezávisle na imperativní větvi byla vyvinuta deklarativní programovací paradigmata. V těchto jazycích je počítači sděleno, v čem je problém, nikoli jak problém vyřešit - program je strukturován jako sada vlastností, které se mají najít v očekávaném výsledku, nikoli jako postup, který je třeba dodržovat. Vzhledem k databázi nebo sadě pravidel se počítač pokusí najít řešení odpovídající všem požadovaným vlastnostem. Archetypem deklarativního jazyka je jazyk čtvrté generace jazyka SQL a rodina funkčních jazyků a logické programování.

Funkční programování je podmnožinou deklarativního programování. Programy napsané pomocí tohoto paradigmatu používají funkce , bloky kódu, které se mají chovat jako matematické funkce . Funkční jazyky odradí změny v hodnotě proměnných prostřednictvím přiřazení , místo toho ve velké míře využívají rekurze .

Logické programování paradigmatu považuje výpočet jako automatického uvažování nad faktografie. Fakta o problémové doméně jsou vyjádřena jako logické vzorce a programy jsou prováděny tak, že se na ně použijí odvozovací pravidla , dokud se nenajde odpověď na problém nebo dokud se sada vzorců neukáže jako nekonzistentní.

Symbolické programování je paradigma, které popisuje programy schopné manipulovat se vzorci a programovými komponentami jako s daty. Programy se tak mohou efektivně upravovat a vypadají, že se „učí“, což je činí vhodnými pro aplikace, jako je umělá inteligence , expertní systémy , zpracování přirozeného jazyka a počítačové hry. Mezi jazyky, které toto paradigma podporují, patří Lisp a Prolog .

Programy diferencovatelných programovacích struktur tak, aby je bylo možné v celém rozsahu diferencovat , obvykle prostřednictvím automatické diferenciace .

Podpora více paradigmat

Většina programovacích jazyků podporuje více než jedno programovací paradigma, které umožňuje programátorům používat pro danou úlohu nejvhodnější styl programování a související jazykové konstrukce.

Viz také

Reference

externí odkazy