Il programmatore deve in genere dichiarare esplicitamente la variabile, specificandone il tipo, anche se in alcuni linguaggi (come ML o Haskell), il compilatore o l’interprete sono in grado di inferire il tipo corretto dal contesto.
L’ associazione fra tipi e dati è un’importante caratterizzazione del linguaggio. Nei linguaggi staticamente tipizzati (come C, C11, C#, Java, Delphi, ML, Haskell), essa non cambia durante l’esecuzione del programma. Il programmatore deve in genere dichiarare esplicitamente la variabile, specificandone il tipo, anche se in alcuni linguaggi (come ML o Haskell), il compilatore o l’interprete sono in grado di inferire il tipo corretto dal contesto. Assegnare alla variabile un valore di tipo diverso o utilizzarla in un contesto inappropriato per il suo tipo (per es., eseguire un’ operazione aritmetica su una variabile di tipo non numerico) genera un errore in fase di compilazione. Proprio il fatto che il compilatore sia in grado di effettuare automaticamente queste verifiche viene considerato uno dei principali vantaggi di questo approccio. Nei linguaggi dinamicamente tipizzati (APL, Objective-C, Lisp, Smalltalk, JavaScript, Tcl, Prolog, Python, Ruby ecc.), il legame fra variabile e tipo può cambiare nel corso dell’esecuzione: la variabile, per così dire, contiene sia il dato che il tipo. Un utilizzo scorretto può essere segnalato solo durante l’esecuzione. I sostenitori di questo approccio sostengono che permetta una programmazione più semplice e rapida.