Hai un punto perfettamente valido, le lingue che non tengono traccia del tipo di una variabile esistono e sono chiamate "digitate dinamicamente". La categoria include linguaggi come JavaScript, Perl, Lisp e Python.
Il vantaggio che otteniamo da una lingua tipizzata in modo statico è un ulteriore controllo degli errori in fase di compilazione.
Supponiamo, ad esempio, di avere il seguente metodo:
public addCustomerContact(Customer client, Employee contact) {
...
}
Sarebbe possibile, se hai un cliente bob
e un dipendente james
nel tuo codice, chiamare erroneamente addCustomerContact(james, bob)
, che non è valido. Ma se il compilatore non conosce i tipi delle variabili, non può avvisarti che hai fatto una chiamata non valida, invece, si verifica un errore in fase di esecuzione ... e poiché le lingue digitate dinamicamente non controllano il tipo di parametri passati ai metodi, il problema si verifica ogni volta che il codice tenta di utilizzare le proprietà di solo cliente dell'oggetto james
o le proprietà di solo dipendente dell'oggetto bob
. Potrebbe essere molto tempo dopo che la coppia (james, bob) è stata aggiunta all'elenco dei contatti del cliente.
Ora, potresti chiedertelo, perché il compilatore non può ancora dedurre il tipo di james
e bob
, e comunque avvertirci? Questo a volte può essere possibile, ma se le variabili non hanno realmente alcun tipo, allora potremmo fare quanto segue:
var james;
var bob;
if (getRandomNumber() > 0.5) {
james = new Customer();
bob = new Employee();
} else {
james = new Employee();
bob = new Customer();
}
È perfettamente legale assegnare qualsiasi valore a qualsiasi variabile, poiché abbiamo detto che le variabili non hanno alcun tipo. Ciò significa anche che non possiamo sempre conoscere il tipo di una variabile, perché potrebbe essere di tipi diversi in base a diversi percorsi di esecuzione.
In generale, i linguaggi tipizzati dinamicamente sono usati per linguaggi di scripting, dove non esiste un passo di compilazione, e quindi gli errori di compilazione non esistono, il che significa che le sequenze di tasti in più necessarie per dare un tipo di variabile non sarebbero molto utili.
Ci sono anche alcuni vantaggi nei linguaggi tipizzati dinamicamente, soprattutto in termini di minor codice necessario per implementare lo stesso design: le interfacce non devono essere scritte, perché tutto è "duck typed" (ci interessa solo quali metodi / proprietà un oggetto ha, non a quale classe appartiene l'oggetto), le variabili non devono essere fornite di tipo esplicito ... con il trade off che scopriamo un po 'meno bug prima di iniziare a lanciare il nostro codice.