přihlásit 4320/544796

Úvod do typování

Python má silné a dynamické typování

Programovací jazyk může mít silné nebo slabé a statické nebo dynamické typování. Je možná libovolná kombinace, i když v praxi jsou některé častější a některé vzácné.

V těchto pojmech mají někteří lidé zmatek, neví co to přesně znamená, ale mají dojem že statické typování je to samé co silné a dynamické typování zase to samé co slabé. Na základě toho pak tvrdí, že jazyk C je silně typovaný a Python slabě, přestože je tomu právě naopak. Proto si tyto pojmy vysvětleme. Uvedené přívlastky popisují, jak programovací jazyk nakládá s proměnnými a datovými typy.

statické versus dynamické typování

U statického typování se datový typ přiřazuje k proměnné při její deklaraci. Datové typy proměnných jsou proto známy již při překladu programu. To umožňuje již při překladu odhalit některá nesprávná použití proměnných a datových typů (chyby v programu). Také to umožňuje lepší optimalizaci programu na výkon. Nevýhodou je, že proměnná může nést jen hodnoty jednoho datového typu. To se občas nehodí, je to málo flexibilní a obejít toto omezení komplikuje psaní programu. Spousta složitých konstrukcí v jazyce C++ je v něm jen z důvodu obcházení statického typování tohoto jazyka.

U dynamického typování je datový typ sdružen s hodnotou. Hodnoty proměnných vznikají až za běhu programu a tak nemohou být jejich datové typy kontrolovány při kompilaci. Mohou ale být kontrolováný za běhu programu. U jazyků s dynamickým typováním může nést proměnná hodnotu různých datových typů. A dokonce lze za běhu programu datové typy, třeba třídy, modifikovat. To je vlmi flexibilní a zjednodušje to programování. Nevýhodou je obtížnost optimalizace programu na výkon a implementace takového jazyku. Proto bývají dynamické jazyky zároveň i interpretované. Dynamické jazyky jsou proto proti statickým pomalejší, v některých operacích až řádově.

Nelze obecně říct, co je lepší a co je horší. Záleží na tom co děláme a co je pro nás přínosnější. Takže stejně jako u vlastnosti interpretovaný/kompilovaný) stojíme před otázkou, je pro ten a ten projekt výhodnější produktivita a jednoduchhost programování nebo výkon aplikace? A podle toho se rozhodneme.

slabé versus silné typování

Silně typovaný jazyk na rozdíl od slabě typovaného jazyku provádí kontrolu typů a spolehlivě zjištuje jejich chybné použití (chyby v programu) za běhu programu. Řada programátorů s menším rozhledem má nerozlučně spojeno dynamické typování se slabým a statické se silným. To je omyl na jehož základě pak i mylně odhadují Python. Ukažme si to.

Python má dynamické a přesto silné typování, proto se brání sčítat hrušky s jabkama:

print 'Výsledek =', 1 + "1"

Výsledek =
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Byla vyvolána výjimka: Nelze sčítat datový typ int a str, tedy číslo a text.

Jazyk C má sice statické typování, ale slabé a proto klidně sčítá hrušky s jabkama a vrací 'náhodný' výsledek:

#include <stdio.h>
int main(int *argc, char *argv[]){
  printf("Vysledek = %d\n", (1+"1"));
  return(0);
}

Vysledek = 134513793

vadí absence statického typování v pythonu?

Přesto si řada programátorů myslí, že Python se nehodí na psaní rozsáhlých nebo důležitých věcí, protože neumožňuje psát robustní kód. O jazyku C to ovšem netvrdí. Mají pro to dva důvody.

1) Nemají zkušenosti s jazykem jako je Python a neuvědomují si, že Python má silné typování. Nesprávně ho zařazují do skupiny skriptovacích jazyků s dynamickým a slabým typováním (PHP, Perl), tedy zcela bez kontroly a proto na Python pohlíží s despektem.

2) Myslí si, že statické typování a následná kontrola/odhalení chyb v programu již při překladu je samospasitelná nebo přinejmenší tak zásadní, že je nezbytné pro vytváření robustních programů. Domnívám se osobně, že tomu tak není. Zde jsou mé argumenty.

To, že se program podaří zkompilovat neznamená, že v něm už nejsou chyby. Ostatně, uvedený příklad jazyka C to krásně ukazuje. Pocit uspokojení "když se to podařilo zkompilovat, tak už je vše OK" je zrádný. Není to tak. Statické typování dokáže detekovat jen částečnou množinu možných chyb.

Python při spuštění programu rovněž umí odhalit množinu možných chyb, i když trochu jinou. Jediný způsob jak vytvářet téměř bezchybné programy je jejich důkladné testování a to u libovolného jazyka. A v tomto testování nám Python výborně pomáhá a to nejen silným typováním, ale i dalšími nástroji, viz moduly doctest [1] a unittest [2] nebo kontrolní nástroje PyChecker [3] či pylint [4].

Významným faktem také je, že v Pythonu se obecně dělá méně chyb. Python řadě chyb předchází svou syntaxí a neumožňuje je vůbec udělat (zapomenutý středník, vynechaná závorka x-tého vnořeného bloku, přiřazení na místo porovnání v podmínce). A nezanedbatelný vliv má i to, že syntaxe Pythonu je jednoduchá a přehledná.

Proto je obava, že v pythoních programech bude bude nevyhnutelně spousta těžko odhalitelných chyb, zbytečná. Nepřeceňujme statické typování, není to všelék a existují i jiné, přinejmenším stejně účinné způsoby.


Seznam URL na stránce:
[1] http://docs.python.org/lib/module-doctest.html
[2] http://docs.python.org/lib/module-unittest.html
[3] http://pychecker.sourceforge.net/
[4] http://www.logilab.org/project/eid/857