Concetti Fondamentali sui Sistemi di Tipi nei Linguaggi di Programmazione
Classificato in Informatica
Scritto il in italiano con una dimensione di 5,91 KB
Introduzione: Cos'è un Tipo?
Il Tipo potrebbe essere definito come un insieme di termini di una lingua che hanno alcune caratteristiche in comune, il che permette loro di interagire o essere soggetti a modifiche applicate a loro in virtù di queste caratteristiche.
Il Sistema di Tipi
Definizione e Ruolo
Il Sistema di Tipi si compone della teoria di base di associare un tipo a ogni costrutto di un linguaggio dichiarativo.
Costruttori di Tipo
- Costruttori di tipo: strutture, unioni, oggetti
- Puntatori: i riferimenti di tipo
- Tipi somma (es.
()
in alcune lingue)
Verifica dei Tipi (Type Checking)
Ruolo dell'Analizzatore Semantico
Ogni analizzatore semantico implementa un sistema di tipi.
Verifica Statica vs Dinamica
- Compilazione: Verifica Statica
- Esecuzione: Verifica Dinamica
Verifica nelle Espressioni
La verifica dei tipi di dati nelle espressioni viene effettuata assegnando un tipo a ciascun componente lessicale (token) o espressione.
Questi tipi vengono confrontati per verificare che corrispondano e siano coerenti; altrimenti, non è possibile eseguire i calcoli o l'operazione.
Conversione di Tipo (Type Casting)
Necessità
Ci sono situazioni in cui si ha un valore di un certo tipo e si desidera memorizzare tale valore in una variabile di tipo diverso.
Conversione Automatica (Implicita)
Alcuni tipi permettono di memorizzare il valore senza un cast esplicito; questa è la cosiddetta conversione automatica (o implicita).
Questo è possibile in un linguaggio di programmazione se il compilatore riconosce che la variabile di destinazione ha precisione o capacità sufficiente per contenere il valore sorgente.
Ampliamento (Widening)
In Java, un valore di tipo byte
può essere memorizzato in una variabile di tipo int
, dato che quest'ultimo tipo di dati ha una capacità maggiore rispetto al primo.
Questo si chiama ampliamento o promozione (widening), poiché il tipo più piccolo viene 'allargato' o 'promosso' al tipo più grande.
Conversione Esplicita (Cast)
Se, invece, si vuole assegnare un valore da una variabile int
a una variabile byte
, è necessario eseguire una conversione di tipo esplicita.
Restringimento (Narrowing) e Perdita Dati
In alcuni casi, si può fare la conversione, ma si possono perdere dati, ad esempio convertendo un valore in virgola mobile (float
/double
) in un intero (int
).
Questo si chiama restringimento (narrowing), dal momento che si 'restringe' esplicitamente il valore per farlo rientrare nella destinazione.
Sintassi del Cast
La conversione esplicita di un tipo si fa specificando il nome del tipo di destinazione tra parentesi prima del valore, ad esempio (TipoDestinazione) valoreSorgente
.
Altri Controlli Semantici
Importanza
La verifica (o controllo) aiuta a prevenire la maggior parte dei bug.
Esempi di Controlli
- Controlli di tipo: Per verificare se gli operatori sono applicati correttamente agli operandi.
- Controlli del flusso di controllo: È necessario verificare che le istruzioni che modificano il flusso di un programma (es.
break
,goto
) siano valide. - Controlli di unicità: Ad esempio, verificare che un identificatore sia definito una sola volta in un determinato scope.
- Controlli sui nomi: Verificare che i nomi siano usati correttamente (es. variabili dichiarate ma non utilizzate).
Complessità del Controllo di Tipo
Il controllo del tipo è spesso più complicato; altri controlli sono più di routine.
Concetti Aggiuntivi e Implementazione
Regole del Sistema di Tipi
Le regole del sistema di tipi sono spesso progettate in modo che i valori numerici vengano convertiti automaticamente al tipo di livello superiore (es. int
a float
) o che un puntatore possa puntare solo al tipo di dati per cui è stato dichiarato.
Esempi Specifici
- L'operatore
%
(modulo) richiede che i due operandi siano interi. - L'operatore
+
(somma) è spesso sovraccaricato per operare su diversi tipi di dati (es. interi, float, stringhe). - Alcuni linguaggi controllano le dimensioni degli array in modo statico (es. Java in alcuni contesti), altri in modo dinamico (a runtime).
- Differenziare l'uso degli operatori
+
e*
con interi rispetto al loro uso con puntatori (aritmetica dei puntatori). - L'insieme di regole definite per il controllo dei tipi di dati viene chiamato sistema di tipi.
Recupero Errori di Tipo
Molto spesso il recupero degli errori di tipo (type error recovery) è omesso; il programma potrebbe non terminare, ma potrebbe produrre risultati inattesi o non desiderati.
Fase di Analisi e Strumenti
Di solito, durante la fase di analisi semantica (che include l'analisi dei tipi), le informazioni sui tipi vengono aggregate nella tabella dei simboli.
- Una revisione dell'albero sintattico astratto (AST) viene effettuata per verificare i tipi assegnati ai nodi.
Azioni tipiche aggiunte in un parser discendente (top-down) per l'analisi dei tipi.