Imperativní programování

typ programovacích paradigmat

Imperativní programování (též procedurální programování) je jedno z programovacích paradigmat, neboli způsobů, jak jsou v programovacím jazyku formulována řešení problémů. Imperativní programování popisuje výpočet pomocí posloupnosti příkazů a určuje přesný postup (algoritmus), jak danou úlohu řešit. Program je sadou proměnných, jež v závislosti na vyhodnocení podmínek mění pomocí příkazů svůj stav. Základní metodou imperativního programování je procedurální programování, tyto termíny bývají proto často zaměňovány.

Programovací paradigmata

Úvod editovat

Imperativní přístup je blízký i obyčejnému člověku. Například kuchařské recepty či návody k montáži zakoupených výrobků jsou také příkazy krok za krokem a každý příkaz je v závislosti na podmínkách svázán s určitým stavem jídla či kompletnosti výrobku. Tento pro lidi přirozený způsob přesně odpovídá paradigmatu imperativního programování, a nikoho tudíž asi nepřekvapí, že většina programovacích jazyků i hardwarová implementace většiny počítačů jsou imperativní. Hardware pak stejně jako vařící/montující člověk vykonává příkaz za příkazem, přesně jak to odpovídá imperativnímu přístupu. Pouze jednotlivé příkazy jsou instrukce strojového kódu, k jehož vykonávání je hardware navržen, a aktuální stav vyjadřuje obsah paměti. Vyšší imperativní jazyky pak používají proměnné a komplexnější příkazy (tedy výrazy a funkce), ovšem stále vyznávají to samé, imperativní paradigma.

Historie editovat

První imperativní programovací jazyky byly strojové jazyky jednotlivých počítačů. V těchto jazycích byly pouze velmi jednoduché instrukce, což sice umožňovalo velmi snadnou hardwarovou implementaci, ale komplikovalo to možnost vytvářet komplexní programy. První jazyk, který odstranil překážky strojového kódu pro vytváření komplexních programů, byl FORTRAN, vytvořený Johnem Backusem ve společnosti IBM v roce 1954. FORTRAN přinesl možnosti (například pojmenovávání proměnných, složené výrazy, podprogramy a mnohé další), jež jsou součástí imperativních jazyků dodnes.

Následující dvě dekády přinesly další významné vyšší programovací jazyky. Ke konci padesátých let a v letech šedesátých se objevil jazyk ALGOL, pomocí kterého šlo snáze programovat matematické algoritmy. Jazyky COBOL (1960) a BASIC (1964) pak byly pokusem přizpůsobit syntaxi programování syntaxi přirozeného jazyka – angličtině. V sedmdesátých letech byl Niklausem Wirthem navržen jazyk Pascal a Dennisem Ritchiem (pracujícím v Bellových laboratořích) jazyk C. Wirth se pak dále zabýval jazyky Modula-2 a Oberon. Koncem 60. let vznikl první objektový jazyk, Simula. Pro potřeby amerického ministerstva obrany začali v roce 1978, po čtyřech letech sumarizování požadavků, Jean Ichbiah a tým z Honeywellu vyvíjet jazyk Ada. Specifikace byla poprvé publikována v roce 1983, oprav se pak dočkala v letech 1995 a 2005/6.

V osmdesátých letech vzrostl zájem o objektově orientované programování. Vznikající jazyky pak vyznávaly imperativní styl, ale přidávaly podporu objektů. Během posledních dvou dekád dvacátého století jich vzniklo značné množství. V roce 1980 vydalo Xerox Palo Alto Research Center jazyk Smalltalk-80, původně koncipovaný Alanem Kayem v roce 1969. Převzetím konceptů z jiného objektově orientovaného jazyka – Simuly. Bjarne Stroustrup vyvinul jazyk C++, objektově orientovanou verzi známého jazyka C. C++ byl poprvé implementován v roce 1985. Na konci osmdesátých let a v letech devadesátých pak vzniklo velké množství imperativních jazyků založených na konceptech objektově orientovaného programování. Z významných jmenujme Perl (Larry Wall, 1987), Python (Guido van Rossum, 1990), Java (Sun Microsystems, 1994) a C# (Microsoft, 2000).

Dělení editovat

Jemněji lze imperativní programování rozdělit na tři skupiny.

Naivní paradigma bývá někdy chápáno jako samostatné paradigma a ještě častěji se mezi paradigmaty programování ani neuvádí. Naivní jazyky se vyznačují jakousi všudypřítomnou chaotičností, mají obvykle nesystematickou syntaxi i sémantiku. V některých rysech mají podobné vlastnosti jako nestrukturované jazyky. Typickým zástupcem je například jazyk BASIC.

Nestrukturované paradigma je velmi blízké assemblerům. Programy jsou lineárními sekvencemi příkazů a skoky jsou v nich realizovány příkazem typu „go to“ – tedy „jdi na (řádek)“. V raných jazycích tohoto stylu byly navíc všechny řádky programu číslované a skoky šlo realizovat pouze uvedením konkrétního čísla řádku, což bylo velmi nepraktické. Později se objevily jazyky využívající tzv. návěští, tedy textová označení míst, kam má program skočit. Typickými zástupci byly například rané verze jazyků FORTRAN a COBOL.

