Archiv pro štítek: bezpečně a nebezpečně typované jazyky

Vlastnosti typových systémů

vlastnosti-typovych-systemuK čemu v programování slouží typový systém? Jde o nástroj k porovnávání datových typů jednotlivých proměnných, které se provádí před operací v libovolném výrazu. Díky typovému systému zajistíme, že nedojde k chybě spočívající v kombinaci špatných datových typů (například když se pokusíme sečíst číslo a textový řetězec).

Silně a slabě typované jazyky

Typový systém může na problematiku nahlížet dvěma způsoby. Silně typované programovací jazyky striktně vyžadují pouze předem vymezené datové typy. Každá operace v takovém jazyce má proto určené jaké datové typy argumentů akceptuje. Do této kategorie patří např. Java nebo C.

Naopak tomu slabě typovaný jazyk se snaží operaci provést za každou cenu a proto přistupuje k přetypování. Vraťme se k příkladu z úvodu. Součet čísla a textového řetězce zdá se nedává smysl, ovšem co když v textu máme uložené opět číslo? Pak jazyku nic nebrání v tom, aby provedl přetypování textu na číslo a vypočítal výsledný součet. Ač se popsané chování může jevit jako jednoznačná výhoda, záleží na úhlu pohledu, někdy mohou díky této slabé kontrole datových typů vznikat hůře odhalitelné chyby. Popsaným způsobem se chová např. PHP nebo JavaScript.

Staticky a dynamicky typované jazyky

Programovací jazyk, který datové typy proměnných zjišťuje staticky, provádí vstupní analýzu kódu, během které je schopný odhalit datový typ každé proměnné. Napomáhá tomu mimo jiné to, že datový typ je zpravidla nutno deklarovat. Díky tomu pak překladač může lépe optimalizovat vytvářený kód (přesně totiž ví, s čím přichází do styku). Uvedené informace se vztahují k většině dnešních programovacích jazyků.

Existuje ovšem i jiný přístup. Co kdybychom datový typ zjistili až za běhu programu? Pak může jedna proměnná obsahovat několik naprosto rozdílných hodnot. Nemluvíme zde proto o typu proměnné (to platí pro staticky typované jazyky) ale o typu hodnoty. S uvedeným přístupem přichází např. jazyk Perl.

Bezpečně a nebezpečně typované jazyky

U bezpečně typovaných jazyků máme zajištěno, že pokud je operace proveditelná (tedy je splněna náležitost v podobě správných argumentů), tak vždy bude operace úspěšně dokončena. Nestane se zkrátka, že kvůli prováděné operaci aplikace spadne.

Naopak tomu jako už název prozrazuje nebezpečně typované jazyky dávají programátorovi šanci dostat výpočetní proces do nekonzistentního stavu. Díky existenci pointeru je poměrně jednoduché tohoto cíle dosáhnout v jazyce C nebo C++. Můžeme totiž různě přesouvat obsahy proměnných i obměňovat místa, kam v paměti ukazujeme.

void main()
{
    int *x = 0; //nulový ukazatel (NULL pointer)
    *x = 42; //chyba, na toto nulové místo se snažíme uložit hodnotu
}