Jste zde

Dynamický programovací jazyk vs dynamické programování

Ač jsou mnohdy tyto dva termíny mylně používány ve vzájemné souvislosti ("programuji v dynamickém jazyce, tedy dynamicky programuji"), tak mezi oběma termíny (koncepty) je velmi zásadní rozdíl, který je činí naprosto ortogonálními. Lze tedy využívat konceptů dynamického programování v jazyce, který není považován za dynamický a zároveň lze programovat v dynamickém jazyce, aniž by bylo využíváno dynamického programování. Cílem tohoto příspěvku je oba termíny vysvětlit, aby vynikl jejich rozdíl.

Dynamický programovací jazyk je takový jazyk, který za běhu umožňuje některé operace, které u ostatních jazyků lze provádět pouze během kompilace (pokud vůbec). Tato definice je samozřejmě velice vágní, takže příslušnost daného jazyka mezi dynamické jazyky může být subjektivní. Mezi typické vlastnosti a koncepty, kterými se pyšní dynamické jazyky, patří funkce eval() (vykonání řetězce za běhu programu, jakoby se jednalo o součást zdrojového kódu), funkce vyššího řádu (funkce mohou vracet funkce jako návratové hodnoty a mohou brát funkce jako parametry), zjišťování informací o programu a jejich modifikace za běhu (reflexe, přesněji reifikace (reification), introspekce (introspection) a intercession -- bez překladu), mezi což by šlo zařadit i možnost změny objektů za běhu (přidání či ubrání metod, změna typu apod.) a další vlastnosti. Mezi dynamické jazyky je zařazován Smalltalk, Python, Ruby, Perl, PHP a další. Naopak, mezi jazyky, které nejsou považovány za dynamické, patří třeba C, C++ a Java.

Dynamické programování je optimalizační metoda. Mezí hlavní techniky dynamického programování patří tzv. memoization (bez překladu), někdy nazýváno jako "kešování" (caching) vypočtených výsledků. Tato myšlenka říká, že pokud jsme již něco spočítali, tak nemá smysl to počítat znovu. Vypočtené výsledky jsou tudíž ukládány (např. do hašovací tabulky) a v případě možnosti použity. Důsledkem může být značné urychlení programu (záleží na typu problému a implementaci této metody). Jako nejčastější příklad se uvádí optimalizace výpočtu tzv. Fibonacciho posloupnosti, jejíž členové jsou dány rekurentním vyjádřením

Rekurentní vyjádřená Fibonacciho čísel

Při výpočtu tedy má smysl si ukládat mezivýsledky, abychom je nemuseli počítat znovu. Samozřejmě, toto byl jen jednoduchý příklad, ale tato technika nachází uplatnění v řadě algoritmů (např. CYK algoritmus pro zjišťování, zda zadaný řetězec lze generovat zadanou bezkontextovou gramatikou, či provádění operací nad binárními rozhodovacími diagramy).

A ještě prosba nakonec: nezaměňujte termíny dynamický programovací jazyk a dynamické typování (i když dynamické jazyky bývají dynamicky typované, tak se opět jedná o ortogonální koncepty).

Přidat komentář