Hai un punto perfettamente valido, esistono lingue che non tengono traccia del tipo di una variabile e sono chiamate "tipizzate dinamicamente". La categoria include lingue come JavaScript, Perl, Lisp e Python.
Il vantaggio che otteniamo da una lingua tipizzata staticamente è 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 di variabili, non può avvisarti che hai effettuato una chiamata non valida, invece, si verifica un errore in fase di esecuzione ... e poiché i linguaggi di tipo dinamico non controllano il tipo di parametri passati ai metodi, tale problema si verifica ogni volta che il codice tenta di utilizzare le proprietà solo cliente james
dell'oggetto o le proprietà solo dipendente bob
dell'oggetto. Potrebbe passare molto tempo dopo che la coppia (james, bob) è stata aggiunta all'elenco dei contatti dei clienti.
Ora, potresti chiederti, perché il compilatore non può ancora dedurre il tipo di james
e bob
, e ancora avvisarci? Questo a volte può essere possibile, ma se le variabili non hanno davvero 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 diversi tipi in base a percorsi di esecuzione diversi.
In generale, i linguaggi tipizzati dinamicamente vengono utilizzati per i linguaggi di scripting, in cui non esiste una fase di compilazione e quindi non esistono errori di compilazione, il che significa che i tasti aggiuntivi necessari per fornire il tipo di variabili non sarebbero molto utili.
Ci sono alcuni vantaggi distinti anche nei linguaggi tipizzati dinamicamente, principalmente in termini di meno codice necessario per implementare lo stesso design: le interfacce non devono essere scritte, perché tutto è "tipizzato" (ci interessa solo quali metodi / proprietà ha un oggetto , non a quale classe appartiene l'oggetto), non è necessario assegnare un tipo esplicito alle variabili ... con il compromesso che scopriamo un po 'meno bug prima di iniziare a eseguire il nostro codice.