Vyhodnocovací strategie

Vyhodnocovací strategie (nebo také redukční strategie – pojem se typicky používá ve funkcionálních jazycích) v programovacím jazyce je množina pravidel (většinou deterministických), která definuje způsob vyhodnocování výrazů. Důraz je obvykle kladen na funkce a operátory – vyhodnocovací strategie definuje, kdy a v jakém pořadí jsou vyhodnocovány argumenty funkce, a kdy a jakým způsobem jsou ve funkci nahrazovány.

Jazyk může kombinovat několik vyhodnocovacích strategií. Například C++ kombinuje volání hodnotou a volání referencí. Většina jazyků, které jsou převážně striktní, používají nějakou formu nestriktního vyhodnocování pro booleovské výrazy a podmíněné příkazy.

Striktní vyhodnocování editovat

V striktním vyhodnocování jsou argumenty funkce vždy zcela vyhodnoceny před tím než jsou na funkci aplikovány (aplikace argumentů na funkci je v imperativních jazycích často označována jako volání funkce s danými argumenty).

Volání hodnotou editovat

Volání hodnotou je nejčastější vyhodnocovací strategie, používaná například v jazyce C. Při volání hodnotou je argument výrazu vyhodnocen a výsledná hodnota je přiřazena k odpovídající proměnné ve funkci (obvykle zkopírováním hodnoty na nové místo v paměti). Pokud je dovoleno, aby funkce, nebo procedura mohla přiřadit hodnoty svým argumentem, tato hodnota je přiřazena pouze lokální kopii. To znamená, že cokoliv volající pomocí argumentů odevzdal funkci má po vrácení z volání funkce volající v rozsahu platnosti nezměněny.

Volání referencí (odkazem) editovat

Volání referencí je způsob vyhodnocování používaných v některých jazycích (například C++), kde proměnné a některé jiné hodnoty, nazývané l-hodnotou (anglicky l-value), musí vždy odkazovat na nějaké místo v paměti. V těchto jazycích některé funkce jako své argumenty akceptují pouze l-hodnoty. S l-hodnotou se musí vždy zacházet jako s referencí a musí být předána funkcí pomocí hodnoty. Tělo funkce může pak manipulovat s obsahem odkazovaných buňky paměti, změnou hodnoty na kterou l-hodnota ukazuje ve rozsahu platnosti volajícího.

V jazycích, které používají neomezované ukazatele namísto nebo spolu s referencemi, je volání adresou variant k volání referencí, kde reference je neomezený ukazatel.

Některé jazyky používají reference, nebo ukazatele jako zvláštní hodnoty. Například ML má "ref" konstruktor, jazyk C intenzivně využívá ukazatele. V těchto jazycích je "volání referencí" nebo "volání adresou" může být použito jako způsob předání hodnoty reference, nebo hodnoty ukazatele jako argumentu funkce.

Nestriktní vyhodnocování editovat

V nestriktním vyhodnocování nejsou argumenty funkce vyhodnocovány, dokud nejsou právě použity při vyhodnocování těla funkce.

Normální vyhodnocování editovat

Normální vyhodnocování je vyhodnocovací strategie, kde je při aplikování funkce redukovaná ta funkce, která je nejvíce venku, aniž by byly vyhodnoceny funkční argumenty. Od volání jménem se liší tím, že se nevyhodnocuje vnitřní tělo nepoužívání funkce.

Volání jménem editovat

Vyhodnocování volání jménem je zřídka implementováno přímo, ale často je použito při uvažování nad teoretickými vlastnostmi programů a programovacích jazyků. Při vyhodnocování voláním jménem nejsou argumenty funkce vůbec vyhodnocovány – spíše jsou argumenty funkce přímo nahrazeny ve funkčním těle. Když argument není vůbec použit, tak se nikdy nevyhodnotí. Když je argument používán několikrát, tak je vždy znovu vyhodnocován. Z tohoto důvodu se sémantika volání jménem obvykle implementuje voláním dle potřeby.

Volání dle potřeby editovat

Volání dle potřeby je paměťová vyhodnocovací verze volání jménem. Když je poprvé vyhodnocen argument funkce, tak se jeho hodnota uloží. Při dalším vyhodnocování se použije uložená hodnota. Když je argument používán dvakrát nebo vícekrát, tak je volání podle potřeby téměř vždy rychleji než volání jménem. V jazyce, který má "čisté" výrazy (bez vedlejších efektů), toto dává stejné výsledky jako při volání jménem.

Volání dle potřeby lze použít pouze v jazycích, které zaručují referenční transparentnost – například v deklarativních, nebo funkcionálních jazycích. Při použití imperativních jazyků toto není zaručeno na 100 % (protože vyhodnocování výrazu závisí na stavu, ve kterém se program nachází – ve výrazu se může měnit hodnota globální proměnné a při každém vyhodnocení může mít tento výraz jinou hodnotu).

Odkazy editovat

Reference editovat

V tomto článku byl použit překlad textu z článku Vyhodnocovacia stratégia na slovenské Wikipedii.