I sistemi di tipo impediscono errori
I sistemi di tipo eliminano i programmi illegali. Considera il seguente codice Python.
a = 'foo'
b = True
c = a / b
In Python, questo programma fallisce; genera un'eccezione. In un linguaggio come Java, C #, Haskell , qualunque cosa, questo non è nemmeno un programma legale. Si evitano del tutto questi errori perché semplicemente non sono possibili nel set di programmi di input.
Allo stesso modo, un sistema di tipo migliore esclude più errori. Se passiamo ai sistemi di tipo super avanzato possiamo dire cose del genere:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Ora il sistema dei tipi garantisce che non vi siano errori di divisione per 0.
Che tipo di errori
Ecco un breve elenco di quali tipi di errori possono impedire i sistemi
- Errori fuori portata
- SQL Injection
- Generalizzando 2, molti problemi di sicurezza (a cosa serve il controllo dei contaminanti in Perl )
- Errori fuori sequenza (dimenticando di chiamare init)
- Forzare un sottoinsieme di valori da utilizzare (ad esempio, solo numeri interi maggiori di 0)
Gattini malvagi (Sì, era uno scherzo)
- Errori di perdita di precisione
- Errori di memoria transazionale del software (STM) (ciò richiede purezza, che richiede anche tipi)
- Generalizzando 8, controllando gli effetti collaterali
- Invarianti su strutture di dati (un albero binario è bilanciato?)
- Dimenticare un'eccezione o lanciare quella sbagliata
E ricorda, questo è anche in fase di compilazione . Non è necessario scrivere test con una copertura del codice del 100% per verificare semplicemente la presenza di errori di tipo, il compilatore fa proprio per te :)
Caso di studio: calcolo lambda tipizzato
Bene, esaminiamo i più semplici sistemi di tutti i tipi, semplicemente digitati calcolo lambda .
Fondamentalmente ci sono due tipi,
Type = Unit | Type -> Type
E tutti i termini sono variabili, lambda o applicazione. Sulla base di questo, possiamo dimostrare che qualsiasi programma ben scritto termina. Non c'è mai una situazione in cui il programma rimarrà bloccato o in loop per sempre. Questo non è dimostrabile nel normale calcolo lambda perché non è vero.
Pensa a questo, possiamo usare i sistemi di tipi per garantire che il nostro programma non funziona in loop per sempre, piuttosto bello vero?
Deviazione in tipi dinamici
I sistemi di tipo dinamico possono offrire garanzie identiche ai sistemi di tipo statico, ma in fase di esecuzione anziché in fase di compilazione. In realtà, dal momento che è runtime, puoi effettivamente offrire ulteriori informazioni. Si perdono tuttavia alcune garanzie, in particolare su proprietà statiche come la risoluzione.
Quindi i tipi dinamici non escludono determinati programmi, ma indirizzano piuttosto programmi malformati ad azioni ben definite, come il lancio di eccezioni.
TLDR
Quindi, in sostanza, i sistemi di tipo escludono determinati programmi. Molti programmi sono in qualche modo interrotti, quindi con sistemi di tipo evitiamo questi programmi interrotti.