Ogni dato appartiene ad un preciso "tipo", che determina come deve essere memorizzato e quali sono le istruzioni permesse.
Ogni linguaggio ha dei tipi fondamentali e dei sistemi per aggregare più elementi in un tipo composto.
I tipi di base sono INTEGER, REAL, CHAR, BOOLEAN. Dire che una variabile è di tipo INTEGER vuol dire specificare quanti byte devono essere riservati per memorizzarla e che sono permesse le quattro operazioni aritmetiche, con la riserva della divisione che viene espressa senza virgole e senza resto.
I modi più diffusi per aggregare più elementi sono ARRAY, RECORD e FILE.
Un record è l’unione di più elementi di tipo diverso; un array è l’unione di più elementi tutti uguali che saranno poi contraddistinti da un indice; un file è l’insieme di dati di tipo uguale (come l’array), ma memorizzati in un dispositivo esterno, quindi con speciali procedure di accesso.
Un linguaggio può essere fortemente tipizzato, tipizzato o non tipizzato.
Fortemente tipizzato è il Pascal o il C nella revisione ANSI: il compilatore rileva ogni espressione in cui i tipi sono incompatibili e la blocca. Un linguaggio fortemente tipizzato esegue molti controlli già in fase di compilazione, ma "lega le mani" al programmatore impedendo qualunque operazione che può sembrare scorretta.
Il C come è definito nel testo di Kernighan e Ritchie è un linguaggio che usa il tipo solo per definire la quantità di memoria necessaria a contenere una variabile, senza poi verificare le compatibilità di tipo in modo stretto. In C si possono creare programmi che mescolano i tipi, ottenendo prestazioni velocistiche notevoli, ma anche errori oscuri di difficile rilevazione.
Il dBASE è un linguaggio tipizzato nei campi, ma completamente libero per le variabili. Una variabile può contenere indifferentemente un numero o una stringa e addirittura può cambiare tipo durante la propria vita.
Se questo è molto comodo per il programmatore, rende impossibile una verifica formale dei programmi al momento della compilazione. La verifica di tipo viene demandata al momento di runtime, tanto che gli errori di tipo errato possono rivelarsi anche dopo molto tempo che il programma è in uso.
Per poter creare programmi strutturati conviene utilizzare un linguaggio tipizzato. Dividendo il programma in moduli, che possono essere sviluppati da più programmatori, si crea il problema della verifica e del coordinamento del lavoro svolto da ogni persona.
Un linguaggio fortemente tipizzato verifica automaticamente che tutti gli sviluppatori abbiano seguito le convenzioni stabilite in ogni parte del progetto. In particolare viene costantemente verificata l’interfaccia di ogni modulo, in quanto ogni parametro o variabile di collegamento appartiene ad un ben determinato tipo, e viene accettata solo quando è formalmente corretta.