title: Tipizzazione forte
text: # Tipizzazione forte
  
  In informatica, e in particolare in programmazione, l'espressione tipizzazione forte (strong typing) può essere usata per caratterizzare il tipo di regole che un determinato linguaggio di programmazione impone, a livello sintattico o semantico, circa la tipizzazione dei dati e all'uso dei dati in relazione al loro tipo. L'opposto della tipizzazione forte è la tipizzazione debole.
  
  ## Descrizione
  
  In un linguaggio fortemente tipizzato, il programmatore è tenuto a specificare il tipo di ogni elemento sintattico che durante l'esecuzione denota un valore (per esempio un valore costante, una variabile o un'espressione), e il linguaggio garantisce che tale valore sia utilizzato in modo coerente con il tipo specificato: per esempio, non è possibile eseguire una somma aritmetica su dati di tipo stringa. Questo concetto generale può applicarsi con diverse sfumature; a seconda del contesto. Dunque, l'espressione linguaggio fortemente tipizzato può riferirsi a cose leggermente diverse:
  
  * tipizzazione statica: tutti i controlli sull'uso corretto dei valori rispetto al loro tipo vengono eseguiti durante la compilazione;
  * sicurezza rispetto ai tipi (type safety): è garantito che vengano fatti controlli esaustivi sull'uso dei valori rispetto al loro tipo, ma non necessariamente durante la compilazione (un programma potrebbe fallire durante l'esecuzione a causa di violazioni di tipo)
  * impossibilità di eseguire conversioni di tipo;
  * impossibilità di eseguire conversioni di tipo implicite;
  
  Un esempio limite di linguaggio debolmente tipizzato è il linguaggio macchina, in cui un'area di memoria, rappresentata nel codice da un indirizzo di memoria, può essere usata indifferentemente per contenere valori di qualunque tipo, numeri interi, numeri con la virgola, caratteri, e così via. I linguaggi di programmazione ad alto livello tendono ad avere sistemi dei tipi più sicuri e quindi ad avvicinarsi all'ideale della forte tipizzazione, ma in genere rimangono disponibili meccanismi per trattare dati in modo flessibile che si prestano a essere utilizzati per violare il sistema dei tipi. Per esempio, il linguaggio C fornisce almeno tre meccanismi che lo qualificano come linguaggio debolmente tipizzato:
  
  * le operazioni di casting, che consentono di forzare l'interpretazione di un qualunque valore secondo un qualunque tipo (anche un tipo diverso da quello a cui il valore è stato precedentemente associato);
  * i puntatori a void, che godono di conversione di tipo implicita verso qualunque altro tipo puntatore;
  * le unioni, che consentono di interpretare una collezione di dati correlati secondo diverse attribuzioni di tipo indipendenti.
  