Dynamický programovací jazyk

Dynamický programovací jazyk je termín používaný v informatice popisující třídu vyšších programovacích jazyků, který v běhu vykonává spoustu běžných operací, jako statické programovací jazyky provádí během kompilace. Toto chování umožňuje rozšířit program následujícím způsobem: přidáním nového zdrojového kódu, rozšířením objektů a jejich definic nebo modifikací typového systému. Toto chování může být emulováno takřka v každém rozmanitém jazyce, ale musí poskytovat přímé nástroje k jejich využívání. Mnoho z těchto nástrojů bylo nejdříve implementováno jako nativní funkce pro programovací jazyk Lisp.

Většina dynamických jazyků jsou také dynamicky typované, ale není to pravidlem. Dynamické programovací jazyky jsou často (ale ne vždy) označovány jako skriptovací jazyky, i když pojem „skriptovací jazyk“ v jeho nejužším smyslu se odkazuje na jazyky specifické pro zmíněné běhové prostředí.

Příklady

Populární dynamické programovací jazyky zahrnují JavaScript, Python, Ruby, PHP, Lua a Perl. Níže uvedené příklady jsou obecné považovány za dynamické programovací jazyky:

Implementace

Funkce eval

Na tuto kapitolu je přesměrováno heslo eval.

Některé dynamické programovací jazyky poskytují funkci eval. Tato funkce převezme řetězcový parametr obsahující kód v daném jazyce a provede ho. Pokud tento kód odpovídá syntaxi programovacího jazyka, vrátí návratovou hodnotu. Avšak Erik Meijer a Peter Drayton naznačují programátorům, že používání funkce eval je chudá náhrada za funkce vyšších řádů.

Změna objektu za běhu

Typ nebo objekt může být typicky modifikován v průběhu vykonávání programu v dynamickém programovacím jazyce. To může znamenat vytváření nových objektů z definice běhového prostředí nebo na základě mixinu existujících typů či objektů. Toto může vést ke změně dědičnosti nebo ke stromovému přetypování a tím lze měnit způsob, jak se budou už existující typy chovat (zejména pokud jde o volání metod).

Funkcionální programování

Funkcionální programování je typickým rysem mnoha dynamických programovacích jazyků a také pochází z Lispu.

Uzávěry

Jedním z nejvíce používaných aspektů funkcionální programování v dynamických programovacích jazycích je uzávěr, který umožňuje vytvořit novou instanci funkce, která si zachovává přístup ke kontextu, ve kterém byl vytvořen. Jednoduchým příkladem je generování funkce pro skenování textu pro "slovo":

function new_scanner (slovo)
  temp_function = function (vstup)
    scan_for_text (vstup, slovo)
  end function
  return temp_function
end function

Všimněte si, že vnitřní funkce nemá žádné jméno a místo toho je uložena v proměnné temp_function. Pokaždé, když je funkce new_scanner provedena, vrátí novou funkci, která si pamatuje hodnotu parametru slovo, který byl předán, když to bylo definováno.

Uzávěry jsou jedním z hlavních nástrojů funkcionálního programování a mnoho programovacích jazyků podporuje alespoň tento stupeň funkčního programování.

Continuations

Dalším rysem některých dynamických programovacích jazyků je Continuation. Continuation představuje spuštěný stav, který může být znovu vyvolán. Například, parsovač může vrátit průběžný výsledek a když je znovu vyvolán, bude nadále analyzovat vstup. Continuation se provádí velmi složitým způsobem, zejména s ohledem na uzávěry. Z tohoto důvodu mnoho dynamických programovacích jazyků neposkytuje Continuation.

Reflexe

Reflexe je běžná v mnoha dynamických programovacích jazyků a obvykle zahrnuje analýzu typů a metadata generických nebo polymorfních dat. Může ale obsahovat úplnou úpravu kódu programu jakožto dat pomocí funkcí, které poskytuje Lisp při analýze symbolických výrazů.

Makra

Omezený počet dynamických programovacích jazyků nabízejí funkce, které kombinují kód introspekce a eval ve funkci nazvanou makro. Většina programátorů, kteří si dnes jsou vědomi termínu makro, se s nimi setká v programovacím jazyce C nebo C ++, kde jsou makra statické funkce, které jsou postaveny na malé podmnožině jazyka a jsou schopny pouze řetězcových substitucí nad textem zdrojového kódu programu. Nicméně v dynamických programovacích jazycích poskytují přístup k vnitřnímu fungování překladače a plný přístup k interpretru, virtuálnímu stroji nebo k běhovému prostředí, což umožňuje definovat programovací jazyk konstruktem, který může optimalizovat kód nebo upravovat syntaxi či gramatiku programovacího jazyka.

Reference

V tomto článku byl použit překlad textu z článku Dynamic_programming_language na anglické Wikipedii.

  1. Chapter 24. Dynamic language support. Static.springsource.org. Retrieved on 2013-07-17.
  2. groovy.codehaus.org [online]. [cit. 21-04-2015]. Dostupné v archivu pořízeném dne 02-03-2014.