Typová kontrola: Porovnání verzí

Smazaný obsah Přidaný obsah
m Robot: -zastaralá značka HTML; kosmetické úpravy
Řádek 4:
Statická typová kontrola, jako jedna ze [[Sémantická analýza|sémantických kontrol]], ověřuje typy výrazů, zda odpovídají svým kontextům např. požadavek na typ operandu určitého operátoru apod. Odhaluje pouze chyby vyhodnotitelné při překladu, ale kontrolované podmínky jsou společné pro všechna vykonání programu a tak odpadá nutnost opakování typové kontroly při každém spuštění programu. Vynechání typové kontroly za běhu umožňuje efektivnější vykonání programu (rychlé či s menším nárokem na paměť) a další optimalizace. Při pohledu na všechny jazykové konstrukce jako na [[Funkce (programování)|funkce]], jak to dělají [[funkcionální jazyky]], se projeví podobnost s deklaračním problémem u identifikátorů a funkcí, kde je však kromě názvu a typu proměnné zároveň požadována ještě posloupnost (může být i prázdná) argumentů.
 
U [[Programovací jazyk|programovacích jazyků]] používajících statické typování probíhá typová kontrola již v době kompilace. Při programování v těchto jazycích je nutno explicitně deklarovat typy, v OOP obvykle typy proměnných. Mezi ''staticky'' ''typované jazyky'' patří například [[Ada (programovací jazyk)|Ada]], [[C (programovací jazyk)|C]], [[C++]], [[C Sharp|C#]], [[Java (programovací jazyk)|Java]], [[Haskell (programovací jazyk)|Haskell]]. Většinou nejsou formálně typově bezpečné, protože jejich specifikace umožňuje obcházet statické typové ověření a dovolí provést operace nebezpečné za běhu, které způsobí nežádoucí chování kvůli nesprávnému zadání hodnot.
 
== Dynamická typová kontrola ==
Řádek 19:
Slabě typované jazyky implicitně převádí typy při jejich použití. Například v následujícím příkladu není slabě typovanému jazyku jasný výsledek operace:
 
<sourcesyntaxhighlight lang="javascript">
var x = 5; // x je typu integer
var y = "37"; // y je typu string
x + y; // ?
</syntaxhighlight>
</source>
 
Oproti tomu jazyk [[Visual Basic]] bude produkovat spustitelný kód, kde dojde k převodu řetězce "37" na číslo 37, přičte se 5 a výsledkem výsledkem celé operace bude číslo 42. Jiné jazyky jako je [[JavaScript]] vyhodnotí výsledek tak, že číslo 5 se převede na řetězec "5" a dojde ke sloučení "5" a "37" a výsledkem bude řetězec "537". V obou případech je typ stanoven podle pravidel, které berou v úvahu oba operandy, ale o výsledném datovém typu rozhodne pouze jeden z nich. Například v jazyce [[AppleScript]] se typ výsledné hodnoty stanoví podle typu operandu nejvíce vlevo.
Řádek 30:
Třetí způsob kategorizace typového systému programovacího jazyka se zaměřuje na bezpečné typové operace a konverze. Za „typově bezpečný“ se považuje jazyk, který nedovoluje operace nebo konverze vedoucí k chybám. Někdy se používá termín „paměťově bezpečný“, kam spadají jazyky zamezující nedefinovaným operacím (kontrolují např. rozsah pole, aby nedošlo k přístupu mimo jeho hranice a porušení ochrany paměti).
 
<sourcesyntaxhighlight lang="javascript">
var x = 5;
var y = "37";
var z = x + y;
</syntaxhighlight>
</source>
 
Uvedené proměnné <code>z</code> může ale nemusí být přiřazen datový typ, jazyk definuje výsledek konkrétně a program může běžet bez pádu a aniž by přiřadil chybnou hodnotu. Tím je zajištěna typová bezpečnost, avšak kdyby byla hodnota proměnné <code>y</code> řetězec, který nelze převést na číslo, bude výsledek nedefinovaný a program může vygenerovat nežádoucí výsledky.