1.1. Klasifikace programovacích jazyků

Programovací jazyky můžeme principiálně rozdělit do dvou skupin - na jazyky imperativní, které se orientují na popis toho, jak se má provádět výpočet, a jazyky deklarativní, které jsou naopak zaměřené na to, co se má vypočítat.

Imperativní programovací jazyky jsou charakteristické zejména tím, že program má tvar posloupnosti příkazů, jejichž pořadí vyhodnocení je pevně stanoveno. Další typickou vlastností této třídy jazyků je existence proměnných, jejichž hodnota se může v průběhu výpočtu měnit pomocí operace přiřazení.

Deklarativní programovací jazyky vyjadřují hledané řešení obvykle ve formě výčtu vlastností, které by mělo řešení splňovat. V případě funkcionálních jazyků jsou tyto vlastnosti dány ve formě definičních rovností, u logických jazyků jsou stanoveny jako formule predikátového počtu. Posloupnost operací, které vedou k nalezení výsledku, není uvedena explicitně v programu. Například tentýž program může být použit pro výpočet měsíčních splátek na půjčku, ale zároveň i pro výpočet celkové splacené částky v závislosti na tom, které hodnoty považujeme za známé a které za neznámé.

V případě funkcionálních jazyků, jak již jejich název napovídá, je základním modelem výpočtu matematický pojem funkce aplikované na argumenty a vypočítávající deterministicky jediný výsledek. Tyto jazyky vycházejí z teorie funkcí - lambda-kalkulu. V praxi se můžeme setkat jak s čistě funkcionálními jazyky, které striktně vycházejí z teorie (např. FP, Haskell, Miranda, Hope), tak i s hybridními jazyky, které mohou obsahovat i prvky, které jsou se základními principy funkcionálního programování v rozporu. Například často citovaný „typicky“ funkcionální jazyk Lisp je ve skutečnosti jazykem hybridním, neboť umožňuje modifikovat hodnoty již definovaných proměnných. Mezi hybridní jazyky patří rovněž jazyk Standard ML a jazyk Scheme.