Strukturované paradigma. Kvůli nepraktičnosti příkazu skoku „go to“ (ta vězí zejména v tom, že struktura programu nedává prakticky žádnou informaci o jeho vykonávání, což velmi komplikuje jeho ladění) vzniklo strukturované paradigma. Jeho hlavním přínosem je fakt, že nahrazuje příkazy skoku pomocí podmíněných cyklů („opakuj, dokud platí podmínka“) a jiných strukturovaných instrukcí, které se do sebe vnořují. Typickými zástupci jsou jazyky C, Pascal a Ada.

Základní typy příkazů editovat

Imperativní programování využívá tři základní skupiny příkazů.

Přiřazení obecně provádí operaci s informací uloženou v paměti a ukládá výsledek do paměti pro pozdější použití. Vyšší programovací jazyky navíc dovolují provádění komplexnějších výrazů, jež mohou sestávat z kombinace aritmetických operací, programových funkcí a přiřazování výsledných hodnot do paměti.

Cykly dovolují opakovat sekvenci příkazů několikrát za sebou. Počet opakování pak může být přesně určen nebo se sekvence může opakovat do té doby, dokud se nezmění určená podmínka.

Příkazy pro větvení dovolují provést určitou část příkazů jen tehdy, byla-li splněna příslušná podmínka. V opačném případě je tato část přeskočena a pokračuje se v provádění příkazů bezprostředně následujících. Příkazy pro větvení také umožňují přejít do jiné části programu, zpravidla voláním podprogramu (funkce, procedury).

Odlišnosti opačného přístupu editovat

V přímém kontrastu s imperativním programováním je deklarativní programování, jež je založeno na popisu cíle – přesný algoritmus provedení specifikuje až interpret příslušného jazyka a programátor se jím nezabývá. Díky tomu lze ušetřit mnoho chyb vznikajících zejména tím, že do jedné globální proměnné zapisuje najednou mnoho funkcí a metod. V deklarativním programování se totiž většinou místo proměnných používají k předání hodnot návratové hodnoty funkcí.

Na druhou stranu programátorovi při imperativním přístupu zůstává možnost program široce a přesně optimalizovat takovým způsobem, jaký právě potřebuje. Při přístupu deklarativním musí spoléhat na překladač, jež nemusí zvolit algoritmus, který by byl v dané chvíli výhodnější. Navíc při deklarativním přístupu je velmi často využíváno rekurze, což klade vyšší nároky na programátora. Ten si totiž musí představit, jak celý program bude fungovat, místo toho, aby viděl, jako u přístupu imperativního, přesně zapsaný algoritmus před sebou.

Příklad editovat

Porovnejme nyní známou matematickou funkci – faktoriál čísla n – zapsanou v jazyce imperativním a dvou jazycích deklarativních.

Typickým jazykem imperativního programování je například jazyk C:

unsigned int n;
unsigned int i;
unsigned int faktorial = 1;

for (i = 2; i <= n; i++) faktorial *= i;

Protikladem může být deklarativní jazyk pro funkcionální programování Scheme:

(define (faktorial n)
(cond
  [(> 1 n) 1]
  [else (*n (faktorial (- n 1)))]
  )
)

Dalším přístupem deklarativního programování může být například programování logické, jehož typickým zástupcem je jazyk Prolog:

faktorial(0,1).
faktorial(1,1).
faktorial(N,F):- M is N-1, faktorial(M,F2), F is N*F2.

Imperativní programovací jazyky editovat

Podrobnější informace naleznete v článku Seznam imperativních programovacích jazyků.

Imperativní programovací jazyky k výpočtu využívají posloupnosti příkazů a určují přesný postup (algoritmus), jak danou úlohu řešit, mohou však používat i další programovací paradigmata a být tak zařazeny do více klasifikačních skupin.

Odkazy editovat

Literatura editovat

  • Skoupil, D.; Úvod do paradigmat programování. Katedra matematické informatiky, Olomouc, 1994. TR-CS-94-01.
  • Abelson, H. – Sussman, G.J.; Structure and Interpretation of Computer Programs. The MIT Press, Cambridge, Massachusetts, 1985. ISBN 0-262-01153-0.
  • Dybvig, R. K.; The Scheme Programming Language. Prentice Hall, A Simon and Schuster Company, Upper Saddle River, New Jersey, 1996.
  • Felleisen, M. – Findler, R.B. – Flatt, M. – Krishnamurthi, S.; How to Design Programs: An Introduction to Computing and Programming. The MIT Press, Cambridge, Massachusetts, 2001.
  • Manis, V.S. – Little, J.J.; The Schematics of Computation. Prentice Hall, Englewood Cliffs, New Jersey, 1995. ISBN 0-13-834284-9.
  • Springer, G. – Friedman, D.P.; Scheme and the Art of Programming. The MIT Press, Cambridge, Massachusetts, 1994. ISBN 0-262-19288-8.

Související články editovat